0

In order to test my flask application, I setup a local SQLite DB with create_engine. To delete, I have my route call TablesEtl().delete_record_by_id().

class TablesEtl:
    def __init__(self) -> None:
        self.engine = create_engine(get_database_engine_uri(), connect_args={"check_same_thread": False})

    def get_session(self) -> Session:
        session = Session(self.engine, autoflush=False)
        return session

    def delete_record_by_id(self, record_id: int, table: Base) -> None:
        session = self.get_session()
        session.query(table).filter(table.id == record_id).delete()
        session.commit()
        session.close()

    def get_record_by_id(self, record_id: int, table: Base) -> dict:
        session = self.get_session()
        query: Base = Query(table, session=session).filter(table.id == record_id).first()
        session.close()
        if query is None:
            return {}

        info = {}
        counting = 0
        for field in query.__table__.columns.keys():
            info[field.replace("_", "-")] = getattr(query, field)
            counting += 1
        return info

The test_delete is done by creating a record, deleting it through this route and then requesting to the "information" route, information about the record I've just created. It should return a 404, since the record doesn't exist.

The problem is that it returns 200 and the correct information about the record I've just created.

This didn't occured when I ran the tests with pytest alone, but now I'm running with pytest-xdist and I think the second request is coming before the record was actually deleted. I also noticed that a db-name.db-journal was created side by side with my original db-name.db.

def test_not_finding_model_info_after_delete(self) -> None:
    model_id = create_model_on_client(self.client, self.authorization_header, "Model Name")
    self.client.delete(API_DELETE_MODEL, headers=self.authorization_header, json={"model-id": model_id})
    response = get_model(self.client, self.authorization_header, model_id)
    self.assertEqual(404, response.status_code)

When I run it with some time.sleep it works, but I don't want to depend upon a sleep for it to work and when I run pytest a second time with --lf option it works, but I believe it's because there are less calls being made to the db. When I get all the records that were asked to be deleted and check against the db, they are in fact deleted. I believe it's something to do with this .db-journal.

Can someone shade a light to it? Another DB would be better for this problem?

Rafael
  • 1
  • 1

0 Answers0