Initial commit: site monorepo with API, web, and infra.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from uuid import uuid4
|
||||
|
||||
import pytest
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from app.modules.sync import repository as repo
|
||||
from tests.orchestrator_dual_harness import OrchestratorDualHubHarness, make_enterprise
|
||||
|
||||
|
||||
def test_hub_conflicts_via_hub_auth(client: TestClient):
|
||||
enterprise_id = make_enterprise(client)
|
||||
harness = OrchestratorDualHubHarness(client, enterprise_id)
|
||||
hub_a, hub_b = harness.pair_hubs()
|
||||
record_id = "hub-auth-conflict-1"
|
||||
harness.push_from(
|
||||
hub_a,
|
||||
[
|
||||
{
|
||||
"event_id": str(uuid4()),
|
||||
"seq": 1,
|
||||
"domain": "global",
|
||||
"table": "component",
|
||||
"record_id": record_id,
|
||||
"action": "upsert",
|
||||
"version": 1,
|
||||
"content_hash": "hub-h1",
|
||||
"payload": {"name": "A", "type": "g", "dry_matter": 1, "id": record_id, "version": 1, "content_hash": "hub-h1"},
|
||||
"emitted_at": "2026-07-15T12:00:00Z",
|
||||
"origin_site_id": hub_a.hub_site_id,
|
||||
}
|
||||
],
|
||||
)
|
||||
harness.push_from(
|
||||
hub_b,
|
||||
[
|
||||
{
|
||||
"event_id": str(uuid4()),
|
||||
"seq": 1,
|
||||
"domain": "global",
|
||||
"table": "component",
|
||||
"record_id": record_id,
|
||||
"action": "upsert",
|
||||
"version": 1,
|
||||
"content_hash": "hub-h2",
|
||||
"payload": {"name": "B", "type": "g", "dry_matter": 2, "id": record_id, "version": 1, "content_hash": "hub-h2"},
|
||||
"emitted_at": "2026-07-15T12:01:00Z",
|
||||
"origin_site_id": hub_b.hub_site_id,
|
||||
}
|
||||
],
|
||||
)
|
||||
listed = client.get("/api/v1/sync/hub/conflicts", headers=hub_a.auth_header())
|
||||
assert listed.status_code == 200
|
||||
conflicts = listed.json()
|
||||
assert len(conflicts) >= 1
|
||||
|
||||
|
||||
def test_multiserver_list_and_resolve(client: TestClient):
|
||||
enterprise_id = make_enterprise(client)
|
||||
harness = OrchestratorDualHubHarness(client, enterprise_id)
|
||||
hub_a, hub_b = harness.pair_hubs()
|
||||
record_id = "ms-conflict-1"
|
||||
harness.push_from(
|
||||
hub_a,
|
||||
[
|
||||
{
|
||||
"event_id": str(uuid4()),
|
||||
"seq": 1,
|
||||
"domain": "global",
|
||||
"table": "component",
|
||||
"record_id": record_id,
|
||||
"action": "upsert",
|
||||
"version": 1,
|
||||
"content_hash": "ms-h1",
|
||||
"payload": {"name": "A", "type": "g", "dry_matter": 1, "id": record_id, "version": 1, "content_hash": "ms-h1"},
|
||||
"emitted_at": "2026-07-15T12:00:00Z",
|
||||
"origin_site_id": hub_a.hub_site_id,
|
||||
}
|
||||
],
|
||||
)
|
||||
harness.push_from(
|
||||
hub_b,
|
||||
[
|
||||
{
|
||||
"event_id": str(uuid4()),
|
||||
"seq": 1,
|
||||
"domain": "global",
|
||||
"table": "component",
|
||||
"record_id": record_id,
|
||||
"action": "upsert",
|
||||
"version": 1,
|
||||
"content_hash": "ms-h2",
|
||||
"payload": {"name": "B", "type": "g", "dry_matter": 2, "id": record_id, "version": 1, "content_hash": "ms-h2"},
|
||||
"emitted_at": "2026-07-15T12:01:00Z",
|
||||
"origin_site_id": hub_b.hub_site_id,
|
||||
}
|
||||
],
|
||||
)
|
||||
login = client.post("/api/v1/auth/login", json={"email": "admin@compton.example", "password": "Admin1234"})
|
||||
token = login.json()["access_token"]
|
||||
listed = client.get(
|
||||
f"/api/v1/sync/conflicts?enterprise_id={enterprise_id}",
|
||||
headers={"Authorization": f"Bearer {token}"},
|
||||
)
|
||||
assert listed.status_code == 200
|
||||
conflicts = listed.json()
|
||||
assert len(conflicts) >= 1
|
||||
cid = conflicts[0]["id"]
|
||||
detail = client.get(
|
||||
f"/api/v1/sync/conflicts/{cid}?enterprise_id={enterprise_id}",
|
||||
headers={"Authorization": f"Bearer {token}"},
|
||||
)
|
||||
assert detail.status_code == 200
|
||||
resolved = client.post(
|
||||
f"/api/v1/sync/conflicts/{cid}/resolve?enterprise_id={enterprise_id}",
|
||||
headers={"Authorization": f"Bearer {token}"},
|
||||
json={"resolution": "keep_orchestrator"},
|
||||
)
|
||||
assert resolved.status_code == 200
|
||||
Reference in New Issue
Block a user