fix(studio): recover uncertain imports with persistent request identities
This commit is contained in:
1 parent
afea80708c
commit
c977fe95ba
12 files changed
+365
-31
No files matched your search
@@ -0,0 +1,70 @@
|
||||
import { expect, it } from "vitest";
|
||||
import { createFurnitureImportRequests } from "./furniture-import-requests";
|
||||
|
||||
function storage() {
|
||||
const entries = new Map<string, string>();
|
||||
return {
|
||||
entries,
|
||||
getItem: (key: string) => entries.get(key) ?? null,
|
||||
setItem: (key: string, value: string) => {
|
||||
entries.set(key, value);
|
||||
},
|
||||
removeItem: (key: string) => {
|
||||
entries.delete(key);
|
||||
},
|
||||
};
|
||||
}
|
||||
it("reuses an uncertain request across reloads without storing furniture content", async () => {
|
||||
const saved = storage();
|
||||
const first = await createFurnitureImportRequests(7, () => saved).get(
|
||||
'{"name":"private furniture"}',
|
||||
);
|
||||
const resumed = await createFurnitureImportRequests(7, () => saved).get(
|
||||
'{"name":"private furniture"}',
|
||||
);
|
||||
expect(resumed.id).toBe(first.id);
|
||||
expect(JSON.stringify([...saved.entries])).not.toContain("private furniture");
|
||||
});
|
||||
it("keeps pending requests distinct across accounts and changed selections", async () => {
|
||||
const saved = storage();
|
||||
const client = createFurnitureImportRequests(7, () => saved);
|
||||
const first = await client.get("chair");
|
||||
const second = await client.get("lamp");
|
||||
const other = await createFurnitureImportRequests(8, () => saved).get(
|
||||
"chair",
|
||||
);
|
||||
expect(new Set([first.id, second.id, other.id]).size).toBe(3);
|
||||
expect((await client.get("chair")).id).toBe(first.id);
|
||||
});
|
||||
it("starts a new request only after the previous one was acknowledged", async () => {
|
||||
const saved = storage();
|
||||
const client = createFurnitureImportRequests(7, () => saved);
|
||||
const pending = await client.get("chair");
|
||||
client.acknowledge(pending);
|
||||
expect(
|
||||
(await createFurnitureImportRequests(7, () => saved).get("chair")).id,
|
||||
).not.toBe(pending.id);
|
||||
});
|
||||
it("keeps request identity in memory if session storage is unavailable", async () => {
|
||||
const client = createFurnitureImportRequests(7, () => {
|
||||
throw Error("denied");
|
||||
});
|
||||
const pending = await client.get("chair");
|
||||
expect((await client.get("chair")).id).toBe(pending.id);
|
||||
client.acknowledge(pending);
|
||||
expect((await client.get("chair")).id).not.toBe(pending.id);
|
||||
});
|
||||
it("does not persist an unscoped request and ignores corrupt saved IDs", async () => {
|
||||
const saved = storage();
|
||||
await createFurnitureImportRequests(undefined, () => saved).get("chair");
|
||||
expect(saved.entries.size).toBe(0);
|
||||
const first = await createFurnitureImportRequests(7, () => saved).get(
|
||||
"chair",
|
||||
);
|
||||
saved.setItem(first.key, "../invalid");
|
||||
const repaired = await createFurnitureImportRequests(7, () => saved).get(
|
||||
"chair",
|
||||
);
|
||||
expect(repaired.id).not.toBe("../invalid");
|
||||
expect(saved.getItem(first.key)).toBe(repaired.id);
|
||||
});
|
||||
Reference in new issue
Block a user