When trying to test 2 or more functions in a single file using pytest in FastAPI, the following error occurs.
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
==================================================================== short test summary info =====================================================================
FAILED app/test/test_subscriptions.py::test_post_subscriptions - RuntimeError: Event loop is closed
============================================================ 1 failed, 1 passed, 16 warnings in 7.45s ============================================================
Here is the code at that time.
Here is the SetUp and TearDown processing:
class TestingSession(Session):
    def commit(self):
        self.flush()
        self.expire_all()
@pytest.fixture(scope="function")
def test_db():
    # Set Up
    TestSessionLocal = sessionmaker(
        class_=TestingSession,
        autocommit=False,
        autoflush=False,
        bind=engine
    )
    db = TestSessionLocal()
    def get_db_for_testing():
        try:
            yield db
            db.commit()
        except SQLAlchemyError as e:
            assert e is not None
            db.rollback()
    app.dependency_overrides[get_db] = get_db_for_testing
    # Test
    yield db
    # Tear Down
    db.rollback()
    close_all_sessions()
    engine.dispose()
These are the 2 test functions:
def test_read_subscriptions(test_db):
    test_team = test_db.query(Team).filter(
        Team.email == "unit_test_get@example.com"
    ).first()
    response = client.get(f'/api/v1/teams/{test_team.id}/subscriptions')
    assert response.status_code == 200
# intentionally duplicated the same function
def test_read_subscriptions_2(test_db):
    test_team = test_db.query(Team).filter(
        Team.email == "unit_test_get@example.com"
    ).first()
    response = client.get(f'/api/v1/teams/{test_team.id}/subscriptions')
    assert response.status_code == 200
This is the code for the middleware that is written in "main.py". When this is commented out, the test process works correctly.
@app.middleware("http")
async def log_middleware(request: Request, call_next):
    # create request ID
    request_id = str(uuid.uuid4())
    request.state.request_id = request_id
    logger = logging.getLogger("my_logger")
    is_not_develop_path = request.url.path not in ["/docs", "/openapi.json"]
    if is_not_develop_path:
        # request log
        logger.info(f"Request ID={request_id}, Method={request.method}, URL={request.url}")
    # calcurate processing time
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    if is_not_develop_path:
        # response log
        if 400 <= response.status_code < 600:
            # Log error if response status is 4xx or 5xx
            logger.error(f"Response ID={request_id}, Status={response.status_code}, ProcessTime={process_time}s")
        else:
            # Otherwise log info
            logger.info(f"Response ID={request_id}, Status={response.status_code}, ProcessTime={process_time}s")
    if is_not_develop_path:
        # write log to MongoDB
        await userLogsCrud.create_log(request=request)
    return response
Where the mistake would be?
I'm beginner in Python and don't have a good understanding in async IO!
I would appreciate it if you could let me know.
