DocWeave / backend /test_validation_proof.py
shak3008's picture
test: verify validation decision rules
64ae4f1
Raw
History Blame Contribute Delete
11 kB
from __future__ import annotations
from types import SimpleNamespace
from app.database.session import SessionLocal
from app.models.rule import Rule, RuleType
from app.repositories.rule_repository import RuleRepository
from app.agents.validation import RuleValidationAgent
from app.agents.decision import DecisionAgent
print("=" * 60)
print("DOCWEAVE REAL VALIDATION PROOF")
print("=" * 60)
db = SessionLocal()
created_rules = []
try:
# --------------------------------------------------------------
# Find a real workspace
# --------------------------------------------------------------
from app.models.workspace import Workspace
workspace = db.query(Workspace).first()
if workspace is None:
raise RuntimeError("No workspace found.")
print("WORKSPACE:", workspace.id)
# --------------------------------------------------------------
# Synthetic proposals
#
# These are lightweight proposal-shaped objects because the
# RuleValidationAgent only needs id, proposal_type and
# proposed_changes.
# --------------------------------------------------------------
passing_proposal = SimpleNamespace(
id="proposal-pass",
proposal_type="CREATE",
proposed_changes={
"type": "ENTITY",
"title": "Congenital Heart Valve Disease",
"value": "Congenital Heart Valve Disease",
"confidence": 0.95,
"evidence": [
{
"document_version_id": "synthetic-version",
"page": 1,
"text": "Evidence supporting the entity.",
}
],
},
)
failing_proposal = SimpleNamespace(
id="proposal-fail",
proposal_type="CREATE",
proposed_changes={
"type": "ENTITY",
"title": "Low Confidence Entity",
"value": "Low Confidence Entity",
"confidence": 0.40,
},
)
update_proposal = SimpleNamespace(
id="proposal-update",
proposal_type="UPDATE",
proposed_changes={
"type": "ENTITY",
"title": "Updated Entity",
"value": "Updated Entity",
"confidence": 0.95,
"evidence": [
{
"document_version_id": "synthetic-version",
"page": 2,
"text": "Update evidence.",
}
],
},
)
agent = RuleValidationAgent()
decision_agent = DecisionAgent()
repository = RuleRepository(db)
# --------------------------------------------------------------
# Helper
# --------------------------------------------------------------
def make_rule(
name,
operator,
configuration,
enabled=True,
):
rule = Rule(
workspace_id=workspace.id,
name=name,
description="Validation proof rule",
rule_type=RuleType.VALIDATION,
configuration={
"operator": operator,
**configuration,
},
enabled=enabled,
)
db.add(rule)
db.flush()
created_rules.append(rule)
return rule
# ==============================================================
# 1. PASS
# ==============================================================
print()
print("1. TESTING PASS")
pass_rule = make_rule(
"TEST Required Evidence PASS",
"required_evidence",
{},
)
results = agent.validate(
rules=[pass_rule],
proposals=[passing_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "PASS"
assert "proposal-pass" in results[0]["proposal_ids"]
print("PASS TEST: OK")
# ==============================================================
# 2. FAIL - missing evidence
# ==============================================================
print()
print("2. TESTING FAIL")
evidence_fail_rule = make_rule(
"TEST Required Evidence FAIL",
"required_evidence",
{},
)
results = agent.validate(
rules=[evidence_fail_rule],
proposals=[failing_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "FAIL"
assert results[0]["severity"] == "HIGH"
assert "proposal-fail" in results[0]["proposal_ids"]
decision = decision_agent.decide(results)
print("DECISION:", decision)
assert decision["decision"] == "REVIEW"
assert decision["failure_count"] == 1
assert "proposal-fail" in decision["affected_proposal_ids"]
print("FAIL TEST: OK")
# ==============================================================
# 3. WARNING - malformed min_confidence
# ==============================================================
print()
print("3. TESTING WARNING")
warning_rule = make_rule(
"TEST Malformed Confidence Rule",
"min_confidence",
{
"value": "not-a-number",
},
)
results = agent.validate(
rules=[warning_rule],
proposals=[passing_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "WARNING"
assert results[0]["severity"] == "HIGH"
decision = decision_agent.decide(results)
print("DECISION:", decision)
assert decision["decision"] == "REVIEW"
assert decision["warning_count"] == 1
print("WARNING TEST: OK")
# ==============================================================
# 4. MIN CONFIDENCE FAIL
# ==============================================================
print()
print("4. TESTING MIN CONFIDENCE FAIL")
confidence_rule = make_rule(
"TEST Minimum Confidence",
"min_confidence",
{
"value": 0.80,
},
)
results = agent.validate(
rules=[confidence_rule],
proposals=[failing_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "FAIL"
assert results[0]["operator"] == "min_confidence"
assert "proposal-fail" in results[0]["proposal_ids"]
print("MIN CONFIDENCE TEST: OK")
# ==============================================================
# 5. MIN CONFIDENCE PASS
# ==============================================================
print()
print("5. TESTING MIN CONFIDENCE PASS")
results = agent.validate(
rules=[confidence_rule],
proposals=[passing_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "PASS"
print("MIN CONFIDENCE PASS TEST: OK")
# ==============================================================
# 6. ALLOWED PROPOSAL TYPES FAIL
# ==============================================================
print()
print("6. TESTING ALLOWED PROPOSAL TYPES FAIL")
type_rule = make_rule(
"TEST Allowed Proposal Types",
"allowed_proposal_types",
{
"values": ["UPDATE"],
},
)
results = agent.validate(
rules=[type_rule],
proposals=[passing_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "FAIL"
assert results[0]["operator"] == "allowed_proposal_types"
print("PROPOSAL TYPE FAIL TEST: OK")
# ==============================================================
# 7. ALLOWED PROPOSAL TYPES PASS
# ==============================================================
print()
print("7. TESTING ALLOWED PROPOSAL TYPES PASS")
results = agent.validate(
rules=[type_rule],
proposals=[update_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "PASS"
print("PROPOSAL TYPE PASS TEST: OK")
# ==============================================================
# 8. UNKNOWN OPERATOR → WARNING
# ==============================================================
print()
print("8. TESTING UNKNOWN OPERATOR")
unknown_rule = make_rule(
"TEST Unknown Operator",
"does_not_exist",
{},
)
results = agent.validate(
rules=[unknown_rule],
proposals=[passing_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "WARNING"
assert results[0]["operator"] == "does_not_exist"
print("UNKNOWN OPERATOR TEST: OK")
# ==============================================================
# 9. DISABLED RULE MUST BE IGNORED
# ==============================================================
print()
print("9. TESTING DISABLED RULE")
disabled_rule = make_rule(
"TEST Disabled Rule",
"required_evidence",
{},
enabled=False,
)
db.commit()
enabled_rules = repository.list_enabled(
workspace.id
)
enabled_rule_ids = {
str(rule.id)
for rule in enabled_rules
}
print(
"DISABLED RULE:",
disabled_rule.id,
)
print(
"ENABLED RULE COUNT:",
len(enabled_rules),
)
assert str(disabled_rule.id) not in enabled_rule_ids
print("DISABLED RULE TEST: OK")
# ==============================================================
# 10. NO RULES → PASS
# ==============================================================
print()
print("10. TESTING NO ENABLED RULES")
results = agent.validate(
rules=[],
proposals=[passing_proposal],
)
print("RESULT:", results)
assert len(results) == 1
assert results[0]["status"] == "PASS"
assert results[0]["rule_name"] == "No enabled rules"
decision = decision_agent.decide(results)
print("DECISION:", decision)
assert decision["decision"] == "CONTINUE"
print("NO RULES TEST: OK")
# ==============================================================
# FINAL CLEANUP
# ==============================================================
for rule in created_rules:
db.delete(rule)
db.commit()
# ==============================================================
# SUCCESS
# ==============================================================
print()
print("=" * 60)
print("PASS: REAL VALIDATION ENGINE VERIFIED")
print("=" * 60)
print()
print("PASS RULES: OK")
print("FAIL RULES: OK")
print("WARNING RULES: OK")
print("MIN CONFIDENCE: OK")
print("PROPOSAL TYPE RULES: OK")
print("UNKNOWN OPERATOR: OK")
print("DISABLED RULE: OK")
print("NO ENABLED RULES: OK")
print("DECISION ROUTING: OK")
print()
finally:
db.rollback()
db.close()