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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
"""Tests for set_hot_water_schedule method."""
# pylint: disable=duplicate-code
# pylint: disable=protected-access
# file deepcode ignore W0212: this is a testfile
from __future__ import annotations
from datetime import time
from typing import TYPE_CHECKING
from unittest.mock import AsyncMock
import pytest
from bsblan.exceptions import BSBLANError
from bsblan.models import DaySchedule, DHWSchedule, TimeSlot
if TYPE_CHECKING:
from bsblan import BSBLAN
@pytest.mark.asyncio
async def test_set_hot_water_schedule_single_day(mock_bsblan: BSBLAN) -> None:
"""Test setting hot water schedule for a single day.
Args:
mock_bsblan: The mock BSBLAN instance.
"""
schedule = DHWSchedule(
monday=DaySchedule(
slots=[
TimeSlot(time(6, 0), time(8, 0)),
TimeSlot(time(17, 0), time(21, 0)),
]
)
)
assert isinstance(mock_bsblan._request, AsyncMock)
await mock_bsblan.set_hot_water_schedule(schedule)
# Verify the request was made correctly for Monday (param 561)
mock_bsblan._request.assert_awaited_with(
base_path="/JS",
data={
"Parameter": "561",
"Value": "06:00-08:00 17:00-21:00",
"Type": "1",
},
)
@pytest.mark.asyncio
async def test_set_hot_water_schedule_multiple_days(mock_bsblan: BSBLAN) -> None:
"""Test setting hot water schedule for multiple days.
Args:
mock_bsblan: The mock BSBLAN instance.
"""
schedule = DHWSchedule(
monday=DaySchedule(slots=[TimeSlot(time(6, 0), time(8, 0))]),
friday=DaySchedule(slots=[TimeSlot(time(7, 0), time(9, 0))]),
)
assert isinstance(mock_bsblan._request, AsyncMock)
await mock_bsblan.set_hot_water_schedule(schedule)
# Should have been called twice (once for Monday, once for Friday)
assert mock_bsblan._request.await_count == 2
@pytest.mark.asyncio
async def test_set_hot_water_schedule_all_days(mock_bsblan: BSBLAN) -> None:
"""Test setting hot water schedule for all days.
Args:
mock_bsblan: The mock BSBLAN instance.
"""
day = DaySchedule(slots=[TimeSlot(time(6, 0), time(8, 0))])
schedule = DHWSchedule(
monday=day,
tuesday=day,
wednesday=day,
thursday=day,
friday=day,
saturday=day,
sunday=day,
)
assert isinstance(mock_bsblan._request, AsyncMock)
await mock_bsblan.set_hot_water_schedule(schedule)
# Should have been called 7 times (once for each day)
assert mock_bsblan._request.await_count == 7
@pytest.mark.asyncio
async def test_set_hot_water_schedule_empty_raises_error(
mock_bsblan: BSBLAN,
) -> None:
"""Test that empty schedule raises BSBLANError.
Args:
mock_bsblan: The mock BSBLAN instance.
"""
schedule = DHWSchedule()
with pytest.raises(BSBLANError, match="No schedule provided"):
await mock_bsblan.set_hot_water_schedule(schedule)
@pytest.mark.asyncio
async def test_set_hot_water_schedule_parameter_ids(mock_bsblan: BSBLAN) -> None:
"""Test that correct parameter IDs are used for each day.
Args:
mock_bsblan: The mock BSBLAN instance.
"""
# Expected parameter IDs for each day
expected_params = {
"monday": "561",
"tuesday": "562",
"wednesday": "563",
"thursday": "564",
"friday": "565",
"saturday": "566",
"sunday": "567",
}
for day_name, param_id in expected_params.items():
# Reset mock
assert isinstance(mock_bsblan._request, AsyncMock)
mock_bsblan._request.reset_mock()
# Create schedule with only this day
schedule = DHWSchedule(
**{day_name: DaySchedule(slots=[TimeSlot(time(6, 0), time(8, 0))])}
)
await mock_bsblan.set_hot_water_schedule(schedule)
# Verify correct parameter ID was used
call_args = mock_bsblan._request.call_args
assert call_args is not None
assert call_args.kwargs["data"]["Parameter"] == param_id
@pytest.mark.asyncio
async def test_set_hot_water_schedule_empty_day_schedule(
mock_bsblan: BSBLAN,
) -> None:
"""Test setting an empty day schedule (clears the schedule).
Args:
mock_bsblan: The mock BSBLAN instance.
"""
schedule = DHWSchedule(monday=DaySchedule(slots=[]))
assert isinstance(mock_bsblan._request, AsyncMock)
await mock_bsblan.set_hot_water_schedule(schedule)
# Should send empty string as value
mock_bsblan._request.assert_awaited_with(
base_path="/JS",
data={
"Parameter": "561",
"Value": "",
"Type": "1",
},
)
|