
























@@ -19,6 +19,23 @@ afterEach(() => {
1919resetPluginStateStoreForTests();
2020});
212122+async function expectPluginStateStoreError(
23+promise: Promise<unknown>,
24+expected: { code: string; operation?: string },
25+): Promise<void> {
26+let storeError: unknown;
27+try {
28+await promise;
29+} catch (error) {
30+storeError = error;
31+}
32+expect(storeError).toBeInstanceOf(PluginStateStoreError);
33+expect((storeError as PluginStateStoreError | undefined)?.code).toBe(expected.code);
34+if (expected.operation) {
35+expect((storeError as PluginStateStoreError | undefined)?.operation).toBe(expected.operation);
36+}
37+}
38+2239describe("plugin state keyed store", () => {
2340it("registers and looks up values across store instances", async () => {
2441await withOpenClawTestState({ label: "plugin-state-roundtrip" }, async () => {
@@ -51,7 +68,7 @@ describe("plugin state keyed store", () => {
5168await store.register("b", { version: 2 });
52695370await expect(store.lookup("b")).resolves.toEqual({ version: 2 });
54-await expect(store.entries()).resolves.toMatchObject([
71+await expect(store.entries()).resolves.toEqual([
5572{ key: "a", value: { version: 1 }, createdAt: 2000 },
5673{ key: "b", value: { version: 2 }, createdAt: 3000 },
5774]);
@@ -76,7 +93,7 @@ describe("plugin state keyed store", () => {
7693);
77947895await expect(store.lookup("claim")).resolves.toEqual({ version: 1 });
79-await expect(store.entries()).resolves.toMatchObject([
96+await expect(store.entries()).resolves.toEqual([
8097{ key: "claim", value: { version: 1 }, createdAt: 1000, expiresAt: 2000 },
8198]);
8299});
@@ -98,7 +115,7 @@ describe("plugin state keyed store", () => {
98115await expect(store.registerIfAbsent("claim", { version: 2 })).resolves.toBe(true);
99116100117await expect(store.lookup("claim")).resolves.toEqual({ version: 2 });
101-await expect(store.entries()).resolves.toMatchObject([
118+await expect(store.entries()).resolves.toEqual([
102119{ key: "claim", value: { version: 2 }, createdAt: 1200 },
103120]);
104121});
@@ -172,7 +189,7 @@ describe("plugin state keyed store", () => {
172189await evicting.registerIfAbsent("b", 2);
173190vi.setSystemTime(3000);
174191await evicting.registerIfAbsent("c", 3);
175-await expect(evicting.entries()).resolves.toMatchObject([{ key: "b" }, { key: "c" }]);
192+expect((await evicting.entries()).map((entry) => entry.key)).toEqual(["b", "c"]);
176193177194seedPluginStateEntriesForTests([
178195 ...Array.from({ length: 999 }, (_, entryIndex) => ({
@@ -192,7 +209,7 @@ describe("plugin state keyed store", () => {
192209namespace: "limit",
193210maxEntries: 1_001,
194211});
195-await expect(limited.registerIfAbsent("overflow", { overflow: true })).rejects.toMatchObject({
212+await expectPluginStateStoreError(limited.registerIfAbsent("overflow", { overflow: true }), {
196213code: "PLUGIN_STATE_LIMIT_EXCEEDED",
197214});
198215await expect(limited.lookup("overflow")).resolves.toBeUndefined();
@@ -247,7 +264,7 @@ describe("plugin state keyed store", () => {
247264await expect(store.lookup("default")).resolves.toBeUndefined();
248265await expect(store.lookup("override")).resolves.toEqual({ value: "override" });
249266expect(sweepExpiredPluginStateEntries()).toBe(1);
250-await expect(store.entries()).resolves.toMatchObject([{ key: "override" }]);
267+expect((await store.entries()).map((entry) => entry.key)).toEqual(["override"]);
251268});
252269});
253270@@ -262,7 +279,7 @@ describe("plugin state keyed store", () => {
262279vi.setSystemTime(3000);
263280await store.register("c", 3);
264281265-await expect(store.entries()).resolves.toMatchObject([{ key: "b" }, { key: "c" }]);
282+expect((await store.entries()).map((entry) => entry.key)).toEqual(["b", "c"]);
266283});
267284});
268285@@ -278,7 +295,7 @@ describe("plugin state keyed store", () => {
278295await store.register("z", 1);
279296await store.register("a", 2);
280297281-await expect(store.entries()).resolves.toMatchObject([{ key: "a", value: 2 }]);
298+await expect(store.entries()).resolves.toEqual([{ key: "a", value: 2, createdAt: 1000 }]);
282299await expect(store.lookup("z")).resolves.toBeUndefined();
283300});
284301});
@@ -295,7 +312,7 @@ describe("plugin state keyed store", () => {
295312await expect(store.registerIfAbsent("z", 1)).resolves.toBe(true);
296313await expect(store.registerIfAbsent("a", 2)).resolves.toBe(true);
297314298-await expect(store.entries()).resolves.toMatchObject([{ key: "a", value: 2 }]);
315+await expect(store.entries()).resolves.toEqual([{ key: "a", value: 2, createdAt: 1000 }]);
299316await expect(store.lookup("z")).resolves.toBeUndefined();
300317});
301318});
@@ -326,7 +343,7 @@ describe("plugin state keyed store", () => {
326343maxEntries: 10,
327344});
328345329-await expect(limitStore.register("overflow", { overflow: true })).rejects.toMatchObject({
346+await expectPluginStateStoreError(limitStore.register("overflow", { overflow: true }), {
330347code: "PLUGIN_STATE_LIMIT_EXCEEDED",
331348});
332349await expect(siblingStore.lookup("k-0")).resolves.toEqual({
@@ -383,7 +400,7 @@ describe("plugin state keyed store", () => {
383400await expect(store.register("non-enumerable", nonEnumerable)).rejects.toThrow(
384401PluginStateStoreError,
385402);
386-await expect(store.register("big", "x".repeat(65_537))).rejects.toMatchObject({
403+await expectPluginStateStoreError(store.register("big", "x".repeat(65_537)), {
387404code: "PLUGIN_STATE_LIMIT_EXCEEDED",
388405});
389406@@ -402,16 +419,16 @@ describe("plugin state keyed store", () => {
402419for (let i = 0; i < 65; i += 1) {
403420deep = { nested: deep };
404421}
405-await expect(store.register("deep", deep)).rejects.toMatchObject({
422+await expectPluginStateStoreError(store.register("deep", deep), {
406423code: "PLUGIN_STATE_LIMIT_EXCEEDED",
407424});
408425409426// Validation errors surface the correct operation
410-await expect(store.lookup(" ")).rejects.toMatchObject({
427+await expectPluginStateStoreError(store.lookup(" "), {
411428code: "PLUGIN_STATE_INVALID_INPUT",
412429operation: "lookup",
413430});
414-await expect(store.delete(" ")).rejects.toMatchObject({
431+await expectPluginStateStoreError(store.delete(" "), {
415432code: "PLUGIN_STATE_INVALID_INPUT",
416433operation: "delete",
417434});
@@ -480,7 +497,7 @@ describe("plugin state keyed store", () => {
480497db.close();
481498482499const store = createPluginStateKeyedStore("discord", { namespace: "schema", maxEntries: 10 });
483-await expect(store.register("k", { ok: true })).rejects.toMatchObject({
500+await expectPluginStateStoreError(store.register("k", { ok: true }), {
484501code: "PLUGIN_STATE_SCHEMA_UNSUPPORTED",
485502});
486503});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。