from functools import partial from unittest.mock import Mock import pytest import pytest_asyncio from conftest import use_test_db # noqa from src.backend.users import manage MOCK_SUBJECT: str = "auth0|5f3e3e3e3e3e3e3e3e3e3e3e" MOCK_USER: dict[str, str] = { "nickname": "Test User", "name": "Test User", "email": "test@test.com", } @pytest.fixture(autouse=True) def db(use_test_db): # noqa """Get a new test database client instance.""" return manage.Client() @pytest.fixture(autouse=True) def clear_cache(): """Clear the cache before running the tests.""" manage._seen_subjects.clear() # noqa @pytest.fixture(autouse=True) def mocker_get_user(mocker): mocker.patch( "src.backend.users.manage.auth0_client.get_user", return_value=MOCK_USER ) @pytest_asyncio.fixture async def call_register_user(db, mocker_get_user): return await manage.register_user(db, MOCK_SUBJECT) class TestRegisterUser: @pytest.mark.asyncio async def test_register_user_id(self, db, call_register_user): user_id = await manage.get_subject_user_id(db, MOCK_SUBJECT) assert user_id == 1, "Expected user ID to be 1, as assigned by the DB" assert ( call_register_user == 1 ), "Expected user ID to be 1, as assigned by the DB" @pytest.mark.asyncio async def test_register_user_data_inserted_correctly(self, db, call_register_user): user_data = await db.Users.get(MOCK_SUBJECT) assert all( item in user_data.items() for item in MOCK_USER.items() ), "Expected the user data to be a subset of the data returned by the DB" class TestVerifyAuth0: @pytest.fixture(autouse=True) def mocker_verify(self, mocker): return mocker.patch( "src.backend.users.manage.auth0_client.verify", return_value={} ) @pytest.mark.asyncio async def test_verify_auth0(self, mocker, db, mocker_verify): mock_credentials = {"sub": MOCK_SUBJECT} mocker_verify.return_value = mock_credentials result = await manage._verify_auth0(token=Mock()) assert result == mock_credentials, "Expected the credentials to match" user_id = await manage.get_subject_user_id(db, MOCK_SUBJECT) assert user_id == 1, "Expected user ID to be 1, as assigned by the DB" @pytest.mark.asyncio async def test_verify_auth0_no_subject_found(self, mocker): with pytest.raises(manage.HTTPException): await manage._verify_auth0(token=Mock()) class TestCreateUserIfNotExists: call = partial(manage._create_user_if_not_exists, MOCK_SUBJECT) @pytest.mark.asyncio async def test_create_user_if_not_exists(self): user_id = await self.call() assert user_id == 1, "Expected user ID to be 1, as assigned by the DB" # Test user already created user_id = await self.call() assert user_id is None, "Expected None as user was already created in DB" @pytest.mark.asyncio async def test_create_user_already_existed(self, call_register_user): user_id = await self.call() assert user_id is None, "Expected None as user already existed in DB"