93 lines
3.6 KiB
Python
93 lines
3.6 KiB
Python
import copy
|
|
import hashlib
|
|
import json
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
from scripts.validate_m1_manual_acceptance import ROOT, STEP_IDS, validate
|
|
|
|
|
|
TEMPLATE = ROOT / "tests" / "fixtures" / "m1-manual-acceptance-template.json"
|
|
|
|
|
|
class M1ManualAcceptanceTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.template = json.loads(TEMPLATE.read_text(encoding="utf-8"))
|
|
|
|
def _write(self, root: Path, report: dict) -> Path:
|
|
path = root / "acceptance.json"
|
|
path.write_text(json.dumps(report), encoding="utf-8")
|
|
return path
|
|
|
|
def _passing(self, root: Path) -> dict:
|
|
report = copy.deepcopy(self.template)
|
|
report["artifact_verification"] = {
|
|
"status": "passed",
|
|
"report_sha256": "a" * 64,
|
|
}
|
|
report["environment"] = {
|
|
"windows_version": "synthetic-test-environment",
|
|
"hardware_disconnected": True,
|
|
"fresh_app_data": True,
|
|
}
|
|
for step in report["steps"]:
|
|
step["status"] = "passed"
|
|
report["stop_conditions"] = {
|
|
key: False for key in report["stop_conditions"]
|
|
}
|
|
screenshot = root / "evidence" / "offline-state.png"
|
|
screenshot.parent.mkdir()
|
|
screenshot.write_bytes(b"synthetic screenshot placeholder")
|
|
report["evidence"] = [{
|
|
"path": "evidence/offline-state.png",
|
|
"sha256": hashlib.sha256(screenshot.read_bytes()).hexdigest(),
|
|
}]
|
|
return report
|
|
|
|
def test_template_is_valid_but_incomplete(self):
|
|
with tempfile.TemporaryDirectory(dir=ROOT / ".build") as directory:
|
|
result = validate(self._write(Path(directory), self.template))
|
|
self.assertEqual(result["status"], "incomplete")
|
|
self.assertTrue(result["schema_valid"])
|
|
self.assertEqual(result["required_steps"], len(STEP_IDS))
|
|
|
|
def test_complete_no_device_report_passes(self):
|
|
with tempfile.TemporaryDirectory(dir=ROOT / ".build") as directory:
|
|
root = Path(directory)
|
|
result = validate(self._write(root, self._passing(root)))
|
|
self.assertEqual(result["status"], "passed")
|
|
self.assertFalse(result["hardware_access_authorized"])
|
|
self.assertTrue(result["manual_review_required"])
|
|
|
|
def test_any_stop_condition_fails_checkpoint(self):
|
|
with tempfile.TemporaryDirectory(dir=ROOT / ".build") as directory:
|
|
root = Path(directory)
|
|
report = self._passing(root)
|
|
report["stop_conditions"]["transport_attempt"] = True
|
|
result = validate(self._write(root, report))
|
|
self.assertEqual(result["status"], "failed")
|
|
|
|
def test_missing_step_cannot_pass(self):
|
|
with tempfile.TemporaryDirectory(dir=ROOT / ".build") as directory:
|
|
root = Path(directory)
|
|
report = self._passing(root)
|
|
report["steps"].pop()
|
|
result = validate(self._write(root, report))
|
|
self.assertEqual(result["status"], "failed")
|
|
self.assertFalse(result["schema_valid"])
|
|
|
|
def test_changed_or_external_evidence_is_rejected(self):
|
|
with tempfile.TemporaryDirectory(dir=ROOT / ".build") as directory:
|
|
root = Path(directory)
|
|
report = self._passing(root)
|
|
report["evidence"][0]["sha256"] = "0" * 64
|
|
result = validate(self._write(root, report))
|
|
self.assertEqual(result["status"], "failed")
|
|
report["evidence"][0]["path"] = "../private.png"
|
|
result = validate(self._write(root, report))
|
|
self.assertEqual(result["status"], "failed")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|