67 lines
2.6 KiB
Python
67 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
import json
|
|
import tempfile
|
|
import threading
|
|
import urllib.request
|
|
from pathlib import Path
|
|
from led_panel import Handler, ThreadingHTTPServer
|
|
import led_panel
|
|
|
|
|
|
def req(port, path, body=None):
|
|
data = None
|
|
headers = {}
|
|
if body is not None:
|
|
data = json.dumps(body).encode()
|
|
headers['Content-Type'] = 'application/json'
|
|
r = urllib.request.Request(f'http://127.0.0.1:{port}{path}', data=data, headers=headers)
|
|
with urllib.request.urlopen(r, timeout=5) as resp:
|
|
return json.loads(resp.read().decode())
|
|
|
|
|
|
def main():
|
|
with tempfile.TemporaryDirectory() as td:
|
|
root = Path(td)
|
|
d = root / 'blue:wan'
|
|
d.mkdir()
|
|
(d / 'brightness').write_text('0')
|
|
(d / 'max_brightness').write_text('1')
|
|
(d / 'trigger').write_text('[none] timer')
|
|
(d / 'delay_on').write_text('500')
|
|
(d / 'delay_off').write_text('500')
|
|
config_path = root / 'config.json'
|
|
led_panel.LED_ROOT = root
|
|
led_panel.CONFIG_PATH = config_path
|
|
httpd = ThreadingHTTPServer(('127.0.0.1', 0), Handler)
|
|
port = httpd.server_address[1]
|
|
t = threading.Thread(target=httpd.serve_forever, daemon=True)
|
|
t.start()
|
|
try:
|
|
leds = req(port, '/api/leds')
|
|
assert leds['ok'] and leds['leds'][0]['name'] == 'blue:wan'
|
|
b = req(port, '/api/brightness', {'name':'blue:wan','value':1})
|
|
assert b['ok'] and (d / 'brightness').read_text() == '1'
|
|
tr = req(port, '/api/trigger', {'name':'blue:wan','trigger':'timer'})
|
|
assert tr['ok']
|
|
assert (d / 'trigger').read_text() == 'timer'
|
|
delay = req(port, '/api/delay', {'name':'blue:wan','field':'delay_on','value':123})
|
|
assert delay['ok'] and (d / 'delay_on').read_text() == '123'
|
|
saved = req(port, '/api/save', {'name':'blue:wan'})
|
|
assert saved['ok'] and config_path.exists()
|
|
cfg = json.loads(config_path.read_text())
|
|
assert cfg['leds']['blue:wan']['delay_on'] == 123
|
|
# Simulate reboot/default reset, then apply persisted config.
|
|
(d / 'brightness').write_text('0')
|
|
(d / 'trigger').write_text('[none] timer')
|
|
(d / 'delay_on').write_text('500')
|
|
applied = req(port, '/api/apply-saved', {})
|
|
assert applied['ok'] and applied['applied'] == 1
|
|
assert (d / 'brightness').read_text() == '1'
|
|
assert (d / 'delay_on').read_text() == '123'
|
|
print('OK: API write + persistence regression passed')
|
|
finally:
|
|
httpd.shutdown()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|