Files
pigway-frame-flow/tests/test_official_connection.py

72 lines
2.6 KiB
Python

import json
import stat
from unittest.mock import Mock, patch
from pigway_frame_flow.api.app import create_app
PATH = "/api/v1/devices/living-room/official/connection"
def test_connect_select_persist_and_disconnect(client, settings):
response = client.post(
PATH, json={"username": "official-user", "password": "not-saved"}
)
assert response.status_code == 200
assert response.json()["robot_id"] is None
assert response.json()["devices"][0]["id"] == 1
assert "token" not in response.text and "not-saved" not in response.text
path = settings.config_dir / "official-living-room.secret"
assert stat.S_IMODE(path.stat().st_mode) == 0o600
assert "not-saved" not in path.read_text()
assert client.put(PATH, json={"robot_id": 1}).status_code == 200
assert client.put(PATH, json={"robot_id": 999}).status_code == 404
restored = create_app(settings, start_worker=False).state.service.registry
assert restored.official["living-room"].state().robot_id == 1
assert client.delete(PATH).status_code == 200
assert json.loads(path.read_text())["token"] == ""
assert not client.get(PATH).json()["authorized"]
def test_auth_and_validation_hide_password(client):
response = client.post(PATH, json={"username": "", "password": "secret-password"})
assert response.status_code == 422 and "secret-password" not in response.text
client.headers.clear()
assert (
client.post(PATH, json={"username": "user", "password": "secret"}).status_code
== 401
)
def test_live_connection_only_login_and_read_methods(settings):
from pigway_frame_flow.integrations.kokonna_official.connection import Connection
from pigway_frame_flow.integrations.kokonna_official.widgets import WidgetReader
login = Mock(status_code=200)
login.json.return_value = {"result": {"token": "official-secret"}}
devices = Mock(status_code=200)
devices.json.return_value = {
"result": {
"data": [
{
"id": 10,
"robotNickname": "Frame",
"model": {"code": "B101", "name": "13.3-inch"},
}
]
}
}
conn = Connection(
WidgetReader(),
settings.config_dir / "official-test.secret",
settings.additional_secrets,
)
with patch("requests.post", side_effect=[login, devices, devices]) as post:
conn.login("user", "password")
conn.select(10)
assert [c.kwargs["json"]["method"] for c in post.call_args_list] == [
"app.login",
"app.getRobots",
"app.getRobots",
]
assert "official-secret" not in conn.state().model_dump_json()