Skip to content

Objects left on transient state #47

@sponsfreixes

Description

@sponsfreixes

I'm finding that my objects are left on a transient state, and that attributes have the wrong type. I've review the docs and other issues on the issue tracker, and I can't see what I am doing wrong.

I have a pytest.ini file with:

[pytest]
mocked-sessions = my_project.models.db.session

And a conftest.py:

import pytest

from my_project.api.app import create_app
from my_project.models import db


@pytest.fixture(scope="session")
def app():
    app = create_app("my_config_file.py")
    app.testing = True
    return app


@pytest.fixture(scope="session")
def _db(app):
    return db

If you are curious about create_app, it's a straightforward Flask app factory:

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)

    from my_project.models import db

    db.init_app(app)

    from my_project.api.schemas import ma

    ma.init_app(app)

    from my_project.api.resources import api

    api.init_app(app)

    return app

I have this simple test which POSTs a string and a date, used to instantiate and commit a SQLAlchemy model:

@pytest.mark.usefixtures("client_class")
class TestMyRoute:
    def test_create_simple(self, db_session):
        request_payload = {"name": "foo", "my_date": "2022-07-29"}
        resp = self.client.post(LicenseConfigurationCollection.route, json=request_payload)
        assert resp.status_code == HTTPStatus.OK
        assert is_sub_dict(request_payload,resp.json["data"])

The serialization of this response fails. If I set a breakpoint, I see that just before generating the response, after the object has been created, added to the session and commited, this is how the object looks like:

(Pdb) obj
<MyObject (transient 140384149977696)>
(Pdb) obj.my_date
'2022-07-29'
(Pdb) obj.id
(Pdb) obj.created
(Pdb) 

As you can see, the date is on string format, which is not correct as it should be a datetime.date, given that it's declared on the model as my_date = db.Column(db.Date, nullable=True). Also, id and created are not initialized either, as expected of a transient object.

The created object is added to the session and it is committed properly. Proof is that if I remove the db_session fixture, the code works and the record is created on the DB. Using postman I am also able to verify it. Any insight?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions