import pytest XLSX_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" @pytest.mark.parametrize( "sheet", ["FORM_1", "FORM_2", "FORM_3", "FORM_4", "MAIN"], ) def test_summary_sheets_smoke(client, admin_tokens, auth_headers, sheet): response = client.get( f"/api/v1/svod/1/{sheet}/2026", headers=auth_headers(admin_tokens), ) assert response.status_code == 200, f"sheet={sheet}: {response.text}" payload = response.json() assert "result" in payload assert "count" in payload assert isinstance(payload["result"], list) def test_summary_sheet_with_org_ids(client, admin_tokens, auth_headers): response = client.get( "/api/v1/svod/1/FORM_1/2026?org_ids=1,2,3", headers=auth_headers(admin_tokens), ) assert response.status_code == 200 payload = response.json() assert "result" in payload assert payload["result"] row = payload["result"][0] assert "row_type" in row assert "depth" in row assert "data" in row def test_summary_sheet_unknown(client, admin_tokens, auth_headers): response = client.get( "/api/v1/svod/1/unknown_sheet/2026", headers=auth_headers(admin_tokens), ) assert response.status_code == 404 @pytest.mark.parametrize("sheet", ["GO", "RF"]) def test_summary2_sheets_smoke(client, admin_tokens, auth_headers, sheet): response = client.get( f"/api/v1/svod/2/{sheet}/2026", headers=auth_headers(admin_tokens), ) assert response.status_code == 200, f"sheet={sheet}: {response.text}" payload = response.json() assert "result" in payload assert "count" in payload assert isinstance(payload["result"], list) if payload["result"]: row = payload["result"][0] assert row["row_type"] == "INPUT" assert row["depth"] == 3 assert "sort_order" in row assert "data" in row data = row["data"] header = data["header"] assert { "org_name", "source_id", "smeta_type", "source_form", "source_org_unit_id", "smeta_direction", } <= header.keys() assert "source_sheet" not in data assert "source_sheet" not in header assert { "plan", "sequestration", "reserve", "contract_summary", "allocation", "collegial", "ckk", "contract_detail", "booking", "q1", "q2", "q3", "q4", } <= data.keys() def test_summary2_sheet_with_org_ids(client, admin_tokens, auth_headers): response = client.get( "/api/v1/svod/2/GO/2026?org_ids=1,2,3", headers=auth_headers(admin_tokens), ) assert response.status_code == 200 def test_summary2_pagination(client, admin_tokens, auth_headers): response = client.get( "/api/v1/svod/2/GO/2026?offset=0&limit=2", headers=auth_headers(admin_tokens), ) assert response.status_code == 200 payload = response.json() assert payload["count"] <= 2 assert len(payload["result"]) <= 2 @pytest.mark.parametrize("sort_by", ["org_name", "section_code"]) @pytest.mark.parametrize("sort_direction", ["asc", "desc"]) def test_summary2_sorting( client, admin_tokens, auth_headers, sort_by, sort_direction, ): response = client.get( f"/api/v1/svod/2/GO/2026?limit=2&sort_by={sort_by}&sort_direction={sort_direction}", headers=auth_headers(admin_tokens), ) assert response.status_code == 200 @pytest.mark.parametrize( "query", ["offset=-1", "limit=0", "sort_by=bad", "sort_direction=bad"], ) def test_summary2_invalid_pagination(client, admin_tokens, auth_headers, query): response = client.get( f"/api/v1/svod/2/GO/2026?{query}", headers=auth_headers(admin_tokens), ) assert response.status_code == 422 def test_summary2_sheet_unknown(client, admin_tokens, auth_headers): response = client.get( "/api/v1/svod/2/unknown/2026", headers=auth_headers(admin_tokens), ) assert response.status_code == 404 def test_export_summary1_smoke(client, admin_tokens, auth_headers): response = client.get( "/api/v1/export/summary/1/MAIN/2026", headers=auth_headers(admin_tokens), ) assert response.status_code == 200 assert response.headers["content-type"] == XLSX_CONTENT_TYPE assert response.content.startswith(b"PK") def test_export_summary2_smoke(client, admin_tokens, auth_headers): response = client.get( "/api/v1/export/summary/2/GO/2026", headers=auth_headers(admin_tokens), ) assert response.status_code == 200 assert response.headers["content-type"] == XLSX_CONTENT_TYPE assert response.content.startswith(b"PK")