Last active
June 3, 2026 08:00
-
-
Save jangia/08ee8579a75089891a0af05150eb85f2 to your computer and use it in GitHub Desktop.
Wrapper pattern as per Complete Python Testing Guide
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from dataclasses import dataclass | |
| from time_provider import TimeProvider | |
| from user import User | |
| class CreateUser: | |
| def __init__(self, time_provider: TimeProvider) -> None: | |
| self._time_provider = time_provider | |
| def execute(self, email: str) -> User: | |
| return User( | |
| email=email, | |
| created_at=self._time_provider.now(), | |
| ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from datetime import datetime, timezone | |
| from create_user import CreateUser | |
| from time_provider import FixedTimeProvider | |
| def test_user_is_created() -> None: | |
| created_at = datetime(2025, 1, 15, 12, 30, 0, tzinfo=timezone.utc) | |
| use_case = CreateUser(FixedTimeProvider(fixed)) | |
| user = use_case.execute(email="a@example.com") | |
| assert user.email == "a@example.com" | |
| assert user.created_at == created_at |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from datetime import datetime, timezone | |
| from typing import Protocol | |
| class TimeProvider(Protocol): | |
| """Protocol for getting current time.""" | |
| def now(self) -> datetime: ... | |
| class UTCTimeProvider: | |
| """Production implementation returning current UTC time.""" | |
| def now(self) -> datetime: | |
| return datetime.now(timezone.utc) | |
| class FixedTimeProvider: | |
| """Test implementation with controllable time.""" | |
| def __init__(self, fixed_time: datetime) -> None: | |
| self._time = fixed_time | |
| def now(self) -> datetime: | |
| return self._time |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from dataclasses import dataclass | |
| from datetime import datetime | |
| @dataclass(frozen=True) | |
| class User: | |
| email: str | |
| created_at: datetime |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment