from __future__ import annotations import pytest from v1.auth.schemas import ( AuthTokenResponse, AuthUser, LoginRequest, RefreshRequest, SignupRequest, ) from v1.auth.service import AuthService, AuthServiceGateway class FakeGateway(AuthServiceGateway): def __init__(self, response: AuthTokenResponse) -> None: self._response = response async def signup(self, request: SignupRequest) -> AuthTokenResponse: return self._response async def login(self, request: LoginRequest) -> AuthTokenResponse: return self._response async def refresh(self, request: RefreshRequest) -> AuthTokenResponse: return self._response async def logout(self, refresh_token: str | None) -> None: return None @pytest.mark.asyncio async def test_signup_maps_response() -> None: user = AuthUser(id="user-1", email="user@example.com") token_response = AuthTokenResponse( access_token="access", refresh_token="refresh", expires_in=3600, token_type="bearer", user=user, ) service = AuthService(gateway=FakeGateway(token_response)) result = await service.signup( SignupRequest(email="user@example.com", password="secret123") ) assert result.access_token == "access" assert result.refresh_token == "refresh" assert result.user.id == "user-1" class LogoutAssertingGateway(AuthServiceGateway): def __init__(self, expected_refresh_token: str) -> None: self._expected_refresh_token = expected_refresh_token async def signup(self, request: SignupRequest) -> AuthTokenResponse: raise NotImplementedError async def login(self, request: LoginRequest) -> AuthTokenResponse: raise NotImplementedError async def refresh(self, request: RefreshRequest) -> AuthTokenResponse: raise NotImplementedError async def logout(self, refresh_token: str | None) -> None: assert refresh_token == self._expected_refresh_token @pytest.mark.asyncio async def test_logout_forwards_refresh_token() -> None: service = AuthService(gateway=LogoutAssertingGateway("refresh-token")) await service.logout("refresh-token")