from types import SimpleNamespace from app.auto.controller import AutoController class FakeQingpingService: def __init__( self, online: bool, temperature, ): self.online = online self.state = SimpleNamespace( temperature=temperature, ) class FakeTionService: def __init__( self, online: bool, in_temp, ): self.online = online self.state = SimpleNamespace( in_temp=in_temp, ) def make_controller( *, qingping_online: bool, qingping_temperature, tion_online: bool, tion_temperature, ): qingping = FakeQingpingService( online=qingping_online, temperature=qingping_temperature, ) tion = FakeTionService( online=tion_online, in_temp=tion_temperature, ) return AutoController( schedule_service=None, qingping_service=qingping, tion_service=tion, ) def test_qingping_priority(): controller = make_controller( qingping_online=True, qingping_temperature=19.7, tion_online=True, tion_temperature=18, ) temperature, source = ( controller._get_temperature() ) assert temperature == 19.7 assert source == "qingping" def test_tion_fallback(): controller = make_controller( qingping_online=False, qingping_temperature=19.7, tion_online=True, tion_temperature=18, ) temperature, source = ( controller._get_temperature() ) assert temperature == 18 assert source == "tion" def test_tion_fallback_when_qingping_temperature_missing(): controller = make_controller( qingping_online=True, qingping_temperature=None, tion_online=True, tion_temperature=18, ) temperature, source = ( controller._get_temperature() ) assert temperature == 18 assert source == "tion" def test_offline_tion_is_not_used(): controller = make_controller( qingping_online=False, qingping_temperature=None, tion_online=False, # Значение специально оставляем. # Оно имитирует старый state Tion. tion_temperature=18, ) temperature, source = ( controller._get_temperature() ) assert temperature is None assert source is None def test_missing_tion_temperature(): controller = make_controller( qingping_online=False, qingping_temperature=None, tion_online=True, tion_temperature=None, ) temperature, source = ( controller._get_temperature() ) assert temperature is None assert source is None def main(): test_qingping_priority() test_tion_fallback() test_tion_fallback_when_qingping_temperature_missing() test_offline_tion_is_not_used() test_missing_tion_temperature() print() print("=" * 70) print( "ALL AUTO TEMPERATURE SOURCE " "TESTS PASSED" ) print("=" * 70) if __name__ == "__main__": main()