'sqlalchemy session for pytest vs session for production

I'm looking for a way to be able to test code using pytest as well as use that code in production, and I'm struggling with session handling.

For pytest, I have a conftest.py that includes:

@pytest.fixture
def session(setup_database, connection):
    transaction = connection.begin()
    yield scoped_session(
        sessionmaker(autocommit=False, autoflush=False, bind=connection)
    )
    transaction.rollback()

That allows me to write low-level tests using a test database along the lines of:

def test_create(session):
    thing = Things(session, "my thing")
    assert thing

...where Things is a sqlalchemy declarative base class defining a database table. This works fine.

The problem I'm trying to solve arises when testing higher levels of the code. The models.py includes:

engine = sqlalchemy.create_engine(
    Config.MYSQL_CONNECT,
    encoding='utf-8',
    pool_pre_ping=True)

Session = scoped_session(sessionmaker(bind=engine))

...and the usage in the code is typically:

def fn():
    with Session() as session:
        thing = Things(session, "my thing")

I want fn() to use the Session defined in models.py in production, but use the pytest Session in testing.

I clearly have this architected incorrectly but I'm struggling to find a way forwards for what must be quite a common problem.

How do others handle this?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source