71 lines
2.3 KiB
Python
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"]
|