You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
motief/tests/utils/migration_fixtures.py

66 lines
2.1 KiB

"""
Test helper fixtures for database migrations.
Provides a pytest fixture `test_db` that inspects the environment variable
`TEST_DB_URL` to decide what to yield:
- If `TEST_DB_URL` is not set, the fixture yields None. This allows tests to
be skipped or operate in a no-database mode in CI or local runs where a
test database is not available.
- If `TEST_DB_URL` is set and starts with "sqlite", an sqlite3 connection is
created via `sqlite3.connect` and yielded. The connection is closed after
the test completes.
Decision: keep this fixture lightweight and focused on sqlite for local
smoke-testing. If other database backends are needed later, expand this
fixture accordingly.
"""
from typing import Optional
import os
import sqlite3
import pytest
@pytest.fixture
def test_db():
"""Yield a test database connection or None.
Behavior:
- If TEST_DB_URL is not set in the environment, yield None.
- If TEST_DB_URL is set and begins with 'sqlite', open an sqlite3
connection and yield it. The connection will be closed when the test
finishes.
"""
url = os.environ.get("TEST_DB_URL")
if not url:
yield None
return
# Only support sqlite URLs in this lightweight fixture.
if url.startswith("sqlite"):
# For sqlite URLs, accept either a bare file path or a file:// style
# URL. sqlite3.connect handles file paths; if a file:// prefix is
# present, strip it.
path = url
if path.startswith("sqlite:///"):
# sqlite:///path => /path
path = path[len("sqlite:///") :]
elif path.startswith("sqlite://"):
path = path[len("sqlite://") :]
conn = sqlite3.connect(path)
try:
yield conn
finally:
try:
conn.close()
except Exception:
# Best-effort close; tests shouldn't fail on close errors.
pass
return
# Unknown or unsupported TEST_DB_URL scheme — yield None to keep tests
# tolerant in environments where the fixture can't create a connection.
yield None