# pylint: disable=unused-argument, line-too-long """ Test the Versatile Thermostat config flow """ from homeassistant import data_entry_flow from homeassistant.core import HomeAssistant from homeassistant.config_entries import SOURCE_USER, ConfigEntry from custom_components.versatile_thermostat.const import DOMAIN from .commons import * # pylint: disable=wildcard-import, unused-wildcard-import from .const import * # pylint: disable=wildcard-import, unused-wildcard-import @pytest.mark.parametrize("expected_lingering_tasks", [True]) @pytest.mark.parametrize("expected_lingering_timers", [True]) async def test_show_form(hass: HomeAssistant, init_vtherm_api) -> None: """Test that the form is served with no input""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == SOURCE_USER @pytest.mark.parametrize("expected_lingering_tasks", [True]) @pytest.mark.parametrize("expected_lingering_timers", [True]) # Disable this test which don't work anymore (kill the pytest !) @pytest.mark.skip async def test_user_config_flow_over_switch( hass: HomeAssistant, skip_hass_states_get, init_central_config ): # pylint: disable=unused-argument """Test the config flow with all thermostat_over_switch features and central config on""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == SOURCE_USER result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_SWITCH_USER_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "main" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_SWITCH_MAIN_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "type" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_SWITCH_TYPE_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "tpi" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_TPI_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "presets" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_PRESETS_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "window" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_WINDOW_SENSOR: "binary_sensor.window_sensor", CONF_USE_WINDOW_CENTRAL_CONFIG: True, }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "motion" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_MOTION_SENSOR: "input_boolean.motion_sensor", CONF_USE_MOTION_CENTRAL_CONFIG: True, }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "power" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_POWER_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "presence" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_PRESENCE_SENSOR: "person.presence_sensor", CONF_USE_PRESENCE_CENTRAL_CONFIG: True, }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "advanced" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_ADVANCED_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["data"] == ( MOCK_TH_OVER_SWITCH_USER_CONFIG | MOCK_TH_OVER_SWITCH_MAIN_CONFIG | MOCK_TH_OVER_SWITCH_TYPE_CONFIG | {CONF_WINDOW_SENSOR: "binary_sensor.window_sensor"} | {CONF_MOTION_SENSOR: "input_boolean.motion_sensor"} | {CONF_PRESENCE_SENSOR: "person.presence_sensor"} | { CONF_USE_MAIN_CENTRAL_CONFIG: True, CONF_USE_TPI_CENTRAL_CONFIG: True, CONF_USE_PRESETS_CENTRAL_CONFIG: True, CONF_USE_WINDOW_CENTRAL_CONFIG: True, CONF_USE_MOTION_CENTRAL_CONFIG: True, CONF_USE_POWER_CENTRAL_CONFIG: True, CONF_USE_PRESENCE_CENTRAL_CONFIG: True, CONF_USE_ADVANCED_CENTRAL_CONFIG: True, CONF_USE_CENTRAL_MODE: True, CONF_USED_BY_CENTRAL_BOILER: False, } ) assert result["result"] assert result["result"].domain == DOMAIN assert result["result"].version == 1 assert result["result"].title == "TheOverSwitchMockName" assert isinstance(result["result"], ConfigEntry) @pytest.mark.parametrize("expected_lingering_tasks", [True]) @pytest.mark.parametrize("expected_lingering_timers", [True]) async def test_user_config_flow_over_climate( hass: HomeAssistant, skip_hass_states_get ): # pylint: disable=unused-argument """Test the config flow with all thermostat_over_climate features and no additional features""" await create_central_config(hass) result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == SOURCE_USER result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_CLIMATE_USER_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "main" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_CLIMATE_MAIN_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "main" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_CLIMATE_CENTRAL_MAIN_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "type" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_CLIMATE_TYPE_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "presets" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_PRESETS_CENTRAL_CONFIG: False} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "presets" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_PRESETS_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "advanced" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_ADVANCED_CENTRAL_CONFIG: False} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "advanced" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_ADVANCED_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result[ "data" ] == MOCK_TH_OVER_CLIMATE_USER_CONFIG | MOCK_TH_OVER_CLIMATE_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_CENTRAL_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_TYPE_CONFIG | MOCK_PRESETS_CONFIG | MOCK_ADVANCED_CONFIG | MOCK_DEFAULT_FEATURE_CONFIG | { CONF_USE_MAIN_CENTRAL_CONFIG: False, CONF_USE_TPI_CENTRAL_CONFIG: False, CONF_USE_PRESETS_CENTRAL_CONFIG: False, CONF_USE_WINDOW_CENTRAL_CONFIG: False, CONF_USE_MOTION_CENTRAL_CONFIG: False, CONF_USE_POWER_CENTRAL_CONFIG: False, CONF_USE_PRESENCE_CENTRAL_CONFIG: False, CONF_USE_ADVANCED_CENTRAL_CONFIG: False, CONF_USED_BY_CENTRAL_BOILER: False, } assert result["result"] assert result["result"].domain == DOMAIN assert result["result"].version == 1 assert result["result"].title == "TheOverClimateMockName" assert isinstance(result["result"], ConfigEntry) @pytest.mark.parametrize("expected_lingering_tasks", [True]) @pytest.mark.parametrize("expected_lingering_timers", [True]) async def test_user_config_flow_window_auto_ok( hass: HomeAssistant, skip_hass_states_get, skip_control_heating, # pylint: disable=unused-argument ): """Test the config flow with only window auto feature""" await create_central_config(hass) result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == SOURCE_USER result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH, }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "main" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_NAME: "TheOverSwitchMockName", CONF_TEMP_SENSOR: "sensor.mock_temp_sensor", CONF_CYCLE_MIN: 5, CONF_DEVICE_POWER: 1, CONF_USE_WINDOW_FEATURE: True, CONF_USE_MOTION_FEATURE: False, CONF_USE_POWER_FEATURE: False, CONF_USE_PRESENCE_FEATURE: False, CONF_USE_MAIN_CENTRAL_CONFIG: True, CONF_USED_BY_CENTRAL_BOILER: True, }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "type" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_SWITCH_TYPE_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "tpi" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_TPI_CENTRAL_CONFIG: False} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "tpi" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_SWITCH_TPI_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "presets" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_PRESETS_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "window" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_WINDOW_CENTRAL_CONFIG: False}, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "window" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_WINDOW_AUTO_CONFIG, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "advanced" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_ADVANCED_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["data"] == { CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH, CONF_NAME: "TheOverSwitchMockName", CONF_TEMP_SENSOR: "sensor.mock_temp_sensor", CONF_CYCLE_MIN: 5, CONF_DEVICE_POWER: 1, CONF_USE_WINDOW_FEATURE: True, CONF_USE_MOTION_FEATURE: False, CONF_USE_POWER_FEATURE: False, CONF_USE_PRESENCE_FEATURE: False, CONF_USE_MOTION_FEATURE: False, CONF_USE_POWER_FEATURE: False, CONF_USE_PRESENCE_FEATURE: False, CONF_WINDOW_DELAY: 30, # the default value is added CONF_USE_CENTRAL_MODE: True, # True is the defaulf value } | MOCK_TH_OVER_SWITCH_TYPE_CONFIG | MOCK_TH_OVER_SWITCH_TPI_CONFIG | MOCK_WINDOW_AUTO_CONFIG | { CONF_USE_MAIN_CENTRAL_CONFIG: True, CONF_USE_TPI_CENTRAL_CONFIG: False, CONF_USE_PRESETS_CENTRAL_CONFIG: True, CONF_USE_WINDOW_CENTRAL_CONFIG: False, CONF_USE_MOTION_CENTRAL_CONFIG: False, CONF_USE_POWER_CENTRAL_CONFIG: False, CONF_USE_PRESENCE_CENTRAL_CONFIG: False, CONF_USE_ADVANCED_CENTRAL_CONFIG: True, CONF_USED_BY_CENTRAL_BOILER: True, } assert result["result"] assert result["result"].domain == DOMAIN assert result["result"].version == 1 assert result["result"].title == "TheOverSwitchMockName" assert isinstance(result["result"], ConfigEntry) @pytest.mark.parametrize("expected_lingering_tasks", [True]) @pytest.mark.parametrize("expected_lingering_timers", [True]) async def test_user_config_flow_window_auto_ko( hass: HomeAssistant, skip_hass_states_get # pylint: disable=unused-argument ): """Test the config flow with window auto and window features -> not allowed""" await create_central_config(hass) result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == SOURCE_USER result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH, }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "main" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_NAME: "TheOverSwitchMockName", CONF_TEMP_SENSOR: "sensor.mock_temp_sensor", CONF_CYCLE_MIN: 5, CONF_DEVICE_POWER: 1, CONF_USE_WINDOW_FEATURE: True, CONF_USE_MOTION_FEATURE: False, CONF_USE_POWER_FEATURE: False, CONF_USE_PRESENCE_FEATURE: False, CONF_USE_MAIN_CENTRAL_CONFIG: True, }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "type" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_SWITCH_TYPE_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "tpi" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_TPI_CENTRAL_CONFIG: False} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "tpi" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_TH_OVER_SWITCH_TPI_CONFIG ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "presets" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_PRESETS_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "window" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_WINDOW_SENSOR: "binary_sensor.window_sensor", CONF_USE_WINDOW_CENTRAL_CONFIG: False, }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "window" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MOCK_WINDOW_DELAY_CONFIG, ) # Since issue #280 we cannot have the error because we only display the # MOCK_WINDOW_DELAY_CONFIG form if we have a sensor configured assert result["type"] == data_entry_flow.RESULT_TYPE_FORM # We should stay on window with an error assert result["errors"] == {} # "window_sensor_entity_id": "window_open_detection_method" # } assert result["step_id"] == "advanced" @pytest.mark.parametrize("expected_lingering_tasks", [True]) @pytest.mark.parametrize("expected_lingering_timers", [True]) async def test_user_config_flow_over_4_switches( hass: HomeAssistant, skip_hass_states_get, skip_control_heating, # pylint: disable=unused-argument ): """Test the config flow with 4 switchs thermostat_over_switch features""" await create_central_config(hass) SOURCE_CONFIG = { CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH, } MAIN_CONFIG = { # pylint: disable=wildcard-import, invalid-name CONF_NAME: "TheOver4SwitchMockName", CONF_TEMP_SENSOR: "sensor.mock_temp_sensor", CONF_CYCLE_MIN: 5, CONF_DEVICE_POWER: 1, CONF_USE_WINDOW_FEATURE: False, CONF_USE_MOTION_FEATURE: False, CONF_USE_POWER_FEATURE: False, CONF_USE_PRESENCE_FEATURE: False, CONF_USE_MAIN_CENTRAL_CONFIG: True, CONF_USE_CENTRAL_MODE: False, CONF_USED_BY_CENTRAL_BOILER: False, } TYPE_CONFIG = { # pylint: disable=wildcard-import, invalid-name CONF_HEATER: "switch.mock_switch1", CONF_HEATER_2: "switch.mock_switch2", CONF_HEATER_3: "switch.mock_switch3", CONF_HEATER_4: "switch.mock_switch4", CONF_PROP_FUNCTION: PROPORTIONAL_FUNCTION_TPI, CONF_AC_MODE: False, CONF_INVERSE_SWITCH: False, } result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == SOURCE_USER result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=SOURCE_CONFIG, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "main" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=MAIN_CONFIG, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "type" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=TYPE_CONFIG, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "tpi" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_TPI_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "presets" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_PRESETS_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "advanced" assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={CONF_USE_ADVANCED_CENTRAL_CONFIG: True} ) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["data"] == ( SOURCE_CONFIG | MAIN_CONFIG | TYPE_CONFIG | { CONF_USE_MAIN_CENTRAL_CONFIG: True, CONF_USE_TPI_CENTRAL_CONFIG: True, CONF_USE_PRESETS_CENTRAL_CONFIG: True, CONF_USE_WINDOW_CENTRAL_CONFIG: False, CONF_USE_MOTION_CENTRAL_CONFIG: False, CONF_USE_POWER_CENTRAL_CONFIG: False, CONF_USE_PRESENCE_CENTRAL_CONFIG: False, CONF_USE_ADVANCED_CENTRAL_CONFIG: True, } ) assert result["result"] assert result["result"].domain == DOMAIN assert result["result"].version == 1 assert result["result"].title == "TheOver4SwitchMockName" assert isinstance(result["result"], ConfigEntry)