import os import shutil from http import HTTPStatus from unittest.mock import patch import alembic.config import pytest from fastapi.testclient import TestClient from app.web.main import app_factory from app.web.utils.metrics import EXCEPTION_COUNTER def test_lifespan(app): with TestClient(app) as client: r = client.get("/health") assert r.status_code == HTTPStatus.OK assert r.json() == {"status": "ok"} def test_alembic(db_session): alembic.config.main( argv=[ "-c", "./app/migrations/alembic.ini", "--raiseerr", "upgrade", "head", ] ) alembic.config.main( argv=[ "-c", "./app/migrations/alembic.ini", "--raiseerr", "downgrade", "base", ] ) @patch( "app.web.routers.url.crud.soft_delete_archive", side_effect=Exception("mocked error"), ) def test_logging_middleware(m1, client_with_auth): samples_before = len(EXCEPTION_COUNTER.collect()[0].samples) with pytest.raises(Exception, match="mocked error"): client_with_auth.delete("/url/123") # the exception should have created new counter samples assert len(EXCEPTION_COUNTER.collect()[0].samples) == samples_before + 2 def test_serve_local_archive_logic(get_settings): # create a test file first os.makedirs("local_archive_test", exist_ok=True) with open("local_archive_test/temp.txt", "w") as f: f.write("test") try: # modify the settings get_settings.SERVE_LOCAL_ARCHIVE = "/app/local_archive_test" app = app_factory(get_settings) # test client = TestClient(app) r = client.get("/app/local_archive_test/temp.txt") assert r.status_code == HTTPStatus.OK assert r.text == "test" finally: # cleanup shutil.rmtree("local_archive_test")