mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
57 lines
1.4 KiB
Python
57 lines
1.4 KiB
Python
import pytest
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
from sqlmodel import SQLModel
|
|
from backend.app.db.base import Base
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
|
def engine(postgresql):
|
|
"""
|
|
Create a SQLAlchemy engine bound to the ephemeral
|
|
pytest-postgresql database.
|
|
"""
|
|
|
|
# Build SQLAlchemy URL from psycopg connection info
|
|
connection_string = (
|
|
f"postgresql+psycopg://"
|
|
f"{postgresql.info.user}:"
|
|
f"{postgresql.info.password}@"
|
|
f"{postgresql.info.host}:"
|
|
f"{postgresql.info.port}/"
|
|
f"{postgresql.info.dbname}"
|
|
)
|
|
|
|
engine = create_engine(connection_string)
|
|
|
|
# Create tables once per test session
|
|
Base.metadata.create_all(engine)
|
|
SQLModel.metadata.create_all(engine)
|
|
|
|
# Yeild will split this function into two phase. 1) setup and 2) teardown, the latter of which will run after all
|
|
# tests have completed
|
|
yield engine
|
|
|
|
# Clean-up after entire test session
|
|
Base.metadata.drop_all(engine)
|
|
engine.dispose()
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
|
def db_session(engine):
|
|
"""
|
|
Provides a clean transactional session per test.
|
|
|
|
Rolls back after each test to keep isolation.
|
|
"""
|
|
|
|
connection = engine.connect()
|
|
transaction = connection.begin()
|
|
|
|
session = sessionmaker(bind=connection)()
|
|
|
|
yield session
|
|
|
|
session.close()
|
|
transaction.rollback()
|
|
connection.close()
|