File: test_websocket.py

package info (click to toggle)
devolo-home-control-api 0.19.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 804 kB
  • sloc: python: 3,167; makefile: 3
file content (78 lines) | stat: -rw-r--r-- 3,210 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
"""Test interacting with the websocket."""
import logging
from unittest.mock import patch

import pytest
import requests
from requests_mock import Mocker

from devolo_home_control_api.exceptions import GatewayOfflineError
from devolo_home_control_api.homecontrol import HomeControl
from devolo_home_control_api.mydevolo import Mydevolo

from . import load_fixture
from .mocks import WEBSOCKET


def test_setup_websocket_broken(mydevolo: Mydevolo, gateway_id: str, gateway_ip: str, requests_mock: Mocker) -> None:
    """Test setup failure when websocket cannot be established."""
    connection = load_fixture("homecontrol_local_session")
    connection["link"] = f"http://{gateway_ip}/dhlp/portal/full/?token=54e8c82fc921ee7e&"
    requests_mock.get(f"http://{gateway_ip}/dhlp/port/full")
    requests_mock.get(f"http://{gateway_ip}/dhlp/portal/full", json=connection)
    requests_mock.get(connection["link"])
    requests_mock.post(
        f"http://{gateway_ip}/remote/json-rpc",
        [
            {"json": load_fixture("homecontrol_zones")},
            {"json": load_fixture("homecontrol_device_page")},
            {"json": load_fixture("homecontrol_devices")},
            {"json": load_fixture("homecontrol_device_details")},
        ],
    )
    with patch(
        "devolo_home_control_api.backend.mprm_websocket.time", side_effect=[1682620298.7491188, 1682620898.7491188]
    ), patch("devolo_home_control_api.backend.mprm_websocket.MprmWebsocket.websocket_connect"), pytest.raises(
        GatewayOfflineError
    ):
        HomeControl(gateway_id, mydevolo)


def test_websocket_breakdown(local_gateway: HomeControl) -> None:
    """Test reconnect behavior on websocket breakdown."""
    with patch(
        "devolo_home_control_api.backend.mprm_websocket.MprmWebsocket.websocket_connect",
        wraps=local_gateway.websocket_connect,
    ) as websocket_connect, patch(
        "devolo_home_control_api.backend.mprm.Mprm.get_local_session",
        side_effect=[GatewayOfflineError, requests.exceptions.ConnectTimeout, True],
    ) as get_local_session, patch(
        "devolo_home_control_api.backend.mprm.Mprm.detect_gateway_in_lan",
    ) as detect_gateway_in_lan, patch(
        "devolo_home_control_api.backend.mprm_websocket.sleep",
    ):
        WEBSOCKET.error()
        assert get_local_session.call_count == 3
        websocket_connect.assert_called_once()
        detect_gateway_in_lan.assert_called_once()


@pytest.mark.usefixtures("local_gateway")
def test_websocket_closed(caplog: pytest.LogCaptureFixture) -> None:
    """Test reveiving a close message."""
    caplog.set_level(logging.INFO)
    WEBSOCKET.close()
    assert "Closed websocket connection." in caplog.messages


@pytest.mark.usefixtures("local_gateway")
def test_websocket_session_refresh() -> None:
    """Test refreshing the session from time to time."""
    with patch("devolo_home_control_api.backend.mprm_rest.MprmRest._post") as post:
        WEBSOCKET.recv_pong()
        post.assert_called_once_with(
            {
                "method": "FIM/invokeOperation",
                "params": ["devolo.UserPrefs.535512AB-165D-11E7-A4E2-000C29D76CCA", "resetSessionTimeout", []],
            }
        )