fixtures¶
Here's the reference for the fixture registry, enums, and loading utilities.
You can import them directly from fastapi_toolsets.fixtures:
from fastapi_toolsets.fixtures import (
Context,
LoadStrategy,
Fixture,
FixtureRegistry,
load_fixtures,
load_fixtures_by_context,
get_obj_by_attr,
)
fastapi_toolsets.fixtures.enum.Context
¶
Predefined fixture contexts.
BASE = 'base'
class-attribute
instance-attribute
¶
Base fixtures loaded in all environments.
DEVELOPMENT = 'development'
class-attribute
instance-attribute
¶
Development fixtures.
PRODUCTION = 'production'
class-attribute
instance-attribute
¶
Production-only fixtures.
TESTING = 'testing'
class-attribute
instance-attribute
¶
Test fixtures.
fastapi_toolsets.fixtures.enum.LoadStrategy
¶
Strategy for loading fixtures into the database.
INSERT = 'insert'
class-attribute
instance-attribute
¶
Insert new records. Fails if record already exists.
MERGE = 'merge'
class-attribute
instance-attribute
¶
Insert or update based on primary key (SQLAlchemy merge).
SKIP_EXISTING = 'skip_existing'
class-attribute
instance-attribute
¶
Insert only if record doesn't exist (based on primary key).
fastapi_toolsets.fixtures.registry.Fixture
dataclass
¶
A fixture definition with metadata.
fastapi_toolsets.fixtures.registry.FixtureRegistry
¶
Registry for managing fixtures with dependencies.
Example
from fastapi_toolsets.fixtures import FixtureRegistry, Context
fixtures = FixtureRegistry()
@fixtures.register
def roles():
return [
Role(id=1, name="admin"),
Role(id=2, name="user"),
]
@fixtures.register(depends_on=["roles"])
def users():
return [
User(id=1, username="admin", role_id=1),
]
@fixtures.register(depends_on=["users"], contexts=[Context.TESTING])
def test_data():
return [
Post(id=1, title="Test", user_id=1),
]
get(name)
¶
Get a fixture by name.
get_all()
¶
Get all registered fixtures.
get_by_context(*contexts)
¶
Get fixtures for specific contexts.
include_registry(registry)
¶
Include another FixtureRegistry in the same current FixtureRegistry.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
registry
|
FixtureRegistry
|
The |
required |
Raises:
| Type | Description |
|---|---|
ValueError
|
If a fixture name already exists in the current registry |
register(func=None, *, name=None, depends_on=None, contexts=None)
¶
Register a fixture function.
Can be used as a decorator with or without arguments.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
func
|
Callable[[], Sequence[DeclarativeBase]] | None
|
Fixture function returning list of model instances |
None
|
name
|
str | None
|
Fixture name (defaults to function name) |
None
|
depends_on
|
list[str] | None
|
List of fixture names this depends on |
None
|
contexts
|
list[str | Context] | None
|
List of contexts this fixture belongs to |
None
|
resolve_context_dependencies(*contexts)
¶
resolve_dependencies(*names)
¶
Resolve fixture dependencies in topological order.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
*names
|
str
|
Fixture names to resolve |
()
|
Returns:
| Type | Description |
|---|---|
list[str]
|
List of fixture names in load order (dependencies first) |
Raises:
| Type | Description |
|---|---|
KeyError
|
If a fixture is not found |
ValueError
|
If circular dependency detected |
fastapi_toolsets.fixtures.utils.load_fixtures(session, registry, *names, strategy=LoadStrategy.MERGE)
async
¶
Load specific fixtures by name with dependencies.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
session
|
AsyncSession
|
Database session |
required |
registry
|
FixtureRegistry
|
Fixture registry |
required |
*names
|
str
|
Fixture names to load (dependencies auto-resolved) |
()
|
strategy
|
LoadStrategy
|
How to handle existing records |
MERGE
|
Returns:
| Type | Description |
|---|---|
dict[str, list[DeclarativeBase]]
|
Dict mapping fixture names to loaded instances |
fastapi_toolsets.fixtures.utils.load_fixtures_by_context(session, registry, *contexts, strategy=LoadStrategy.MERGE)
async
¶
Load all fixtures for specific contexts.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
session
|
AsyncSession
|
Database session |
required |
registry
|
FixtureRegistry
|
Fixture registry |
required |
*contexts
|
str | Context
|
Contexts to load (e.g., Context.BASE, Context.TESTING) |
()
|
strategy
|
LoadStrategy
|
How to handle existing records |
MERGE
|
Returns:
| Type | Description |
|---|---|
dict[str, list[DeclarativeBase]]
|
Dict mapping fixture names to loaded instances |
fastapi_toolsets.fixtures.utils.get_obj_by_attr(fixtures, attr_name, value)
¶
Get a SQLAlchemy model instance by matching an attribute value.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
fixtures
|
Callable[[], Sequence[T]]
|
A fixture function registered via |
required |
attr_name
|
str
|
Name of the attribute to match against. |
required |
value
|
Any
|
Value to match. |
required |
Returns:
| Type | Description |
|---|---|
T
|
The first model instance where the attribute matches the given value. |
Raises:
| Type | Description |
|---|---|
StopIteration
|
If no matching object is found in the fixture group. |