DFiP_Budget_planing/api/tests/integration/test_svod2_legacy_golden.py

71 lines
2.3 KiB
Python

"""Эталон прежнего ответа свода 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"]