diff --git a/backend/tests/test_edges.py b/backend/tests/test_edges.py index 59617b4..78b7eb8 100644 --- a/backend/tests/test_edges.py +++ b/backend/tests/test_edges.py @@ -100,3 +100,40 @@ async def test_create_edge_requires_auth(client: AsyncClient, two_nodes): src, tgt = two_nodes res = await client.post("/api/v1/edges", json={"source": src, "target": tgt, "type": "ethernet"}) assert res.status_code == 401 + + +async def test_create_cluster_edge_with_handles(client: AsyncClient, headers: dict, two_nodes): + src, tgt = two_nodes + res = await client.post( + "/api/v1/edges", + json={ + "source": src, + "target": tgt, + "type": "cluster", + "source_handle": "cluster-right", + "target_handle": "cluster-left", + }, + headers=headers, + ) + assert res.status_code == 201 + data = res.json() + assert data["type"] == "cluster" + assert data["source_handle"] == "cluster-right" + assert data["target_handle"] == "cluster-left" + + +async def test_source_and_target_handle_persist_through_update(client: AsyncClient, headers: dict, two_nodes): + src, tgt = two_nodes + edge_id = ( + await client.post( + "/api/v1/edges", + json={"source": src, "target": tgt, "type": "cluster", "source_handle": "cluster-right", "target_handle": "cluster-left"}, + headers=headers, + ) + ).json()["id"] + res = await client.patch(f"/api/v1/edges/{edge_id}", json={"label": "corosync"}, headers=headers) + assert res.status_code == 200 + data = res.json() + assert data["source_handle"] == "cluster-right" + assert data["target_handle"] == "cluster-left" + assert data["label"] == "corosync" diff --git a/frontend/src/stores/__tests__/canvasStore.test.ts b/frontend/src/stores/__tests__/canvasStore.test.ts index 95d1eab..70b53a0 100644 --- a/frontend/src/stores/__tests__/canvasStore.test.ts +++ b/frontend/src/stores/__tests__/canvasStore.test.ts @@ -117,6 +117,14 @@ describe('canvasStore', () => { expect(hasUnsavedChanges).toBe(true) }) + it('onConnect preserves sourceHandle and targetHandle for cluster edges', () => { + useCanvasStore.getState().onConnect({ source: 'n1', target: 'n2', sourceHandle: 'cluster-right', targetHandle: 'cluster-left' }) + const { edges } = useCanvasStore.getState() + expect(edges).toHaveLength(1) + expect(edges[0].sourceHandle).toBe('cluster-right') + expect(edges[0].targetHandle).toBe('cluster-left') + }) + it('addNode with parent_id sets parentId and extent', () => { useCanvasStore.getState().addNode(makeNode('parent')) useCanvasStore.getState().addNode(makeNode('child', { parent_id: 'parent' })) diff --git a/frontend/src/utils/__tests__/edgeColors.test.ts b/frontend/src/utils/__tests__/edgeColors.test.ts index 49de1fb..4ca7cb5 100644 --- a/frontend/src/utils/__tests__/edgeColors.test.ts +++ b/frontend/src/utils/__tests__/edgeColors.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect } from 'vitest' import { EDGE_DEFAULT_COLORS } from '../edgeColors' import type { EdgeType } from '@/types' -const EDGE_TYPES: EdgeType[] = ['ethernet', 'wifi', 'iot', 'vlan', 'virtual'] +const EDGE_TYPES: EdgeType[] = ['ethernet', 'wifi', 'iot', 'vlan', 'virtual', 'cluster'] describe('EDGE_DEFAULT_COLORS', () => { it('has an entry for every EdgeType', () => { @@ -32,4 +32,8 @@ describe('EDGE_DEFAULT_COLORS', () => { it('virtual default is muted gray', () => { expect(EDGE_DEFAULT_COLORS.virtual).toBe('#8b949e') }) + + it('cluster default is proxmox orange', () => { + expect(EDGE_DEFAULT_COLORS.cluster).toBe('#ff6e00') + }) })