"""Test the example module auth module.""" from homeassistant import auth, data_entry_flow from homeassistant.auth.mfa_modules import auth_mfa_module_from_config from homeassistant.auth.models import Credentials from tests.common import MockUser async def test_validate(hass): """Test validating pin.""" auth_module = await auth_mfa_module_from_config(hass, { 'type': 'insecure_example', 'data': [{'user_id': 'test-user', 'pin': '123456'}] }) result = await auth_module.async_validation( 'test-user', {'pin': '123456'}) assert result is True result = await auth_module.async_validation( 'test-user', {'pin': 'invalid'}) assert result is False result = await auth_module.async_validation( 'invalid-user', {'pin': '123456'}) assert result is False async def test_setup_user(hass): """Test setup user.""" auth_module = await auth_mfa_module_from_config(hass, { 'type': 'insecure_example', 'data': [] }) await auth_module.async_setup_user( 'test-user', {'pin': '123456'}) assert len(auth_module._data) == 1 result = await auth_module.async_validation( 'test-user', {'pin': '123456'}) assert result is True async def test_depose_user(hass): """Test despose user.""" auth_module = await auth_mfa_module_from_config(hass, { 'type': 'insecure_example', 'data': [{'user_id': 'test-user', 'pin': '123456'}] }) assert len(auth_module._data) == 1 await auth_module.async_depose_user('test-user') assert len(auth_module._data) == 0 async def test_is_user_setup(hass): """Test is user setup.""" auth_module = await auth_mfa_module_from_config(hass, { 'type': 'insecure_example', 'data': [{'user_id': 'test-user', 'pin': '123456'}] }) assert await auth_module.async_is_user_setup('test-user') is True assert await auth_module.async_is_user_setup('invalid-user') is False async def test_login(hass): """Test login flow with auth module.""" hass.auth = await auth.auth_manager_from_config(hass, [{ 'type': 'insecure_example', 'users': [{'username': 'test-user', 'password': 'test-pass'}], }], [{ 'type': 'insecure_example', 'data': [{'user_id': 'mock-user', 'pin': '123456'}] }]) user = MockUser( id='mock-user', is_owner=False, is_active=False, name='Paulus', ).add_to_auth_manager(hass.auth) await hass.auth.async_link_user(user, Credentials( id='mock-id', auth_provider_type='insecure_example', auth_provider_id=None, data={'username': 'test-user'}, is_new=False, )) provider = hass.auth.auth_providers[0] result = await hass.auth.login_flow.async_init( (provider.type, provider.id)) assert result['type'] == data_entry_flow.RESULT_TYPE_FORM result = await hass.auth.login_flow.async_configure( result['flow_id'], { 'username': 'incorrect-user', 'password': 'test-pass', }) assert result['type'] == data_entry_flow.RESULT_TYPE_FORM assert result['errors']['base'] == 'invalid_auth' result = await hass.auth.login_flow.async_configure( result['flow_id'], { 'username': 'test-user', 'password': 'incorrect-pass', }) assert result['type'] == data_entry_flow.RESULT_TYPE_FORM assert result['errors']['base'] == 'invalid_auth' result = await hass.auth.login_flow.async_configure( result['flow_id'], { 'username': 'test-user', 'password': 'test-pass', }) assert result['type'] == data_entry_flow.RESULT_TYPE_FORM assert result['step_id'] == 'mfa' assert result['data_schema'].schema.get('pin') == str result = await hass.auth.login_flow.async_configure( result['flow_id'], {'pin': 'invalid-code'}) assert result['type'] == data_entry_flow.RESULT_TYPE_FORM assert result['errors']['base'] == 'invalid_auth' result = await hass.auth.login_flow.async_configure( result['flow_id'], {'pin': '123456'}) assert result['type'] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result['data'].id == 'mock-user'