Testing a Database
In-Memory SQLite
Section titled “In-Memory SQLite”Use in-memory SQLite for fast, isolated tests:
import sqlite3from justapi import JustAPIApp, JustAPITestClient
def get_test_db(): conn = sqlite3.connect(":memory:") conn.execute("CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT)") return conn
app = JustAPIApp()
@app.get("/items")def list_items(): db = get_test_db() cursor = db.execute("SELECT * FROM items") return {"items": cursor.fetchall()}
def test_list_items_empty(): client = JustAPITestClient(app) response = client.get("/items") assert response.status_code == 200 assert response.json() == {"items": []}Transaction Rollback
Section titled “Transaction Rollback”Wrap each test in a transaction and rollback:
import pytest
@pytest.fixturedef db(): conn = sqlite3.connect(":memory:") conn.execute("CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT)") yield conn conn.rollback() # undo all changes conn.close()
def test_create_item(db): db.execute("INSERT INTO items (name) VALUES (?)", ("Widget",)) cursor = db.execute("SELECT * FROM items") assert cursor.fetchone() is not NoneDependency Override for Testing
Section titled “Dependency Override for Testing”from justapi import Depends
def get_db(): return production_db
def override_get_db(): return sqlite3.connect(":memory:")
app = JustAPIApp()app.dependency_overrides[get_db] = override_get_db
def test_handler(): client = JustAPITestClient(app) response = client.get("/items/") assert response.status_code == 200See Also
Section titled “See Also”- Testing — basic testing
- SQL Databases — database setup
- Advanced Dependencies — dependency overrides