On Tue, Jun 4, 2019, at 2:15 AM, Chris Withers wrote:
> Hi All,
>
> I'm working with the pattern described at
> https://docs.sqlalchemy.org/en/13/orm/session_transaction.html#joining-a-session-into-an-external-transaction-such-as-for-test-suites
> along with pytest and FastAPI, an async web app framework with good support
> for running blocking code.
>
> So, I have my fixtures:
>
> @pytest.fixture(scope=*'session'*)
> *def *db(client):
engine = Session.kw[*'bind'*]
conn = engine.connect()
transaction = conn.begin()
*try*:
Base.metadata.create_all(bind=conn, checkfirst=*False*)
*yield *conn
*finally*:
transaction.rollback()
Session.configure(bind=engine)
> @pytest.fixture()
> *def *transaction(db):
transaction = db.begin_nested()
*try*:
Session.configure(bind=db)
*yield *transaction
*finally*:
transaction.rollback()
> @pytest.fixture()
> *def *session(transaction):
*return *Session()
>
> And a test:
>
>
> *def *test_create_full_data(transaction, session, client):
response = client.post(*'/events/'*, json={
*'date'*: *'2019-06-02'*,
*'type'*: *'DONE'*,
*'text'*: *'some stuff got done'
** *})
transaction.rollback()
actual = session.query(Event).one()
compare(actual.date, expected=date(2019, 6, 2))
compare(type(actual), expected=Done)
compare(response.json(), expected={
*'id'*: actual.id,
*'date'*: *'2019-06-02'*,
*'type'*: *'DONE'*,
*'text'*: *'some stuff got done'
** *})
compare(response.status_code, expected=201)
>
> And some code:
>
> @router.post(*"/"*, response_model=EventRead, status_code=201)
> *def *create_object(
*,
session: Session = Depends(db_session),
event: EventCreate,
):
"""
> Create new Event.
> """
> *with *session.transaction:
event = Event(**event.dict())
session.add(event)
session.flush()
session.expunge(event)
*return *event
>
>
> Now, what I'm trying to test is that I haven't forgotten to include the "with
> session.transaction". The problem is that, without the
> transaction.rollback(), the test passes regardless of whether the "with
> session.transaction" is there, and with it there, it always fails.
>
> What's the best way for writing tests that have the database setup DDL run
> in a transaction that's rolled back at the end of the session, each test in a
> subtransaction that gets rolled back at the end of each test, and also test
> that code under test is committing or rolling back as required?
So when you make the Session it has a .transaction that you start with, when
you come out of your tests, that should be the same .transaction when you get
the Session back. If it's different, then the test did not leave the Session in
the same state. does that work ?
>
> cheers,
>
> Chris
>
>
> --
> SQLAlchemy -
> The Python SQL Toolkit and Object Relational Mapper
>
> http://www.sqlalchemy.org/
>
> To post example code, please provide an MCVE: Minimal, Complete, and
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full
> description.
> ---
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/sqlalchemy.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sqlalchemy/430d4156-d9ff-4349-5be5-62bee6ea4627%40withers.org
>
> <https://groups.google.com/d/msgid/sqlalchemy/430d4156-d9ff-4349-5be5-62bee6ea4627%40withers.org?utm_medium=email&utm_source=footer>.
> For more options, visit https://groups.google.com/d/optout.
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
To view this discussion on the web visit
https://groups.google.com/d/msgid/sqlalchemy/09de6765-b65b-4a5c-8013-64f2623a18c5%40www.fastmail.com.
For more options, visit https://groups.google.com/d/optout.