Fixtures and helpers to create AWS infrastructure (via LocalStack) and containerized databases locally for fast, reproducible integration testing.
Project description
Fixture Foundry
Pytest fixtures and context managers for ephemeral integration testing infrastructure: LocalStack (AWS services), PostgreSQL containers, and Pulumi deployment automation.
Features
- Session-scoped fixtures:
localstack,postgres,container_network - Context managers: Standalone infrastructure orchestration for dev scripts
- Pulumi Automation:
deploy()helper targets LocalStack automatically - Database seeding:
exec_sql_file()loads SQL schemas with transaction support - URL translation:
to_localstack_url()converts AWS Gateway URLs to LocalStack endpoints - Auto-cleanup: Health checks, retries, and teardown on test completion
Installation
pip install fixture-foundry docker requests pytest psycopg2-binary
# Optional for Pulumi deployment:
pip install pulumi pulumi-aws
Requirements: Python 3.8–3.12, Docker
Quick Start
Setup pytest fixtures in conftest.py
import pytest
from fixture_foundry import localstack, postgres, container_network # noqa: F401
def pytest_addoption(parser):
g = parser.getgroup("localstack")
g.addoption("--teardown", default="true")
g.addoption("--localstack-port", type=int, default=0) # 0 = random port
g.addoption("--database-image", default="postgres:16")
Database with Schema Loading
from pathlib import Path
import psycopg2
from fixture_foundry import postgres, exec_sql_file
@pytest.fixture(scope="session")
def test_db(postgres):
# Load schema from SQL file
schema_file = Path(__file__).parent / "schema.sql"
conn = psycopg2.connect(postgres["dsn"])
conn.autocommit = True # Required for multi-statement scripts
exec_sql_file(conn, schema_file)
conn.close()
yield postgres
Pulumi Deployment to LocalStack
import json
from fixture_foundry import deploy, to_localstack_url
def my_pulumi_program():
# Your Pulumi resources here
pulumi.export("api_url", "https://example.execute-api.us-east-1.amazonaws.com")
@pytest.fixture(scope="module")
def api_stack(test_db, localstack):
with deploy("my-project", "test", my_pulumi_program, localstack=localstack) as outputs:
yield outputs
@pytest.fixture(scope="module")
def api_endpoint(api_stack, localstack):
# Convert AWS Gateway URL to LocalStack endpoint
aws_url = api_stack["api_url"]
yield to_localstack_url(aws_url, localstack["port"])
def test_api_call(api_endpoint):
import requests
response = requests.get(f"{api_endpoint}/health")
assert response.status_code == 200
Context Managers (for dev scripts)
from pathlib import Path
import psycopg2
from fixture_foundry import postgres_context, localstack_context, deploy, exec_sql_file
# Standalone usage outside pytest
with postgres_context(database="mydb") as pg:
# Seed database with schema
conn = psycopg2.connect(pg["dsn"])
conn.autocommit = True
exec_sql_file(conn, Path("schema.sql"))
conn.close()
with localstack_context() as ls:
with deploy("proj", "stack", program, localstack=ls) as outputs:
# Infrastructure is now running - execute your dev workflow
api_url = outputs['endpoint']
print(f"API deployed at: {api_url}")
# Start frontend dev server, run manual tests, etc.
# subprocess.run(["npm", "run", "dev"], env={"VITE_API_URL": api_url})
# Or keep running for interactive development...
API Reference
Fixtures (session-scoped)
| Fixture | Yields | Description |
|---|---|---|
container_network |
str |
Docker bridge network name (default: "ls-dev") |
postgres |
dict |
PostgreSQL container with dsn, host_port, container_name, credentials |
localstack |
dict |
LocalStack container with endpoint_url, port, region, services |
Functions
| Function | Purpose |
|---|---|
deploy(project, stack, program, localstack=None, teardown=True) |
Pulumi Automation API context manager |
exec_sql_file(conn, path) |
Execute SQL file (supports multi-statement, DO $$ blocks) |
to_localstack_url(aws_url, edge_port=4566) |
Convert AWS Gateway URL to LocalStack endpoint |
Connection Patterns
- Container-to-container: Use
postgres["container_name"]:5432(Docker network) - Host-to-container: Use
localhost:{postgres["host_port"]}(port mapping) - Lambda-to-DB: Requires shared Docker network (automatic with LocalStack)
Environment Variables
AWS_REGION/AWS_DEFAULT_REGION: AWS region (default: us-east-1)DOCKER_TEST_NETWORK: Override network name (default: ls-dev)LAMBDA_DOCKER_NETWORK: Set by LocalStack for container connectivity
CLI Options
Add to your conftest.py via pytest_addoption():
--teardown=true|false: Control resource cleanup--localstack-port=0: LocalStack port (0 = random)--database-image=postgres:16: PostgreSQL Docker image--localstack-image=localstack/localstack:latest: LocalStack image
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fixture_foundry-0.2.3.tar.gz.
File metadata
- Download URL: fixture_foundry-0.2.3.tar.gz
- Upload date:
- Size: 25.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b2053309f0dde686fd59a5eddac46bcbcffd812886ed9e6933b61010bbf1ed5
|
|
| MD5 |
c3ce075b811049c5f82c4a203d124df5
|
|
| BLAKE2b-256 |
1e95848c9cdbae426784780a126896096b6ecf45a33c00c3001308a52b2b77be
|
File details
Details for the file fixture_foundry-0.2.3-py3-none-any.whl.
File metadata
- Download URL: fixture_foundry-0.2.3-py3-none-any.whl
- Upload date:
- Size: 15.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1512ab36c5923b955fb1a67c927e92af1e6ad9d103f7dabc6fb7b12d3db580cf
|
|
| MD5 |
0f6a28527fb1ac4e5d798dbcb070d2eb
|
|
| BLAKE2b-256 |
6ad2a88e31190552332e58848710c3b79af01a0bad88927ff672bceef0d8117d
|