async def test_options_flow(hass: HomeAssistant) -> None: """Test options config flow for climacell.""" user_config = _get_config_schema(hass)(MIN_CONFIG) entry = MockConfigEntry( domain=DOMAIN, data=user_config, source=SOURCE_USER, unique_id=_get_unique_id(hass, user_config), version=1, ) entry.add_to_hass(hass) await hass.config_entries.async_setup(entry.entry_id) assert entry.options[CONF_TIMESTEP] == DEFAULT_TIMESTEP assert CONF_TIMESTEP not in entry.data result = await hass.config_entries.options.async_init(entry.entry_id, data=None) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "init" result = await hass.config_entries.options.async_configure( result["flow_id"], user_input={CONF_TIMESTEP: 1}) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["title"] == "" assert result["data"][CONF_TIMESTEP] == 1 assert entry.options[CONF_TIMESTEP] == 1
async def test_load_and_unload( hass: HomeAssistantType, climacell_config_entry_update: pytest.fixture, ) -> None: """Test loading and unloading entry.""" config_entry = MockConfigEntry( domain=DOMAIN, data=_get_config_schema(hass)(MIN_CONFIG), unique_id=_get_unique_id(hass, _get_config_schema(hass)(MIN_CONFIG)), ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 1 assert await hass.config_entries.async_remove(config_entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 0
async def test_user_flow_same_unique_ids(hass: HomeAssistantType) -> None: """Test user config flow with the same unique ID as an existing entry.""" user_input = _get_config_schema(hass, MIN_CONFIG)(MIN_CONFIG) MockConfigEntry( domain=DOMAIN, data=user_input, source=SOURCE_USER, unique_id=_get_unique_id(hass, user_input), ).add_to_hass(hass) result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, data=user_input, ) assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == "already_configured"
async def test_v3_load_and_unload( hass: HomeAssistant, climacell_config_entry_update: pytest.fixture, ) -> None: """Test loading and unloading v3 entry.""" data = _get_config_schema(hass)(API_V3_ENTRY_DATA) config_entry = MockConfigEntry( domain=DOMAIN, data=data, unique_id=_get_unique_id(hass, data), version=1, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 1 assert await hass.config_entries.async_remove(config_entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 0
async def test_update_interval( hass: HomeAssistantType, climacell_config_entry_update: pytest.fixture, ) -> None: """Test that update_interval changes based on number of entries.""" now = dt_util.utcnow() async_fire_time_changed(hass, now) config = _get_config_schema(hass)(MIN_CONFIG) for i in range(1, 3): config_entry = MockConfigEntry(domain=DOMAIN, data=config, unique_id=_get_unique_id(hass, config) + str(i)) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() with patch("homeassistant.components.climacell.ClimaCell.realtime" ) as mock_api: # First entry refresh will happen in 7 minutes due to original update interval. # Next refresh for this entry will happen at 20 minutes due to the update interval # change. mock_api.return_value = {} async_fire_time_changed(hass, now + timedelta(minutes=7)) await hass.async_block_till_done() assert mock_api.call_count == 1 # Second entry refresh will happen in 13 minutes due to the update interval set # when it was set up. Next refresh for this entry will happen at 26 minutes due to the # update interval change. mock_api.reset_mock() async_fire_time_changed(hass, now + timedelta(minutes=13)) await hass.async_block_till_done() assert not mock_api.call_count == 1 # 19 minutes should be after the first update for each config entry and before the # second update for the first config entry mock_api.reset_mock() async_fire_time_changed(hass, now + timedelta(minutes=19)) await hass.async_block_till_done() assert not mock_api.call_count == 0
async def _setup(hass: HomeAssistant, sensors: list[str], config: dict[str, Any]) -> State: """Set up entry and return entity state.""" with patch( "homeassistant.util.dt.utcnow", return_value=datetime(2021, 3, 6, 23, 59, 59, tzinfo=dt_util.UTC), ): data = _get_config_schema(hass)(config) config_entry = MockConfigEntry( domain=DOMAIN, data=data, unique_id=_get_unique_id(hass, data), version=1, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() for entity_name in sensors: _enable_entity(hass, CC_SENSOR_ENTITY_ID.format(entity_name)) await hass.async_block_till_done() assert len(hass.states.async_entity_ids(SENSOR_DOMAIN)) == len(sensors)
async def test_migrate_timestep( hass: HomeAssistant, climacell_config_entry_update: pytest.fixture, old_timestep: int, new_timestep: int, ) -> None: """Test migration to standardized timestep.""" config_entry = MockConfigEntry( domain=DOMAIN, data=V1_ENTRY_DATA, options={CONF_TIMESTEP: old_timestep}, unique_id=_get_unique_id(hass, V1_ENTRY_DATA), version=1, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() assert config_entry.version == 1 assert (CONF_API_VERSION in config_entry.data and config_entry.data[CONF_API_VERSION] == 3) assert config_entry.options[CONF_TIMESTEP] == new_timestep
async def _setup(hass: HomeAssistant, config: dict[str, Any]) -> State: """Set up entry and return entity state.""" with patch( "homeassistant.util.dt.utcnow", return_value=datetime(2021, 3, 6, 23, 59, 59, tzinfo=dt_util.UTC), ): data = _get_config_schema(hass)(config) config_entry = MockConfigEntry( domain=DOMAIN, data=data, unique_id=_get_unique_id(hass, data), version=1, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() for entity_name in ("hourly", "nowcast"): _enable_entity(hass, f"weather.climacell_{entity_name}") await hass.async_block_till_done() assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 3 return hass.states.get("weather.climacell_daily")
async def _setup(hass: HomeAssistant, config: dict[str, Any]) -> State: """Set up entry and return entity state.""" with patch( "homeassistant.util.dt.utcnow", return_value=datetime(2021, 3, 6, 23, 59, 59, tzinfo=dt_util.UTC), ): data = _get_config_schema(hass)(config) config_entry = MockConfigEntry( domain=DOMAIN, data=data, unique_id=_get_unique_id(hass, data), version=1, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() for entity_name in ( O3, CO, NO2, SO2, PM25, PM10, MEP_AQI, MEP_HEALTH_CONCERN, MEP_PRIMARY_POLLUTANT, EPA_AQI, EPA_HEALTH_CONCERN, EPA_PRIMARY_POLLUTANT, FIRE_INDEX, GRASS_POLLEN, WEED_POLLEN, TREE_POLLEN, ): _enable_entity(hass, CC_SENSOR_ENTITY_ID.format(entity_name)) await hass.async_block_till_done() assert len(hass.states.async_entity_ids(SENSOR_DOMAIN)) == 16