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.3.tar.gz (25.6 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.3-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

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

Hashes for fixture_foundry-0.2.3.tar.gz
Algorithm Hash digest
SHA256 8b2053309f0dde686fd59a5eddac46bcbcffd812886ed9e6933b61010bbf1ed5
MD5 c3ce075b811049c5f82c4a203d124df5
BLAKE2b-256 1e95848c9cdbae426784780a126896096b6ecf45a33c00c3001308a52b2b77be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fixture_foundry-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 1512ab36c5923b955fb1a67c927e92af1e6ad9d103f7dabc6fb7b12d3db580cf
MD5 0f6a28527fb1ac4e5d798dbcb070d2eb
BLAKE2b-256 6ad2a88e31190552332e58848710c3b79af01a0bad88927ff672bceef0d8117d

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