diff --git a/homeassistant/components/tuya/config_flow.py b/homeassistant/components/tuya/config_flow.py index 9761b1b6c96..357910b5388 100644 --- a/homeassistant/components/tuya/config_flow.py +++ b/homeassistant/components/tuya/config_flow.py @@ -26,6 +26,8 @@ from .const import ( RESULT_SINGLE_INSTANCE = "single_instance_allowed" RESULT_AUTH_FAILED = "invalid_auth" TUYA_ENDPOINT_BASE = "https://openapi.tuyacn.com" +TUYA_ENDPOINT_OTHER = "https://openapi.tuyaus.com" +COUNTRY_CODE_CHINA = ["86", "+86", "China"] _LOGGER = logging.getLogger(__name__) @@ -82,7 +84,11 @@ class TuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): if project_type == ProjectType.INDUSTY_SOLUTIONS: response = api.login(user_input[CONF_USERNAME], user_input[CONF_PASSWORD]) else: - api.endpoint = TUYA_ENDPOINT_BASE + if user_input[CONF_COUNTRY_CODE] in COUNTRY_CODE_CHINA: + api.endpoint = TUYA_ENDPOINT_BASE + else: + api.endpoint = TUYA_ENDPOINT_OTHER + response = api.login( user_input[CONF_USERNAME], user_input[CONF_PASSWORD], diff --git a/tests/components/tuya/test_config_flow.py b/tests/components/tuya/test_config_flow.py index a15cfcc0fdf..b01745ee8db 100644 --- a/tests/components/tuya/test_config_flow.py +++ b/tests/components/tuya/test_config_flow.py @@ -24,7 +24,8 @@ MOCK_ACCESS_ID = "myAccessId" MOCK_ACCESS_SECRET = "myAccessSecret" MOCK_USERNAME = "myUsername" MOCK_PASSWORD = "myPassword" -MOCK_COUNTRY_CODE = "1" +MOCK_COUNTRY_CODE_BASE = "86" +MOCK_COUNTRY_CODE_OTHER = "1" MOCK_APP_TYPE = "smartlife" MOCK_ENDPOINT = "https://openapi-ueaz.tuyaus.com" @@ -35,15 +36,6 @@ TUYA_INDUSTRY_PROJECT_DATA = { CONF_PROJECT_TYPE: MOCK_INDUSTRY_PROJECT_TYPE, } -TUYA_INPUT_SMART_HOME_DATA = { - CONF_ACCESS_ID: MOCK_ACCESS_ID, - CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, - CONF_USERNAME: MOCK_USERNAME, - CONF_PASSWORD: MOCK_PASSWORD, - CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE, - CONF_APP_TYPE: MOCK_APP_TYPE, -} - TUYA_INPUT_INDUSTRY_DATA = { CONF_ENDPOINT: MOCK_ENDPOINT, CONF_ACCESS_ID: MOCK_ACCESS_ID, @@ -52,15 +44,23 @@ TUYA_INPUT_INDUSTRY_DATA = { CONF_PASSWORD: MOCK_PASSWORD, } -TUYA_IMPORT_SMART_HOME_DATA = { +TUYA_IMPORT_SMART_HOME_DATA_BASE = { CONF_ACCESS_ID: MOCK_ACCESS_ID, CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, CONF_USERNAME: MOCK_USERNAME, CONF_PASSWORD: MOCK_PASSWORD, - CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE, + CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE_BASE, CONF_APP_TYPE: MOCK_APP_TYPE, } +TUYA_IMPORT_SMART_HOME_DATA_OTHER = { + CONF_ACCESS_ID: MOCK_ACCESS_ID, + CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, + CONF_USERNAME: MOCK_USERNAME, + CONF_PASSWORD: MOCK_PASSWORD, + CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE_OTHER, + CONF_APP_TYPE: MOCK_APP_TYPE, +} TUYA_IMPORT_INDUSTRY_DATA = { CONF_PROJECT_TYPE: MOCK_SMART_HOME_PROJECT_TYPE, @@ -118,8 +118,8 @@ async def test_industry_user(hass, tuya): assert not result["result"].unique_id -async def test_smart_home_user(hass, tuya): - """Test smart home user config.""" +async def test_smart_home_user_base(hass, tuya): + """Test smart home user config base.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) @@ -137,7 +137,7 @@ async def test_smart_home_user(hass, tuya): tuya().login = MagicMock(return_value={"success": False, "errorCode": 1024}) result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA + result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_BASE ) await hass.async_block_till_done() @@ -145,7 +145,7 @@ async def test_smart_home_user(hass, tuya): tuya().login = MagicMock(return_value={"success": True, "errorCode": 1024}) result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA + result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_BASE ) await hass.async_block_till_done() @@ -155,7 +155,49 @@ async def test_smart_home_user(hass, tuya): assert result["data"][CONF_ACCESS_SECRET] == MOCK_ACCESS_SECRET assert result["data"][CONF_USERNAME] == MOCK_USERNAME assert result["data"][CONF_PASSWORD] == MOCK_PASSWORD - assert result["data"][CONF_COUNTRY_CODE] == MOCK_COUNTRY_CODE + assert result["data"][CONF_COUNTRY_CODE] == MOCK_COUNTRY_CODE_BASE + assert result["data"][CONF_APP_TYPE] == MOCK_APP_TYPE + assert not result["result"].unique_id + + +async def test_smart_home_user_other(hass, tuya): + """Test smart home user config other.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "user" + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input=TUYA_SMART_HOME_PROJECT_DATA + ) + await hass.async_block_till_done() + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "login" + + tuya().login = MagicMock(return_value={"success": False, "errorCode": 1024}) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_OTHER + ) + await hass.async_block_till_done() + + assert result["errors"]["base"] == RESULT_AUTH_FAILED + + tuya().login = MagicMock(return_value={"success": True, "errorCode": 1024}) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_OTHER + ) + await hass.async_block_till_done() + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["title"] == MOCK_USERNAME + assert result["data"][CONF_ACCESS_ID] == MOCK_ACCESS_ID + assert result["data"][CONF_ACCESS_SECRET] == MOCK_ACCESS_SECRET + assert result["data"][CONF_USERNAME] == MOCK_USERNAME + assert result["data"][CONF_PASSWORD] == MOCK_PASSWORD + assert result["data"][CONF_COUNTRY_CODE] == MOCK_COUNTRY_CODE_OTHER assert result["data"][CONF_APP_TYPE] == MOCK_APP_TYPE assert not result["result"].unique_id