#!/usr/bin/env python3 """Tests for database-backed report API routes.""" from __future__ import annotations import tempfile import unittest from pathlib import Path from unittest.mock import patch from app.db import connect from app.db import repositories as repo from app.web import create_app class ReportRoutesTest(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.TemporaryDirectory() self.conn = connect(str(Path(self.temp_dir.name) / "test.db")) self.app = create_app() self.app.config["TESTING"] = True self.client = self.app.test_client() self.connection_patch = patch("app.db.get_connection", return_value=self.conn) self.connection_patch.start() self.artifact_id = repo.insert_report_artifact( self.conn, source="copyparty", report_type="text_report", generated_at="2026-11-06T10:00:00+00:00", payload={"format": "text", "content": "summary"}, original_path="copyparty/2026-11-06.txt", content_sha256="b" * 64, ) def tearDown(self): self.connection_patch.stop() self.conn.close() self.temp_dir.cleanup() def test_list_detail_and_text_export(self): listed = self.client.get("/api/reports?source=copyparty&limit=1") self.assertEqual(listed.status_code, 200) self.assertEqual(listed.json["items"][0]["id"], self.artifact_id) detail = self.client.get( f"/api/report-artifacts/{self.artifact_id}") self.assertEqual(detail.status_code, 200) self.assertEqual(detail.json["payload"]["content"], "summary") exported = self.client.get( f"/api/report-artifacts/{self.artifact_id}/export?format=txt") self.assertEqual(exported.status_code, 200) self.assertEqual(exported.data.decode(), "summary") self.assertIn("attachment", exported.headers["Content-Disposition"]) self.assertNotIn(".txt.txt", exported.headers["Content-Disposition"]) def test_invalid_source_cursor_and_missing_id(self): self.assertEqual( self.client.get("/api/reports?source=unknown").status_code, 400) self.assertEqual( self.client.get("/api/reports?cursor=invalid").status_code, 400) self.assertEqual( self.client.get("/api/report-artifacts/9999").status_code, 404) def test_legacy_file_routes_remain_registered(self): response = self.client.get("/api/reports/copyparty") self.assertEqual(response.status_code, 200) self.assertIn("files", response.json) if __name__ == "__main__": unittest.main()