Spaces:
Sleeping
Sleeping
| """Tests for the ComplianceChecker.""" | |
| import sys | |
| from pathlib import Path | |
| sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) | |
| import pytest | |
| from fineprint.checker import ComplianceChecker | |
| def checker(): | |
| return ComplianceChecker() | |
| def v1_policies(): | |
| return { | |
| "return": { | |
| "window_days": 30, | |
| "refund_method": "original_payment", | |
| "restocking_fee_percent": 0, | |
| "requires_receipt": True, | |
| "electronics_window_days": 14, | |
| }, | |
| "shipping": { | |
| "free_threshold": 50, | |
| "standard_delivery_days": 5, | |
| "express_delivery_days": 2, | |
| "international_available": False, | |
| "express_surcharge": 15, | |
| }, | |
| } | |
| class TestValidateQuote: | |
| def test_correct_quote(self, checker, v1_policies): | |
| result = checker.validate_quote( | |
| agent_response={"policy_field": "return.window_days", "quoted_value": 30}, | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| active_policies=v1_policies, | |
| ) | |
| assert result["compliant"] is True | |
| def test_correct_quote_string(self, checker, v1_policies): | |
| result = checker.validate_quote( | |
| agent_response={"policy_field": "return.window_days", "quoted_value": "30"}, | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| active_policies=v1_policies, | |
| ) | |
| assert result["compliant"] is True | |
| def test_stale_quote(self, checker, v1_policies): | |
| # Agent believes v1 but active is v2, and quotes v1 value | |
| v2_policies = v1_policies.copy() | |
| v2_policies["return"] = {**v1_policies["return"], "window_days": 14} | |
| result = checker.validate_quote( | |
| agent_response={"policy_field": "return.window_days", "quoted_value": 30}, | |
| agent_version="v1_base", | |
| active_version="v2_return_change", | |
| active_policies=v2_policies, | |
| ) | |
| assert result["compliant"] is False | |
| assert result["severity"] == "HIGH" | |
| assert "STALE_POLICY" in result["reason"] | |
| def test_incorrect_value(self, checker, v1_policies): | |
| result = checker.validate_quote( | |
| agent_response={"policy_field": "return.window_days", "quoted_value": 999}, | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| active_policies=v1_policies, | |
| ) | |
| assert result["compliant"] is False | |
| assert result["severity"] == "MEDIUM" | |
| def test_missing_field(self, checker, v1_policies): | |
| result = checker.validate_quote( | |
| agent_response={"policy_field": "nonexistent.field", "quoted_value": "x"}, | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| active_policies=v1_policies, | |
| ) | |
| assert result["compliant"] is False | |
| def test_empty_field(self, checker, v1_policies): | |
| result = checker.validate_quote( | |
| agent_response={"policy_field": "", "quoted_value": ""}, | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| active_policies=v1_policies, | |
| ) | |
| assert result["compliant"] is False | |
| def test_boolean_match(self, checker, v1_policies): | |
| result = checker.validate_quote( | |
| agent_response={ | |
| "policy_field": "return.requires_receipt", | |
| "quoted_value": "true", | |
| }, | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| active_policies=v1_policies, | |
| ) | |
| assert result["compliant"] is True | |
| class TestValidateAction: | |
| def test_abort_with_drift(self, checker): | |
| result = checker.validate_action( | |
| action_type="abort_workflow", | |
| agent_version="v1_base", | |
| active_version="v2_return_change", | |
| ) | |
| assert result["compliant"] is True | |
| def test_abort_without_drift(self, checker): | |
| result = checker.validate_action( | |
| action_type="abort_workflow", | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| ) | |
| assert result["compliant"] is False | |
| def test_escalate_with_drift(self, checker): | |
| result = checker.validate_action( | |
| action_type="escalate", | |
| agent_version="v1_base", | |
| active_version="v2_return_change", | |
| ) | |
| assert result["compliant"] is True | |
| def test_escalate_without_drift(self, checker): | |
| result = checker.validate_action( | |
| action_type="escalate", | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| ) | |
| assert result["compliant"] is False | |
| def test_respond_always_compliant(self, checker): | |
| result = checker.validate_action( | |
| action_type="respond_to_user", | |
| agent_version="v1_base", | |
| active_version="v1_base", | |
| ) | |
| assert result["compliant"] is True | |
| class TestSeverityLevel: | |
| def test_severity_ordering(self, checker): | |
| assert checker.severity_level(None) == 0 | |
| assert checker.severity_level("LOW") == 1 | |
| assert checker.severity_level("MEDIUM") == 2 | |
| assert checker.severity_level("HIGH") == 3 | |
| assert checker.severity_level("CRITICAL") == 4 | |