templates: add multi-category filter (repeatable or CSV) to GET /api/templates/search; add has_keywords filter; add categories listing endpoint with counts; update docs; add tests

This commit is contained in:
HotSwapp
2025-08-15 15:04:40 -05:00
parent 21c6b285d6
commit e3a279dba7
17 changed files with 3727 additions and 2 deletions

View File

@@ -0,0 +1,76 @@
import io
from fastapi.testclient import TestClient
from app.main import app
from app.auth.security import get_current_user
def _csv_file(name: str, text: str):
return ("files", (name, io.BytesIO(text.encode("utf-8")), "text/csv"))
def test_batch_import_includes_pension_aux_files_and_read_endpoints():
# Auth override
app.dependency_overrides[get_current_user] = lambda: {
"id": 1,
"username": "tester",
"is_admin": True,
"is_active": True,
}
client = TestClient(app)
# Minimal seed for dependent data
rolodex_csv = "Id,Last\nR1,Alpha\n"
files_csv = "File_No,Id,File_Type,Regarding,Opened,Empl_Num,Status,Rate_Per_Hour\nF-1,R1,CIVIL,Test,2024-01-01,E01,ACTIVE,100\n"
schedule_csv = "File_No,Version,Vests_On,Vests_At\nF-1,01,2024-01-01,100\n"
marriage_csv = (
"File_No,Version,Married_From,Married_To,Married_Years,Service_From,Service_To,Service_Years,Marital_%\n"
"F-1,01,2000-01-01,2010-01-01,10,1995-01-01,2010-01-01,15,50\n"
)
death_csv = "File_No,Version,Lump1,Lump2,Growth1,Growth2,Disc1,Disc2\nF-1,01,1000,0,0,0,0,0\n"
separate_csv = "File_No,Version,Separation_Rate\nF-1,01,Terms\n"
payload = [
_csv_file("ROLODEX.csv", rolodex_csv),
_csv_file("FILES.csv", files_csv),
_csv_file("SCHEDULE.csv", schedule_csv),
_csv_file("MARRIAGE.csv", marriage_csv),
_csv_file("DEATH.csv", death_csv),
_csv_file("SEPARATE.csv", separate_csv),
]
# Batch upload
resp = client.post("/api/import/batch-upload", files=payload)
assert resp.status_code == 200
body = resp.json()
results = body.get("batch_results", [])
# Ensure each target file is reported as processed with at least one row
by_name = {r.get("file_type"): r for r in results}
for name in ("SCHEDULE.csv", "MARRIAGE.csv", "DEATH.csv", "SEPARATE.csv"):
assert name in by_name
assert by_name[name].get("imported_count", 0) >= 1
# Call read endpoints
r1 = client.get("/api/pensions/schedules", params={"file_no": "F-1"})
assert r1.status_code == 200
assert isinstance(r1.json(), list)
r2 = client.get("/api/pensions/marriages", params={"file_no": "F-1"})
assert r2.status_code == 200
assert isinstance(r2.json(), list)
r3 = client.get("/api/pensions/death-benefits", params={"file_no": "F-1"})
assert r3.status_code == 200
assert isinstance(r3.json(), list)
r4 = client.get("/api/pensions/separations", params={"file_no": "F-1"})
assert r4.status_code == 200
assert isinstance(r4.json(), list)
# Cleanup override
app.dependency_overrides.pop(get_current_user, None)