Files
core/tests/scripts/test_auth.py
T

128 lines
3.9 KiB
Python
Raw Normal View History

2018-05-10 14:09:22 -04:00
"""Test the auth script to manage local users."""
2021-01-01 22:31:56 +01:00
from unittest.mock import Mock, patch
2018-05-10 14:09:22 -04:00
import pytest
2018-07-13 11:43:08 +02:00
from homeassistant.auth.providers import homeassistant as hass_auth
from homeassistant.scripts import auth as script_auth
2018-05-10 14:09:22 -04:00
2018-07-13 15:31:20 +02:00
from tests.common import register_auth_provider
@pytest.fixture
2018-07-13 15:31:20 +02:00
def provider(hass):
"""Home Assistant auth provider."""
2019-07-31 12:25:30 -07:00
provider = hass.loop.run_until_complete(
register_auth_provider(hass, {"type": "homeassistant"})
)
2018-07-13 15:31:20 +02:00
hass.loop.run_until_complete(provider.async_initialize())
return provider
2018-05-10 14:09:22 -04:00
2018-07-13 15:31:20 +02:00
async def test_list_user(hass, provider, capsys):
2018-05-10 14:09:22 -04:00
"""Test we can list users."""
2018-07-13 15:31:20 +02:00
data = provider.data
2019-07-31 12:25:30 -07:00
data.add_auth("test-user", "test-pass")
data.add_auth("second-user", "second-pass")
2018-05-10 14:09:22 -04:00
2018-07-13 15:31:20 +02:00
await script_auth.list_users(hass, provider, None)
2018-05-10 14:09:22 -04:00
captured = capsys.readouterr()
2019-07-31 12:25:30 -07:00
assert captured.out == "\n".join(
["test-user", "second-user", "", "Total users: 2", ""]
)
2018-05-10 14:09:22 -04:00
2018-07-13 15:31:20 +02:00
async def test_add_user(hass, provider, capsys, hass_storage):
2018-05-10 14:09:22 -04:00
"""Test we can add a user."""
2018-07-13 15:31:20 +02:00
data = provider.data
await script_auth.add_user(
2019-07-31 12:25:30 -07:00
hass, provider, Mock(username="paulus", password="test-pass")
)
2018-05-10 14:09:22 -04:00
2019-07-31 12:25:30 -07:00
assert len(hass_storage[hass_auth.STORAGE_KEY]["data"]["users"]) == 1
2018-05-10 14:09:22 -04:00
captured = capsys.readouterr()
2019-07-31 12:25:30 -07:00
assert captured.out == "Auth created\n"
2018-05-10 14:09:22 -04:00
assert len(data.users) == 1
2019-07-31 12:25:30 -07:00
data.validate_login("paulus", "test-pass")
2018-05-10 14:09:22 -04:00
2018-07-13 15:31:20 +02:00
async def test_validate_login(hass, provider, capsys):
2018-05-10 14:09:22 -04:00
"""Test we can validate a user login."""
2018-07-13 15:31:20 +02:00
data = provider.data
2019-07-31 12:25:30 -07:00
data.add_auth("test-user", "test-pass")
2018-05-10 14:09:22 -04:00
await script_auth.validate_login(
2019-07-31 12:25:30 -07:00
hass, provider, Mock(username="test-user", password="test-pass")
)
2018-05-10 14:09:22 -04:00
captured = capsys.readouterr()
2019-07-31 12:25:30 -07:00
assert captured.out == "Auth valid\n"
2018-05-10 14:09:22 -04:00
await script_auth.validate_login(
2019-07-31 12:25:30 -07:00
hass, provider, Mock(username="test-user", password="invalid-pass")
)
2018-05-10 14:09:22 -04:00
captured = capsys.readouterr()
2019-07-31 12:25:30 -07:00
assert captured.out == "Auth invalid\n"
2018-05-10 14:09:22 -04:00
await script_auth.validate_login(
2019-07-31 12:25:30 -07:00
hass, provider, Mock(username="invalid-user", password="test-pass")
)
2018-05-10 14:09:22 -04:00
captured = capsys.readouterr()
2019-07-31 12:25:30 -07:00
assert captured.out == "Auth invalid\n"
2018-05-10 14:09:22 -04:00
2018-07-13 15:31:20 +02:00
async def test_change_password(hass, provider, capsys, hass_storage):
2018-05-10 14:09:22 -04:00
"""Test we can change a password."""
2018-07-13 15:31:20 +02:00
data = provider.data
2019-07-31 12:25:30 -07:00
data.add_auth("test-user", "test-pass")
2018-05-10 14:09:22 -04:00
await script_auth.change_password(
2019-07-31 12:25:30 -07:00
hass, provider, Mock(username="test-user", new_password="new-pass")
)
2018-05-10 14:09:22 -04:00
2019-07-31 12:25:30 -07:00
assert len(hass_storage[hass_auth.STORAGE_KEY]["data"]["users"]) == 1
2018-05-10 14:09:22 -04:00
captured = capsys.readouterr()
2019-07-31 12:25:30 -07:00
assert captured.out == "Password changed\n"
data.validate_login("test-user", "new-pass")
2018-05-10 14:09:22 -04:00
with pytest.raises(hass_auth.InvalidAuth):
2019-07-31 12:25:30 -07:00
data.validate_login("test-user", "test-pass")
2018-05-10 14:09:22 -04:00
2019-07-31 12:25:30 -07:00
async def test_change_password_invalid_user(hass, provider, capsys, hass_storage):
2018-05-10 14:09:22 -04:00
"""Test changing password of non-existing user."""
2018-07-13 15:31:20 +02:00
data = provider.data
2019-07-31 12:25:30 -07:00
data.add_auth("test-user", "test-pass")
2018-05-10 14:09:22 -04:00
await script_auth.change_password(
2019-07-31 12:25:30 -07:00
hass, provider, Mock(username="invalid-user", new_password="new-pass")
)
2018-05-10 14:09:22 -04:00
assert hass_auth.STORAGE_KEY not in hass_storage
2018-05-10 14:09:22 -04:00
captured = capsys.readouterr()
2019-07-31 12:25:30 -07:00
assert captured.out == "User not found\n"
data.validate_login("test-user", "test-pass")
2018-05-10 14:09:22 -04:00
with pytest.raises(hass_auth.InvalidAuth):
2019-07-31 12:25:30 -07:00
data.validate_login("invalid-user", "new-pass")
2022-11-29 22:36:36 +01:00
def test_parsing_args(event_loop):
"""Test we parse args correctly."""
called = False
2018-07-13 15:31:20 +02:00
async def mock_func(hass, provider, args2):
"""Mock function to be called."""
nonlocal called
called = True
2019-07-31 12:25:30 -07:00
assert provider.hass.config.config_dir == "/somewhere/config"
assert args2 is args
2019-07-31 12:25:30 -07:00
args = Mock(config="/somewhere/config", func=mock_func)
2019-07-31 12:25:30 -07:00
with patch("argparse.ArgumentParser.parse_args", return_value=args):
script_auth.run(None)
2019-07-31 12:25:30 -07:00
assert called, "Mock function did not get called"