File: test_hotwater_state.py

package info (click to toggle)
python-bsblan 2.2.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 784 kB
  • sloc: python: 2,890; makefile: 3
file content (121 lines) | stat: -rw-r--r-- 4,600 bytes parent folder | download
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
"""Tests for retrieving hotwater information from the BSBLAN device."""

# pylint: disable=duplicate-code
# pylint: disable=protected-access
# file deepcode ignore W0212: this is a testfile

import json
from typing import Any
from unittest.mock import AsyncMock

import aiohttp
import pytest

from bsblan import BSBLAN, BSBLANConfig, HotWaterState
from bsblan.constants import API_V3
from bsblan.utility import APIValidator

from . import load_fixture


@pytest.mark.asyncio
async def test_hot_water_state(
    monkeypatch: Any,
) -> None:
    """Test getting BSBLAN hot water state."""
    # Set environment variable
    async with aiohttp.ClientSession() as session:
        config = BSBLANConfig(host="example.com")
        bsblan = BSBLAN(config, session=session)

        monkeypatch.setattr(bsblan, "_firmware_version", "1.0.38-20200730234859")
        monkeypatch.setattr(bsblan, "_api_version", "v3")

        # Create a modified API_V3 excluding the time switch parameters
        test_api_v3 = {
            "heating": API_V3["heating"].copy(),
            "staticValues": API_V3["staticValues"].copy(),
            "device": API_V3["device"].copy(),
            "sensor": API_V3["sensor"].copy(),
            "hot_water": {
                k: v
                for k, v in API_V3["hot_water"].items()
                if k not in ["561", "562", "563", "564", "565", "566", "567", "576"]
            },
        }

        monkeypatch.setattr(bsblan, "_api_data", test_api_v3)

        api_validator = APIValidator(test_api_v3)
        api_validator.validated_sections.add("hot_water")
        bsblan._api_validator = api_validator

        # Mock the request response
        request_mock = AsyncMock(
            return_value=json.loads(load_fixture("hot_water_state.json")),
        )
        monkeypatch.setattr(bsblan, "_request", request_mock)

        hot_water_state: HotWaterState = await bsblan.hot_water_state()

        # Assertions for existing parameters
        assert isinstance(hot_water_state, HotWaterState)
        assert hot_water_state.operating_mode is not None
        assert hot_water_state.operating_mode.value == 1
        assert hot_water_state.nominal_setpoint is not None
        assert hot_water_state.nominal_setpoint.value == 50.0
        assert hot_water_state.nominal_setpoint_max is not None
        assert hot_water_state.nominal_setpoint_max.value == 65.0
        assert hot_water_state.reduced_setpoint is not None
        assert hot_water_state.reduced_setpoint.value == 10.0

        # Assertions for new parameters
        assert hot_water_state.eco_mode_selection is not None
        assert hot_water_state.eco_mode_selection.value == 0
        assert hot_water_state.dhw_charging_priority is not None
        assert hot_water_state.dhw_charging_priority.value == 0
        assert hot_water_state.legionella_dwelling_time is not None
        assert hot_water_state.legionella_dwelling_time.value == 10
        assert hot_water_state.legionella_circulation_pump is not None
        assert hot_water_state.legionella_circulation_pump.value == 0
        assert hot_water_state.legionella_circulation_temp_diff is not None
        assert hot_water_state.legionella_circulation_temp_diff.value == 5.0
        assert hot_water_state.dhw_circulation_pump_release is not None
        assert hot_water_state.dhw_circulation_pump_release.value == 1
        assert hot_water_state.dhw_circulation_pump_cycling is not None
        assert hot_water_state.dhw_circulation_pump_cycling.value == 5
        assert hot_water_state.dhw_circulation_setpoint is not None
        assert hot_water_state.dhw_circulation_setpoint.value == 45.0
        assert hot_water_state.operating_mode_changeover is not None
        assert hot_water_state.operating_mode_changeover.value == 0

        # The Parameter string in the request should include all parameters
        request_mock.assert_called_once()
        params = request_mock.call_args[1]["params"]["Parameter"].split(",")

        # Check that new parameters are included in the request
        expected_params = [
            "1600",
            "1601",
            "1610",
            "1614",
            "1612",
            "1620",
            "1630",
            "1640",
            "1645",
            "1641",
            "1642",
            "1644",
            "1646",
            "1647",
            "1648",
            "1660",
            "1661",
            "1663",
            "1680",
            "8830",
            "8820",
        ]
        for param in expected_params:
            assert param in params