Fix Tuya v2 login issue (#56973)

* fix login issue

* fix:login error

* update COUNTRY_CODE_CHINA line location

* added one blank line

* feat:added line #L88 was not covered by tests

* ci build errors

Co-authored-by: erchuan <jie.zheng@tuya.com>
This commit is contained in:
Oliver Ou 2021-10-04 16:45:37 +08:00 committed by GitHub
parent 2d374d65b6
commit 7446e388ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 66 additions and 18 deletions

View File

@ -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],

View File

@ -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