Skip to content

Commit f9c6661

Browse files
committed
Ditch scoped session stuff, use orm-independent transaction instead
1 parent 73aff6e commit f9c6661

File tree

4 files changed

+26
-14
lines changed

4 files changed

+26
-14
lines changed

example_app/db.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
from sqlalchemy.orm import scoped_session, sessionmaker
66
import os
77

8-
Base = declarative_base()
9-
Session = scoped_session(sessionmaker(expire_on_commit=False))
108
engine = create_engine(os.environ['DATABASE_URL'])
11-
Session.configure(bind=engine)
9+
10+
Base = declarative_base(bind=engine)
11+
12+
Session = sessionmaker(expire_on_commit=False, bind=engine)
13+
14+
session = Session()
1215

1316

1417
class User(Base):

pytest_sqlalchemy.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,12 @@ def sqlalchemy_session():
158158

159159

160160
@pytest.fixture(scope='session')
161-
def connection(test_engine, sqlalchemy_base, sqlalchemy_session):
161+
def connection(request, test_engine, sqlalchemy_base, sqlalchemy_session):
162162

163163
sqlalchemy_base.metadata.bind = test_engine
164164
sqlalchemy_base.metadata.create_all(test_engine)
165165

166166
with test_engine.connect() as conn:
167-
sqlalchemy_session.registry.clear()
168-
sqlalchemy_session.configure(bind=conn)
169167
yield conn
170168

171169
sqlalchemy_base.metadata.drop_all()
@@ -174,11 +172,11 @@ def connection(test_engine, sqlalchemy_base, sqlalchemy_session):
174172
@pytest.fixture
175173
def db_session(request, connection, sqlalchemy_session, monkeypatch):
176174

177-
monkeypatch.setattr(sqlalchemy_session, 'commit', sqlalchemy_session.flush)
178-
monkeypatch.setattr(sqlalchemy_session, 'remove', lambda: None)
175+
transaction = connection.begin()
176+
sqlalchemy_session.bind = connection
179177

180-
@request.addfinalizer
181-
def finalize():
182-
sqlalchemy_session.rollback()
178+
yield sqlalchemy_session
179+
180+
transaction.rollback()
181+
sqlalchemy_session.close()
183182

184-
return sqlalchemy_session()

tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import pytest
22
pytest_plugins = 'pytester'
33

4-
from example_app.db import Base, Session
4+
from example_app.db import Base, session
55

66
@pytest.fixture(scope='session')
77
def sqlalchemy_base():
88
return Base
99

1010
@pytest.fixture(scope='session')
1111
def sqlalchemy_session():
12-
return Session
12+
return session

tests/test_db_fixture.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,16 @@ def test_create_user(db_session):
66
db_session.flush()
77
assert db_session.query(User).count() == 1
88

9+
def test_update_object(db_session):
10+
user = User(name='The User')
11+
db_session.add(user)
12+
db_session.flush()
13+
assert db_session.query(User).count() == 1
14+
15+
user.name = 'Bongo'
16+
db_session.commit()
17+
18+
db_session.query(User).filter(User.name=='Bongo').one()
19+
920
def test_tests_run_in_transactions(db_session):
1021
assert db_session.query(User).count() == 0

0 commit comments

Comments
 (0)