72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
#!/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()
|