refactor: many changes
- Add missing actions and make a clear boundary between actions, services and nfra (i.e: actions shouldn't use stuff from infra/) - Delete stuff not in use: tts, gtts, etc - Add a ton of tests
This commit is contained in:
parent
b2185f4174
commit
152546982c
46 changed files with 2328 additions and 700 deletions
243
tests/test_actions.py
Normal file
243
tests/test_actions.py
Normal file
|
|
@ -0,0 +1,243 @@
|
|||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
|
||||
from huesoporro.actions.quotes.create_quote_action import CreateQuoteAction
|
||||
from huesoporro.actions.quotes.get_random_quote import GetRandomQuoteAction
|
||||
from huesoporro.actions.users.authenticate_user import AuthenticateUserAction
|
||||
from huesoporro.actions.users.get_user_by_jwt import GetUserByJWTAction
|
||||
from huesoporro.actions.users.refresh_user_jwt import RefreshUserJwtAction
|
||||
from huesoporro.infra.authenticator import TwitchAuthenticator
|
||||
from huesoporro.models import Quote, TwitchAuth
|
||||
from huesoporro.svc.users_svcs import IsValidTokenSvc, RefreshTokenSvc
|
||||
|
||||
|
||||
class AsyncMock(MagicMock):
|
||||
async def __call__(self, *args, **kwargs):
|
||||
return super().__call__(*args, **kwargs)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def twitch_authenticator(s):
|
||||
return TwitchAuthenticator(s=s)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def fake_twitch_authenticator():
|
||||
return AsyncMock()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def refresh_token_svc(twitch_authenticator, fake_twitch_authenticator, s):
|
||||
svc = RefreshTokenSvc(twitch_authenticator=twitch_authenticator)
|
||||
svc.twitch_authenticator = fake_twitch_authenticator
|
||||
return svc
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def is_valid_svc(twitch_authenticator, fake_twitch_authenticator):
|
||||
svc = IsValidTokenSvc(authenticator=twitch_authenticator)
|
||||
svc.authenticator = fake_twitch_authenticator
|
||||
return svc
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def get_user_by_jwt_action(
|
||||
s, get_user_by_username_svc, update_user_svc, is_valid_svc, refresh_token_svc
|
||||
):
|
||||
return GetUserByJWTAction(
|
||||
get_user_by_username_svc=get_user_by_username_svc,
|
||||
update_user_svc=update_user_svc,
|
||||
refresh_token_svc=refresh_token_svc,
|
||||
is_valid_token_svc=is_valid_svc,
|
||||
s=s,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def refresh_user_jwt_action(
|
||||
s, get_user_by_username_svc, update_user_svc, is_valid_svc, refresh_token_svc
|
||||
):
|
||||
return RefreshUserJwtAction(
|
||||
get_user_by_username_svc=get_user_by_username_svc,
|
||||
update_user_svc=update_user_svc,
|
||||
refresh_token_svc=refresh_token_svc,
|
||||
is_valid_token_svc=is_valid_svc,
|
||||
s=s,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def authenticate_user_action( # noqa: PLR0913
|
||||
s,
|
||||
get_user_by_username_svc,
|
||||
get_twitch_auth_by_auth_code_svc,
|
||||
update_user_svc,
|
||||
create_user_svc,
|
||||
twitch_authenticator,
|
||||
):
|
||||
return AuthenticateUserAction(
|
||||
get_user_by_username_svc=get_user_by_username_svc,
|
||||
update_user_svc=update_user_svc,
|
||||
create_user_svc=create_user_svc,
|
||||
get_tokens_by_auth_code_svc=get_twitch_auth_by_auth_code_svc,
|
||||
s=s,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def get_random_quote_action(get_random_quote_svc):
|
||||
return GetRandomQuoteAction(get_random_quote_svc=get_random_quote_svc)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def create_random_quote_action(create_quote_svc, is_mod_svc):
|
||||
return CreateQuoteAction(create_quote_svc=create_quote_svc, is_mod_svc=is_mod_svc)
|
||||
|
||||
|
||||
async def test_get_user_by_jwt_action_raises_value_error(
|
||||
get_user_by_jwt_action: GetUserByJWTAction, user, s
|
||||
):
|
||||
with pytest.raises(ValueError, match=f"User {user.username} not found"):
|
||||
await get_user_by_jwt_action.run(jwt_token=user.encode(settings=s))
|
||||
|
||||
|
||||
async def test_get_user_by_jwt_returns_user(
|
||||
get_user_by_jwt_action: GetUserByJWTAction,
|
||||
persisted_user,
|
||||
s,
|
||||
fake_twitch_authenticator,
|
||||
):
|
||||
fake_twitch_authenticator.token_is_valid.return_value = True
|
||||
jwt = persisted_user.encode(settings=s)
|
||||
assert await get_user_by_jwt_action.run(jwt_token=jwt)
|
||||
|
||||
|
||||
async def test_get_user_by_jwt_returns_refreshed_user(
|
||||
get_user_by_jwt_action: GetUserByJWTAction,
|
||||
persisted_user,
|
||||
s,
|
||||
fake_twitch_authenticator,
|
||||
):
|
||||
jwt = persisted_user.encode(settings=s)
|
||||
fake_twitch_authenticator.token_is_valid.return_value = False
|
||||
fake_twitch_authenticator.refresh_token.return_value = TwitchAuth(
|
||||
access_token="mocked", # noqa: S106
|
||||
refresh_token="mocked", # noqa: S106
|
||||
userinfo={},
|
||||
)
|
||||
assert await get_user_by_jwt_action.run(jwt_token=jwt)
|
||||
|
||||
|
||||
async def test_refresh_user_jwt_returns_none_on_valid_token(
|
||||
refresh_user_jwt_action: RefreshUserJwtAction,
|
||||
persisted_user,
|
||||
s,
|
||||
fake_twitch_authenticator,
|
||||
):
|
||||
fake_twitch_authenticator.token_is_valid.return_value = True
|
||||
assert await refresh_user_jwt_action.run(user=persisted_user) is None
|
||||
|
||||
|
||||
async def test_refresh_user_jwt_returns_updated_user(
|
||||
refresh_user_jwt_action: RefreshUserJwtAction,
|
||||
persisted_user,
|
||||
s,
|
||||
fake_twitch_authenticator,
|
||||
):
|
||||
fake_twitch_authenticator.token_is_valid.return_value = False
|
||||
fake_twitch_authenticator.refresh_token.return_value = TwitchAuth(
|
||||
access_token="mocked", # noqa: S106
|
||||
refresh_token="mocked", # noqa: S106
|
||||
userinfo={},
|
||||
)
|
||||
user = await refresh_user_jwt_action.run(user=persisted_user)
|
||||
assert user
|
||||
assert user.twitch_access_token == "mocked" # noqa: S105
|
||||
assert user.twitch_refresh_token == "mocked" # noqa: S105
|
||||
|
||||
|
||||
async def test_authenticate_existing_user_returns_user(
|
||||
persisted_user, authenticate_user_action, fake_twitch_authenticator
|
||||
):
|
||||
fake_twitch_authenticator.get_token.return_value = TwitchAuth(
|
||||
access_token="mocked", # noqa: S106
|
||||
refresh_token="mocked", # noqa: S106
|
||||
userinfo={"preferred_username": persisted_user.username},
|
||||
)
|
||||
user = await authenticate_user_action.run(auth_code="mocked")
|
||||
assert user.id == persisted_user.id
|
||||
assert user.username == persisted_user.username
|
||||
assert user.twitch_access_token == "mocked" != persisted_user.twitch_access_token # noqa: S105
|
||||
assert (
|
||||
user.twitch_refresh_token
|
||||
== "mocked" # noqa: S105
|
||||
!= persisted_user.external_auth["twitch"].refresh_token
|
||||
)
|
||||
|
||||
|
||||
async def test_authenticate_raises_value_error_on_not_allowed_user(
|
||||
authenticate_user_action, fake_twitch_authenticator
|
||||
):
|
||||
fake_twitch_authenticator.get_token.return_value = TwitchAuth(
|
||||
access_token="mocked", # noqa: S106
|
||||
refresh_token="mocked", # noqa: S106
|
||||
userinfo={"preferred_username": "not_allowed"},
|
||||
)
|
||||
with pytest.raises(ValueError, match="User not_allowed is not allowed"):
|
||||
await authenticate_user_action.run(auth_code="mocked")
|
||||
|
||||
|
||||
async def test_authenticate_user(
|
||||
authenticate_user_action, fake_twitch_authenticator, user
|
||||
):
|
||||
fake_twitch_authenticator.get_token.return_value = TwitchAuth(
|
||||
access_token="mocked", # noqa: S106
|
||||
refresh_token="mocked", # noqa: S106
|
||||
userinfo={"preferred_username": user.username},
|
||||
)
|
||||
user = await authenticate_user_action.run(auth_code="mocked")
|
||||
assert user.username == user.username
|
||||
|
||||
|
||||
async def test_get_random_quote_action(
|
||||
get_random_quote_action: GetRandomQuoteAction, persisted_quote: Quote
|
||||
):
|
||||
assert (
|
||||
await get_random_quote_action.run(persisted_quote.channel_name)
|
||||
== persisted_quote
|
||||
)
|
||||
|
||||
|
||||
async def test_create_quote_action_returns_none_on_not_mod_user(
|
||||
create_random_quote_action: CreateQuoteAction, user
|
||||
):
|
||||
assert (
|
||||
await create_random_quote_action.run(
|
||||
user=user,
|
||||
channel=user.username,
|
||||
quote="mocked",
|
||||
author="mocked",
|
||||
username="mocked",
|
||||
)
|
||||
is None
|
||||
)
|
||||
|
||||
|
||||
async def test_create_quote_action(
|
||||
create_random_quote_action: CreateQuoteAction, user, quote: Quote, persisted_user
|
||||
):
|
||||
quote.channel_name = persisted_user.username
|
||||
|
||||
new_quote = await create_random_quote_action.run(
|
||||
user=persisted_user,
|
||||
username=user.username,
|
||||
channel=user.username,
|
||||
quote=quote.quote,
|
||||
author=quote.author,
|
||||
)
|
||||
assert new_quote
|
||||
quote.id = new_quote.id
|
||||
quote.created_at = new_quote.created_at
|
||||
quote.last_updated_at = new_quote.last_updated_at
|
||||
assert quote == new_quote
|
||||
Loading…
Add table
Add a link
Reference in a new issue