"""Эталон прежнего ответа свода 2 (байт-в-байт). Эталон записан один раз на коде «до» (SVOD2_WRITE_GOLDEN=1) и больше не перезаписывается. """ import hashlib import json import os from dataclasses import dataclass from pathlib import Path import pytest GOLDEN_PATH = Path(__file__).resolve().parent.parent / "fixtures" / "svod2_legacy_golden.json" @dataclass(frozen=True) class GoldenCase: name: str query: str = "" who: str = "admin" def url(self, sheet: str, data: dict) -> str: query = self.query.format(org_a=data["org_a"]) base = f"/api/v1/svod/2/{sheet}/{data['year']}" return f"{base}?{query}" if query else base def headers(self, auth_headers, admin_tokens, isp_tokens) -> dict: return auth_headers(isp_tokens if self.who == "isp" else admin_tokens) GOLDEN_CASES = [ GoldenCase("admin_all"), GoldenCase("admin_one", "org_ids={org_a}"), GoldenCase("isp_all", who="isp"), GoldenCase("admin_page50", "offset=0&limit=50"), GoldenCase("admin_two", "offset=0&limit=2"), ] def _golden() -> dict: with open(GOLDEN_PATH, "r", encoding="utf-8") as f: return json.load(f) def _record(key: str, content: bytes) -> None: data = json.loads(GOLDEN_PATH.read_text(encoding="utf-8")) if GOLDEN_PATH.exists() else {} data[key] = {"sha256": hashlib.sha256(content).hexdigest(), "body": json.loads(content)} GOLDEN_PATH.parent.mkdir(parents=True, exist_ok=True) GOLDEN_PATH.write_text( json.dumps(dict(sorted(data.items())), ensure_ascii=False, indent=1) + "\n", encoding="utf-8", ) @pytest.mark.parametrize("sheet", ["GO", "RF"]) @pytest.mark.parametrize("case", GOLDEN_CASES, ids=lambda c: c.name) def test_legacy_response_is_byte_identical( client, svod2_data, admin_tokens, isp_tokens, auth_headers, sheet, case ): r = client.get( case.url(sheet, svod2_data), headers=case.headers(auth_headers, admin_tokens, isp_tokens), ) assert r.status_code == 200 if case.name == "admin_all": assert r.json()["result"], "засев не дал строк свода 2" key = f"{sheet}-{case.name}" if os.getenv("SVOD2_WRITE_GOLDEN") == "1": _record(key, r.content) assert hashlib.sha256(r.content).hexdigest() == _golden()[key]["sha256"]