test_data_rule_schema.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from __future__ import annotations
  2. from pathlib import Path
  3. ROOT = Path(__file__).resolve().parents[1]
  4. MIGRATION = (
  5. ROOT
  6. / "migrations"
  7. / "versions"
  8. / "20260723_110_ai_data_rules.py"
  9. )
  10. EXPECTED_TABLES = {
  11. "data_rules",
  12. "data_rule_versions",
  13. "rule_generation_runs",
  14. "data_standards",
  15. "data_standard_versions",
  16. "standard_rule_bindings",
  17. "dataflow_versions",
  18. "dataflow_component_bindings",
  19. "rule_execution_plans",
  20. "rule_artifacts",
  21. "dataflow_deployments",
  22. "rule_runs",
  23. "rule_violation_samples",
  24. }
  25. def test_ai_data_rule_migration_defines_all_three_domain_layers():
  26. source = MIGRATION.read_text(encoding="utf-8")
  27. assert 'revision = "20260723_110"' in source
  28. assert 'down_revision = "20260722_110"' in source
  29. for table in EXPECTED_TABLES:
  30. assert f"CREATE TABLE public.{table}" in source
  31. def test_ai_data_rule_migration_enforces_immutable_versions_and_fixed_bindings():
  32. source = MIGRATION.read_text(encoding="utf-8")
  33. for expected in (
  34. "UNIQUE (rule_uid, version_no)",
  35. "UNIQUE (standard_uid, version_no)",
  36. "UNIQUE (dataflow_uid, version_no)",
  37. "standard_version_id UUID NOT NULL",
  38. "rule_version_id UUID NOT NULL",
  39. "dataflow_version_id UUID NOT NULL",
  40. "component_kind VARCHAR(30) NOT NULL",
  41. "package_hash CHAR(64)",
  42. "plan_hash CHAR(64)",
  43. "artifact_digest CHAR(64)",
  44. "context_hash CHAR(64)",
  45. "candidate_hash CHAR(64)",
  46. "workflow_version_id UUID",
  47. ):
  48. assert expected in source
  49. def test_ai_data_rule_migration_is_forward_preserving():
  50. source = MIGRATION.read_text(encoding="utf-8")
  51. downgrade = source.split("def downgrade()", 1)[1]
  52. assert "DROP TABLE" not in downgrade.upper()
  53. assert "pass" in downgrade