Created
March 2, 2014 01:33
-
-
Save inconshreveable/9300571 to your computer and use it in GitHub Desktop.
sqlalchemy test cases for bug in listen() on Engine events fired on the Connection
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sqlalchemy | |
from sqlalchemy import create_engine, Column, Integer | |
from sqlalchemy.orm import sessionmaker | |
from sqlalchemy.ext.declarative import declarative_base | |
def setup(): | |
# set up a simple in memory sqlite db with two table | |
engine = create_engine('sqlite:///:memory:') | |
Base = declarative_base(bind=engine) | |
class A(Base): | |
__tablename__ = "a" | |
id = Column("id", Integer, primary_key = True) | |
Base.metadata.create_all(engine) | |
Session = sessionmaker(bind=engine) | |
return engine, A, Session | |
def test_session_before_listen(): | |
engine, A, Session = setup() | |
got_event = [] | |
def before_execute_cb(*args): | |
got_event.append(True) | |
sess = Session() | |
sqlalchemy.event.listen(engine, "before_execute", before_execute_cb) | |
sess.query(A).all() | |
# OK | |
assert len(got_event) == 1 | |
def test_query_before_listen(): | |
engine, A, Session = setup() | |
got_event = [] | |
def before_execute_cb(*args): | |
got_event.append(True) | |
sess = Session() | |
sess.query(A).all() | |
sqlalchemy.event.listen(engine, "before_execute", before_execute_cb) | |
sess2 = Session() | |
sess2.query(A).all() | |
# OK | |
assert len(got_event) == 1 | |
def test_query_before_listen_same_session(): | |
engine, A, Session = setup() | |
got_event = [] | |
def before_execute_cb(*args): | |
got_event.append(True) | |
sess = Session() | |
sess.query(A).all() | |
sqlalchemy.event.listen(engine, "before_execute", before_execute_cb) | |
sess.query(A).all() # <--- USE THE SAME SESSION AS BEFORE | |
# FAIL | |
assert len(got_event) == 1 | |
def test_query_with_pre_registered_dummy_listener(): | |
engine, A, Session = setup() | |
got_event = [] | |
def before_execute_cb(*args): | |
got_event.append(True) | |
def foo(*args): | |
pass | |
sqlalchemy.event.listen(engine, "before_execute", foo) # <--- Register a dummy listener to force sqlalchemy to join the Connection's dispatch descriptor with the Engine's | |
sess = Session() | |
sess.query(A).all() | |
sqlalchemy.event.listen(engine, "before_execute", before_execute_cb) | |
sess.query(A).all() # <--- USE THE SAME SESSION AS BEFORE | |
# OK | |
assert len(got_event) == 1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment