from unittest.mock import patch import pytest from homeassistant.config_entries import SOURCE_USER from homeassistant.core import HomeAssistant from custom_components.room_cal_ha.const import ( CONF_CALDAV_ENABLED, CONF_CALDAV_URL, CONF_CALENDAR_NAME, CONF_CURRENT_NAME, CONF_NEXT_NAME, CONF_ROOM_STATE_NAME, DEFAULT_CURRENT_NAME, DEFAULT_NEXT_NAME, DEFAULT_ROOM_STATE_NAME, DOMAIN, ) async def test_user_step_shows_defaults(hass: HomeAssistant): result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == "form" assert result["step_id"] == "user" schema = result["data_schema"].schema keys = {str(k): k for k in schema} assert keys[CONF_ROOM_STATE_NAME].default() == DEFAULT_ROOM_STATE_NAME assert keys[CONF_CURRENT_NAME].default() == DEFAULT_CURRENT_NAME assert keys[CONF_NEXT_NAME].default() == DEFAULT_NEXT_NAME async def test_user_step_creates_entry(hass: HomeAssistant): result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_ROOM_STATE_NAME: "My Room", CONF_CURRENT_NAME: "Staying Now", CONF_NEXT_NAME: "Coming Up", }, ) assert result["type"] == "create_entry" assert result["data"][CONF_ROOM_STATE_NAME] == "My Room" assert result["data"][CONF_CURRENT_NAME] == "Staying Now" assert result["data"][CONF_NEXT_NAME] == "Coming Up" async def test_options_flow_caldav_disabled(hass: HomeAssistant, mock_entry): mock_entry.add_to_hass(hass) result = await hass.config_entries.options.async_init(mock_entry.entry_id) assert result["type"] == "form" assert result["step_id"] == "caldav" result = await hass.config_entries.options.async_configure( result["flow_id"], user_input={CONF_CALDAV_ENABLED: False, CONF_CALDAV_URL: "", CONF_CALENDAR_NAME: ""}, ) assert result["type"] == "create_entry" assert result["data"][CONF_CALDAV_ENABLED] is False async def test_options_flow_caldav_enabled_tests_connection(hass: HomeAssistant, mock_entry): mock_entry.add_to_hass(hass) result = await hass.config_entries.options.async_init(mock_entry.entry_id) with patch( "custom_components.room_cal_ha.config_flow._test_caldav_auth", return_value=None, ): result = await hass.config_entries.options.async_configure( result["flow_id"], user_input={ CONF_CALDAV_ENABLED: True, CONF_CALDAV_URL: "https://cal.example.com", CONF_CALENDAR_NAME: "Room", }, ) assert result["type"] == "create_entry" assert result["data"][CONF_CALDAV_ENABLED] is True async def test_options_flow_bad_credentials_shows_error(hass: HomeAssistant, mock_entry): import caldav.lib.error as caldav_error mock_entry.add_to_hass(hass) result = await hass.config_entries.options.async_init(mock_entry.entry_id) with patch( "custom_components.room_cal_ha.config_flow._test_caldav_auth", side_effect=caldav_error.AuthorizationError, ): result = await hass.config_entries.options.async_configure( result["flow_id"], user_input={ CONF_CALDAV_ENABLED: True, CONF_CALDAV_URL: "https://cal.example.com", CONF_CALENDAR_NAME: "Room", }, ) assert result["type"] == "form" assert result["errors"]["base"] == "invalid_auth"