import unittest

from demo import approve, evidence_hash, transition, validate_response


class DemoTest(unittest.TestCase):
    def test_response_contract(self):
        self.assertEqual(
            validate_response({"answers": {"criterion_relation": {"choice": "supported"}}}),
            ("supported", None),
        )
        for value in ({}, {"answers": {"criterion_relation": {"choice": "maybe"}}}):
            self.assertEqual(validate_response(value), ("blocked", "invalid_response"))

    def test_safe_transitions(self):
        self.assertEqual(transition("supported", None)["phase"], "awaiting_human")
        self.assertEqual(transition("violated", None)["verdict"], "fail")
        self.assertEqual(transition(None, "transient_api_error")["phase"], "retry_wait")
        self.assertEqual(transition(None, "invalid_response")["phase"], "blocked")

    def test_approval_is_bound_to_evidence(self):
        state = transition("supported", None)
        digest = evidence_hash("supported")
        self.assertEqual(approve(state, digest, digest)["verdict"], "pass")
        with self.assertRaises(ValueError):
            approve(state, digest, "stale")


if __name__ == "__main__":
    unittest.main()
