



















@@ -38,6 +38,23 @@ async function withNodePairingDir<T>(run: (baseDir: string) => Promise<T>): Prom
3838return await run(await tempDirs.make("case"));
3939}
404041+function requireRecord(value: unknown): Record<string, unknown> {
42+expect(value).toBeTruthy();
43+expect(typeof value).toBe("object");
44+expect(Array.isArray(value)).toBe(false);
45+return value as Record<string, unknown>;
46+}
47+48+function findRecordByField<T extends Record<string, unknown>>(
49+records: T[],
50+field: string,
51+value: unknown,
52+): T {
53+const record = records.find((entry) => entry[field] === value);
54+expect(record).toBeTruthy();
55+return record as T;
56+}
57+4158describe("node pairing tokens", () => {
4259beforeAll(async () => {
4360await tempDirs.setup();
@@ -116,16 +133,11 @@ describe("node pairing tokens", () => {
116133baseDir,
117134);
118135119-await expect(listNodePairing(baseDir)).resolves.toEqual({
120-pending: expect.arrayContaining([
121-expect.objectContaining({
122-nodeId: "node-3",
123-commands: ["canvas.present"],
124-requiredApproveScopes: ["operator.pairing", "operator.write"],
125-}),
126-]),
127-paired: [],
128-});
136+const pairing = await listNodePairing(baseDir);
137+const pendingNode = findRecordByField(pairing.pending, "nodeId", "node-3");
138+expect(pendingNode.commands).toEqual(["canvas.present"]);
139+expect(pendingNode.requiredApproveScopes).toEqual(["operator.pairing", "operator.write"]);
140+expect(pairing.paired).toEqual([]);
129141});
130142});
131143@@ -150,17 +162,13 @@ describe("node pairing tokens", () => {
150162baseDir,
151163);
152164153-expect(approved).toEqual(
154-expect.objectContaining({
155-node: expect.objectContaining({ nodeId: "node-array-state" }),
156-}),
157-);
165+const approvedRecord = requireRecord(approved);
166+const approvedNode = requireRecord(approvedRecord.node);
167+expect(approvedNode.nodeId).toBe("node-array-state");
158168expect(Array.isArray(JSON.parse(await fs.readFile(paths.pendingPath, "utf8")))).toBe(false);
159-expect(JSON.parse(await fs.readFile(paths.pairedPath, "utf8"))).toEqual(
160-expect.objectContaining({
161-"node-array-state": expect.objectContaining({ nodeId: "node-array-state" }),
162-}),
163-);
169+const pairedState = requireRecord(JSON.parse(await fs.readFile(paths.pairedPath, "utf8")));
170+const pairedNode = requireRecord(pairedState["node-array-state"]);
171+expect(pairedNode.nodeId).toBe("node-array-state");
164172});
165173});
166174@@ -170,10 +178,9 @@ describe("node pairing tokens", () => {
170178171179expect(token).toMatch(/^[A-Za-z0-9_-]{43}$/);
172180expect(Buffer.from(token, "base64url")).toHaveLength(32);
173-await expect(verifyNodeToken("node-1", token, baseDir)).resolves.toEqual({
174-ok: true,
175-node: expect.objectContaining({ nodeId: "node-1" }),
176-});
181+const verified = await verifyNodeToken("node-1", token, baseDir);
182+expect(verified.ok).toBe(true);
183+expect(verified.node?.nodeId).toBe("node-1");
177184await expect(verifyNodeToken("node-1", "x".repeat(token.length), baseDir)).resolves.toEqual({
178185ok: false,
179186});
@@ -201,15 +208,11 @@ describe("node pairing tokens", () => {
201208await expect(removePairedNode("node-1", baseDir)).resolves.toEqual({ nodeId: "node-1" });
202209await expect(removePairedNode("node-1", baseDir)).resolves.toBeNull();
203210await expect(getPairedNode("node-1", baseDir)).resolves.toBeNull();
204-await expect(listNodePairing(baseDir)).resolves.toEqual({
205-pending: [
206-expect.objectContaining({
207-requestId: pending.request.requestId,
208-nodeId: "node-2",
209-}),
210-],
211-paired: [],
212-});
211+const pairing = await listNodePairing(baseDir);
212+expect(pairing.pending).toHaveLength(1);
213+expect(pairing.pending[0]?.requestId).toBe(pending.request.requestId);
214+expect(pairing.pending[0]?.nodeId).toBe("node-2");
215+expect(pairing.paired).toEqual([]);
213216});
214217});
215218@@ -250,19 +253,16 @@ describe("node pairing tokens", () => {
250253status: "forbidden",
251254missingScope: "operator.pairing",
252255});
253-await expect(
254-approveNodePairing(
255-commandlessRequest.request.requestId,
256-{ callerScopes: ["operator.pairing"] },
257-baseDir,
258-),
259-).resolves.toEqual({
260-requestId: commandlessRequest.request.requestId,
261-node: expect.objectContaining({
262-nodeId: "node-2",
263-commands: undefined,
264-}),
265-});
256+const approved = await approveNodePairing(
257+commandlessRequest.request.requestId,
258+{ callerScopes: ["operator.pairing"] },
259+baseDir,
260+);
261+const approvedRecord = requireRecord(approved);
262+const approvedNode = requireRecord(approvedRecord.node);
263+expect(approvedRecord.requestId).toBe(commandlessRequest.request.requestId);
264+expect(approvedNode.nodeId).toBe("node-2");
265+expect(approvedNode.commands).toBeUndefined();
266266});
267267});
268268@@ -303,12 +303,9 @@ describe("node pairing tokens", () => {
303303false,
304304);
305305306-await expect(getPairedNode("node-1", baseDir)).resolves.toEqual(
307-expect.objectContaining({
308-lastSeenAtMs: 1234,
309-lastSeenReason: "silent_push",
310-}),
311-);
306+const pairedNode = await getPairedNode("node-1", baseDir);
307+expect(pairedNode?.lastSeenAtMs).toBe(1234);
308+expect(pairedNode?.lastSeenReason).toBe("silent_push");
312309});
313310});
314311});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。