diff --git a/pico-dashboard/comms/http_client.py b/pico-dashboard/comms/http_client.py index e69de29..0cc45d0 100644 --- a/pico-dashboard/comms/http_client.py +++ b/pico-dashboard/comms/http_client.py @@ -0,0 +1,16 @@ +import json + + +class HttpClient: + def __init__(self, requests_module, base_url="http://192.168.4.1"): + self.requests = requests_module + self.base_url = base_url.rstrip("/") + + def get_status(self): + response = self.requests.get(f"{self.base_url}/status") + return response.json() + + def set_relay(self, relay, enabled): + state = "on" if enabled else "off" + response = self.requests.get(f"{self.base_url}/relay/{relay}/{state}") + return response.json() diff --git a/tests/test_pico_core.py b/tests/test_pico_core.py index 53943b7..389e61b 100644 --- a/tests/test_pico_core.py +++ b/tests/test_pico_core.py @@ -228,3 +228,66 @@ def test_communication_service_records_errors(): service.poll() assert state.last_error["message"] == "invalid_json" + + +class FakeResponse: + def __init__(self, payload): + self.payload = payload + + def json(self): + return self.payload + + +class FakeRequests: + def __init__(self): + self.urls = [] + self.responses = [] + + def get(self, url): + self.urls.append(url) + + if self.responses: + return FakeResponse(self.responses.pop(0)) + + return FakeResponse({"ok": True}) + + +def test_http_client_get_status(): + from comms.http_client import HttpClient + + fake_requests = FakeRequests() + fake_requests.responses = [ + {"type": "status_response", "battery": {"soc": 82}} + ] + + client = HttpClient(fake_requests) + + payload = client.get_status() + + assert fake_requests.urls == ["http://192.168.4.1/status"] + assert payload["type"] == "status_response" + assert payload["battery"]["soc"] == 82 + + +def test_http_client_set_relay_on(): + from comms.http_client import HttpClient + + fake_requests = FakeRequests() + client = HttpClient(fake_requests) + + payload = client.set_relay("starlink", True) + + assert fake_requests.urls == ["http://192.168.4.1/relay/starlink/on"] + assert payload == {"ok": True} + + +def test_http_client_set_relay_off(): + from comms.http_client import HttpClient + + fake_requests = FakeRequests() + client = HttpClient(fake_requests) + + payload = client.set_relay("fridge", False) + + assert fake_requests.urls == ["http://192.168.4.1/relay/fridge/off"] + assert payload == {"ok": True}