|
6 | 6 | from datetime import datetime
|
7 | 7 | import flask
|
8 | 8 | from flask.ext import sqlalchemy
|
| 9 | +from sqlalchemy.orm import sessionmaker |
9 | 10 |
|
10 | 11 |
|
11 | 12 | def make_todo_model(db):
|
@@ -414,6 +415,38 @@ class FOOBar(db.Model):
|
414 | 415 | db.session.add(fb)
|
415 | 416 | assert fb not in db.session # because a new scope is generated on each call
|
416 | 417 |
|
| 418 | +class StandardSessionTestCase(unittest.TestCase): |
| 419 | + def test_insert_update_delete(self): |
| 420 | + # Ensure _SignalTrackingMapperExtension doesn't croak when |
| 421 | + # faced with a vanilla SQLAlchemy session. |
| 422 | + # |
| 423 | + # Verifies that "AttributeError: 'SessionMaker' object has no attribute '_model_changes'" |
| 424 | + # is not thrown. |
| 425 | + app = flask.Flask(__name__) |
| 426 | + app.config['SQLALCHEMY_ENGINE'] = 'sqlite://' |
| 427 | + app.config['TESTING'] = True |
| 428 | + db = sqlalchemy.SQLAlchemy(app) |
| 429 | + Session = sessionmaker(bind=db.engine) |
| 430 | + |
| 431 | + class QazWsx(db.Model): |
| 432 | + id = db.Column(db.Integer, primary_key=True) |
| 433 | + x = db.Column(db.String, default='') |
| 434 | + |
| 435 | + db.create_all() |
| 436 | + session = Session() |
| 437 | + session.add(QazWsx()) |
| 438 | + session.flush() # issues an INSERT. |
| 439 | + session.expunge_all() |
| 440 | + qaz_wsx = session.query(QazWsx).first() |
| 441 | + assert qaz_wsx.x == '' |
| 442 | + qaz_wsx.x = 'test' |
| 443 | + session.flush() # issues an UPDATE. |
| 444 | + session.expunge_all() |
| 445 | + qaz_wsx = session.query(QazWsx).first() |
| 446 | + assert qaz_wsx.x == 'test' |
| 447 | + session.delete(qaz_wsx) # issues a DELETE. |
| 448 | + assert session.query(QazWsx).first() is None |
| 449 | + |
417 | 450 |
|
418 | 451 | class CommitOnTeardownTestCase(unittest.TestCase):
|
419 | 452 |
|
@@ -463,6 +496,7 @@ def suite():
|
463 | 496 | suite.addTest(unittest.makeSuite(CommitOnTeardownTestCase))
|
464 | 497 | if flask.signals_available:
|
465 | 498 | suite.addTest(unittest.makeSuite(SignallingTestCase))
|
| 499 | + suite.addTest(unittest.makeSuite(StandardSessionTestCase)) |
466 | 500 | return suite
|
467 | 501 |
|
468 | 502 |
|
|
0 commit comments