Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
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()
|