Skip to content

Instantly share code, notes, and snippets.

@jangia
Last active June 3, 2026 08:00
Show Gist options
  • Select an option

  • Save jangia/08ee8579a75089891a0af05150eb85f2 to your computer and use it in GitHub Desktop.

Select an option

Save jangia/08ee8579a75089891a0af05150eb85f2 to your computer and use it in GitHub Desktop.
Wrapper pattern as per Complete Python Testing Guide
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(),
)
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
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
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