Add working GET /config to the API

This commit is contained in:
Pedro 2023-11-06 15:36:11 +01:00
parent 2a954830ce
commit 25a1e3b495
5 changed files with 51 additions and 42 deletions

View file

@ -137,15 +137,14 @@ class CONFIG:
self.log.error("[CFG] reading logfile", e=conferror)
def read_config(self):
def read(self):
"""
read config file
"""
if self.config_exists():
#print(self.config.read(self.config_name))
#print(self.config.sections())
if not self.config_exists():
return False
return self.config
return {s:dict(self.config.items(s)) for s in self.config.sections()}
def get(self, area, key, default):
"""

View file

@ -1,20 +1,28 @@
from flask import Flask, request, jsonify
from flask_sock import Sock
import argparse, json
import os
import json
from config import CONFIG
app = Flask(__name__)
sock = Sock(app)
# CLI arguments
def get_config_filename_from_args():
parser = argparse.ArgumentParser()
parser.add_argument("-c", "--config", help = "Specifiy config file", default = 'config.ini')
args, unknown = parser.parse_known_args()
return args.config
# set config file to use
def set_config():
if 'FREEDATA_CONFIG' in os.environ:
config_file = os.environ['FREEDATA_CONFIG']
else:
config_file = 'config.ini'
config = CONFIG(get_config_filename_from_args())
if os.path.exists(config_file):
print("Using config from %s" % config_file)
else:
print("Config file '%s' not found. Exiting." % config_file)
exit(1)
app.config_manager = CONFIG(config_file)
# returns a standard API response
def api_response(data, status = 'ok'):
response = {
'status': status,
@ -22,10 +30,12 @@ def api_response(data, status = 'ok'):
}
return jsonify(response)
set_config()
## REST API
@app.route('/', methods=['GET'])
def index():
return jsonify({'name': 'FreeDATA API',
return api_response({'name': 'FreeDATA API',
'description': '',
'api_version': 1,
'license': 'GPL3.0',
@ -44,28 +54,8 @@ def config():
response = api_response(set_config)
return response
elif request.method == 'GET':
return api_response(config.read())
return api_response(app.config_manager.read())
# get activity
@app.route('/activity', methods=['GET'])
def activity():
return "Not implemented yet."
# get received messages
@app.route('/messages', methods=['GET'])
def messages():
return "Not implemented yet."
# new message / delete message
""" @app.route('/message', methods=['POST', 'DELETE'])
def message():
if request.method == 'POST':
message = new Message(request.form['message'])
status = modem.send_message(message)
elif request.method == 'DELETE':
status = messageDb.deleteMessage(request.form['id'])
return status
"""
# Event websocket
@sock.route('/events')
def echo(sock):

View file

@ -1,11 +1,11 @@
import unittest
from subprocess import Popen, PIPE
import shlex
import shlex, os
import requests
import time
import json
class TestConfigAPI(unittest.TestCase):
# API Server integration testst
class TestIntegration(unittest.TestCase):
process = None
url = "http://127.0.0.1:5000"
@ -13,22 +13,39 @@ class TestConfigAPI(unittest.TestCase):
@classmethod
def setUpClass(cls):
cmd = "flask --app modem/server run"
cls.process = Popen(shlex.split(cmd), stdin=PIPE)
my_env = os.environ.copy()
my_env["FREEDATA_CONFIG"] = "modem/config.ini"
cls.process = Popen(shlex.split(cmd), stdin=PIPE, env=my_env)
time.sleep(1)
@classmethod
def tearDownClass(cls):
cls.process.stdin.close()
cls.process.terminate()
if cls.process.wait() != 0:
print("There were some errors closing the process.")
cls.process.wait()
def test_index(self):
r = requests.get(self.url)
self.assertEqual(r.status_code, 200)
data = r.json()
self.assertEqual(data['api_version'], 1)
self.assertEqual(data['data']['api_version'], 1)
def test_config(self):
r = requests.get(self.url + '/config')
self.assertEqual(r.status_code, 200)
payload = r.json()
self.assertIn('data', payload)
self.assertIn('status', payload)
config = payload['data']
self.assertIsInstance(config, dict)
self.assertIn('NETWORK', config)
self.assertIn('STATION', config)
self.assertIn('AUDIO', config)
self.assertIn('Modem', config)
if __name__ == '__main__':

2
tools/run-server.sh Executable file
View file

@ -0,0 +1,2 @@
flask --app modem/server run

1
tools/run-tests.sh Executable file
View file

@ -0,0 +1 @@
python -m unittest discover tests