11"""Global fixtures for tapo integration."""
22
3+ from dataclasses import dataclass
34import json
45from unittest .mock import AsyncMock , MagicMock , patch
56
7+ from homeassistant .config_entries import ConfigEntry
68from homeassistant .const import CONF_SCAN_INTERVAL
79from homeassistant .core import HomeAssistant
810from homeassistant .helpers import device_registry as dr
911from homeassistant .setup import async_setup_component
1012from plugp100 .api .light_effect_preset import LightEffectPreset
1113from plugp100 .common .functional .tri import Success , Try
12- from plugp100 .discovery .discovered_device import DiscoveredDevice
13- from plugp100 .new .child .tapostripsocket import TapoStripSocket
14- from plugp100 .new .components .energy_component import EnergyComponent
15- from plugp100 .new .components .light_component import HS , LightComponent
16- from plugp100 .new .components .light_effect_component import LightEffectComponent
17- from plugp100 .new .components .overheat_component import OverheatComponent
18- from plugp100 .new .tapobulb import TapoBulb
19- from plugp100 .new .tapodevice import TapoDevice
20- from plugp100 .new .tapohub import TapoHub
21- from plugp100 .new .tapoplug import TapoPlug
22- from plugp100 .responses .alarm_type_list import AlarmTypeList
23- from plugp100 .responses .components import Components
14+ from plugp100 .components .energy import EnergyComponent
15+ from plugp100 .components .light_effect import LightEffectComponent
16+ from plugp100 .components .overheat import OverheatComponent
17+ from plugp100 .devices .base import TapoDevice
18+ from plugp100 .devices .bulb import TapoBulb
19+ from plugp100 .devices .children .strip_socket import TapoStripSocket
20+ from plugp100 .devices .hub import TapoHub
21+ from plugp100 .devices .plug import TapoPlug
22+ from plugp100 .discovery import DiscoveredDevice
2423import pytest
2524from pytest_homeassistant_custom_component .common import MockConfigEntry , load_fixture
2625
2726from custom_components .tapo .const import CONF_HOST , CONF_PASSWORD , CONF_USERNAME , DOMAIN
2827
2928pytest_plugins = ("pytest_homeassistant_custom_component" ,)
3029
30+
31+ @dataclass
32+ class HS :
33+ hue : float
34+ saturation : float
35+
36+
37+ class LightComponent :
38+ def __init__ (self , * _args , ** _kwargs ) -> None :
39+ pass
40+
41+
42+ class AlarmTypeList (list ):
43+ @property
44+ def tones (self ):
45+ return list (self )
46+
47+
48+ class Components :
49+ def __init__ (self , component_list : list [dict [str , int ]]) -> None :
50+ self .component_list = [component ["id" ] for component in component_list ]
51+ self ._versions = {
52+ component ["id" ]: component ["ver_code" ] for component in component_list
53+ }
54+
55+ def get_version (self , component : str ) -> int :
56+ return self ._versions [component ]
57+
58+ @classmethod
59+ def try_from_json (cls , payload : dict [str , list [dict [str , int ]]]) -> "Components" :
60+ return cls (payload ["component_list" ])
61+
62+
3163IP_ADDRESS = "1.2.3.4"
3264MAC_ADDRESS = "1a:22:33:b4:c5:66"
3365
@@ -42,30 +74,33 @@ def expected_lingering_tasks() -> bool:
4274 return True
4375
4476
77+ @pytest .fixture (autouse = True )
78+ def disable_background_discovery ():
79+ with patch (
80+ "custom_components.tapo.discovery_tapo_devices" ,
81+ AsyncMock (return_value = {}),
82+ ):
83+ yield
84+
85+
4586@pytest .fixture ()
4687def mock_discovery ():
4788 discovered_device = mock_discovered_device ()
4889 device = _mock_base_device (MagicMock (auto_spec = TapoDevice ))
4990 with patch (
50- "custom_components.tapo.discovery_tapo_devices " ,
51- AsyncMock (return_value = { device . mac : discovered_device } ),
91+ "custom_components.tapo.config_flow.connect_discovered_device " ,
92+ AsyncMock (return_value = device ),
5293 ):
53- with patch .object (
54- discovered_device ,
55- "get_tapo_device" ,
56- side_effect = AsyncMock (return_value = device ),
94+ with patch (
95+ "custom_components.tapo.hass_tapo.connect_discovered_device" ,
96+ AsyncMock (return_value = device ),
5797 ):
58- with patch (
59- "plugp100.discovery.discovered_device.DiscoveredDevice.get_tapo_device" ,
60- side_effect = AsyncMock (return_value = device ),
61- ):
62- yield discovered_device
98+ yield discovered_device
6399
64100
65101async def setup_platform (
66102 hass : HomeAssistant , device : TapoDevice , platforms : list [str ]
67103) -> MockConfigEntry :
68- hass .config .components .add (DOMAIN )
69104 await device .update ()
70105 config_entry = MockConfigEntry (
71106 domain = DOMAIN ,
@@ -79,19 +114,35 @@ async def setup_platform(
79114 unique_id = dr .format_mac (device .mac ),
80115 )
81116 config_entry .add_to_hass (hass )
117+
118+ original_forward = hass .config_entries .async_forward_entry_setups
119+
120+ async def _forward_only_requested (
121+ entry : ConfigEntry , _platforms : list [str ]
122+ ) -> bool :
123+ return await original_forward (entry , platforms )
124+
82125 with patch (
83126 "custom_components.tapo.hass_tapo.connect" , AsyncMock (return_value = device )
84127 ):
85- with patch .object (hass .config_entries , "async_forward_entry_setup" ):
86- assert await hass .config_entries .async_setup (config_entry .entry_id ) is True
87- assert await async_setup_component (hass , DOMAIN , {}) is True
88- await hass .async_block_till_done ()
89-
90- for platform in platforms :
91- assert await hass .config_entries .async_forward_entry_setup (
92- config_entry , platform
93- )
94- await hass .async_block_till_done ()
128+ with patch (
129+ "custom_components.tapo.discovery_tapo_devices" ,
130+ AsyncMock (return_value = {}),
131+ ):
132+ with patch .object (
133+ hass .config_entries ,
134+ "async_forward_entry_setups" ,
135+ side_effect = _forward_only_requested ,
136+ ):
137+ assert (
138+ await async_setup_component (
139+ hass ,
140+ DOMAIN ,
141+ {DOMAIN : {"discovery" : False }},
142+ )
143+ is True
144+ )
145+ await hass .async_block_till_done ()
95146
96147 return config_entry
97148
0 commit comments