Skip to main content

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

fixture_foundry-0.2.1.tar.gz (24.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fixture_foundry-0.2.1-py3-none-any.whl (14.1 kB view details)

Uploaded Python 3

File details

Details for the file fixture_foundry-0.2.1.tar.gz.

File metadata

  • Download URL: fixture_foundry-0.2.1.tar.gz
  • Upload date:
  • Size: 24.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.28.1

File hashes

Hashes for fixture_foundry-0.2.1.tar.gz
Algorithm Hash digest
SHA256 85087ee0209a388c5228c9a07b83fb3969f668501c665d10e5cac9fc2eeca817
MD5 011853431f1af387dcf7ea0f6f1a0342
BLAKE2b-256 0ef1e959b97dce223e9f5cc8fe0b51750832cda51b3cece174afc5da1313b069

See more details on using hashes here.

File details

Details for the file fixture_foundry-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for fixture_foundry-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fe8110f3fbb8de0cb1ae97e8bacee518125091d5a3618279e084e17d34c8338d
MD5 1303fbc1357109e9312a51c451468611
BLAKE2b-256 1c1ec5a9e29335dadfba07574339873ab0f84d5c5361a4e230625dc3f935b97b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page