4190fbcf90
- kbdb-client requireOwner 守衛:漏 owner 插件端即 throw,不再靜默送 owner:'' - owner 一路 thread:persistNodes/ingestEnvelope/entity-crud/triplet-crud 全必填 - 病灶修:POST /triplets/ingest 原本沒傳 owner→加 owner_id query+400 - 寫入 route 缺 owner→400;vitest 23→27 - 註:gloss-bridge 分支的 backfill/gloss-entry 另需套 owner 必填(附說明),不跨支疊改
48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
// graph 查詢 — 圖在插件層記憶體組裝(不靠 DB VIEW),走 mock client。
|
|
import { describe, it, expect } from 'vitest';
|
|
import { createTriplet } from '../src/actions/triplet-crud';
|
|
import { listNodes, getNodeEdges, getNeighbors } from '../src/actions/graph-nodes';
|
|
import { findShortestPath } from '../src/actions/graph-path';
|
|
import { mockClient } from './mock-client';
|
|
import type { KbdbClient } from '../src/lib/kbdb-client';
|
|
|
|
async function seed(c: KbdbClient) {
|
|
// A — B — C,D 孤立連 A(owner 必經:所有寫入帶真 owner)
|
|
await createTriplet(c, { subject: 'A', predicate: 'r', object: 'B', owner_id: 'leo' });
|
|
await createTriplet(c, { subject: 'B', predicate: 'r', object: 'C', owner_id: 'leo' });
|
|
await createTriplet(c, { subject: 'A', predicate: 'r', object: 'D', owner_id: 'leo' });
|
|
}
|
|
|
|
describe('graph-nodes', () => {
|
|
it('listNodes 統計 edge_count', async () => {
|
|
const c = mockClient();
|
|
await seed(c);
|
|
const nodes = await listNodes(c, {});
|
|
const a = nodes.find((n) => n.node === 'A');
|
|
expect(a?.edge_count).toBe(2);
|
|
});
|
|
|
|
it('getNeighbors 收鄰居', async () => {
|
|
const c = mockClient();
|
|
await seed(c);
|
|
const neighbors = await getNeighbors(c, 'A');
|
|
expect(neighbors.sort()).toEqual(['B', 'D']);
|
|
});
|
|
|
|
it('getNodeEdges 取邊', async () => {
|
|
const c = mockClient();
|
|
await seed(c);
|
|
const edges = await getNodeEdges(c, 'B');
|
|
expect(edges.length).toBe(2);
|
|
});
|
|
});
|
|
|
|
describe('graph-path', () => {
|
|
it('A→C 最短路經過 B', async () => {
|
|
const c = mockClient();
|
|
await seed(c);
|
|
const res = await findShortestPath(c, 'A', 'C');
|
|
expect(res.path).toEqual(['A', 'B', 'C']);
|
|
});
|
|
});
|