59 lines
2.7 KiB
Python
59 lines
2.7 KiB
Python
"""Protect the reviewed PDF transcription and its connection to Recent scoring."""
|
|
|
|
import hashlib
|
|
import json
|
|
from itertools import product
|
|
from pathlib import Path
|
|
|
|
from app.core.cssrs_content import load_cssrs_russian
|
|
from app.core.questionnaire import score_cssrs_recent
|
|
|
|
CLINICAL = Path(__file__).resolve().parents[1] / "docs" / "clinical"
|
|
|
|
|
|
def test_source_hashes_and_complete_transcription():
|
|
form = load_cssrs_russian()
|
|
manifest = json.loads((CLINICAL / "review-status.json").read_text())["cssrs_russian_pdf"]
|
|
assert hashlib.sha256((CLINICAL / manifest["file"]).read_bytes()).hexdigest() == manifest["sha256"]
|
|
source = (CLINICAL / manifest["source_text"]).read_bytes()
|
|
assert hashlib.sha256(source).hexdigest() == manifest["source_text_sha256"]
|
|
assert form.version == manifest["content_version"]
|
|
# Reconstruct the complete extracted page, including numbering, guidance,
|
|
# original typos, answer order and the color legend. No wording is dropped.
|
|
blocks = [form.title, form.subtitle, form.period_label_original, form.initial_instruction]
|
|
blocks.extend(option.label for option in form.options)
|
|
for index, item in enumerate(form.items):
|
|
blocks.append(f"{index + 1}. {item.text}" if index < 6 else item.text)
|
|
if item.interviewer_guidance:
|
|
blocks.append(item.interviewer_guidance)
|
|
if item.id == "q2":
|
|
blocks.append(form.branch_instruction)
|
|
blocks.extend(["Low Risk", "Moderate Risk", "High Risk"])
|
|
assert " ".join(blocks) == source.decode().strip()
|
|
assert [item.recall_period for item in form.items] == ["past_month"] * 5 + ["lifetime", "past_3_months"]
|
|
|
|
|
|
def test_all_source_branches_and_color_categories_match_scorer():
|
|
form = load_cssrs_russian()
|
|
colors = {item.id: item.yes_risk for item in form.items}
|
|
assert list(colors.values()) == ["low", "low", "moderate", "high", "high", "moderate", "high"]
|
|
levels = ["none", "low", "moderate", "high"]
|
|
for values in product((0, 1), repeat=7):
|
|
all_answers = dict(zip(colors, values, strict=True))
|
|
asked = ["q1", "q2"]
|
|
if all_answers["q2"]:
|
|
asked.extend(["q3", "q4", "q5"])
|
|
asked.append("q6_lifetime")
|
|
if all_answers["q6_lifetime"]:
|
|
asked.append("q6_recent")
|
|
answers = {}
|
|
for item_id in asked:
|
|
partial = score_cssrs_recent(answers)
|
|
assert not partial.complete
|
|
assert partial.missing[0] == item_id
|
|
answers[item_id] = all_answers[item_id]
|
|
result = score_cssrs_recent(answers)
|
|
expected = max((levels.index(colors[key]) for key, value in answers.items() if value), default=0)
|
|
assert result.complete and result.risk == levels[expected]
|
|
assert result.required == tuple(asked)
|