import unittest from weknora_resource_version_etl import make_plan, transaction, TARGET_DATABASE class ResourceVersionMigrationTests(unittest.TestCase): def setUp(self): self.row = {"id": 1, "resource_type": "agent", "resource_id": 14, "owner_user_id": 3, "organization_id": 1, "status": "rejected", "payload": {"name": "Old version", "rules": "kept"}, "review_note": "copy deleted", "created_at": "2026-09-10T01:00:00Z", "reviewed_at": ""} self.source = {"forks": [], "reviews": [self.row], "source_sha256": "a" * 64} self.target = {"database": TARGET_DATABASE, "agents": {"14": "agent-id"}, "identities": {"3": "owner-id"}} def test_terminal_history_preserves_payload_without_restoring_copy(self): first = make_plan(self.source, self.target) self.assertEqual(first, make_plan(self.source, self.target)) self.assertEqual(first["rows"][0]["proposed_snapshot"]["rules"], "kept") sql = transaction(first) self.assertIn("ROLLBACK", sql) self.assertNotIn("INSERT INTO custom_agents", sql) self.assertNotIn("INSERT INTO users", sql) def test_active_forks_and_pending_reviews_require_real_migration(self): self.source["forks"] = [{"id": 1}] with self.assertRaises(ValueError): make_plan(self.source, self.target) self.source["forks"] = [] self.row["status"] = "pending" with self.assertRaises(ValueError): make_plan(self.source, self.target) def test_missing_owner_and_foreign_scope_rejected(self): self.target["identities"] = {} with self.assertRaises(ValueError): make_plan(self.source, self.target) self.target["identities"] = {"3": "owner-id"} self.row["organization_id"] = 2 with self.assertRaises(ValueError): make_plan(self.source, self.target) if __name__ == "__main__": unittest.main()