Initial Commit
This commit is contained in:
93
packages/foundation/data/pwa/src/schemas/schemas.test.ts
Normal file
93
packages/foundation/data/pwa/src/schemas/schemas.test.ts
Normal file
@@ -0,0 +1,93 @@
|
||||
import { describe, expect, it } from "@suaveplan/testing/runner";
|
||||
import { SYNC_QUEUE_SCHEMA_VERSION } from "../constants/index";
|
||||
import {
|
||||
JsonValueSchema,
|
||||
SyncQueueEntrySchema,
|
||||
WebAppManifestSchema,
|
||||
} from "./schemas";
|
||||
|
||||
describe("SyncQueueEntrySchema", () => {
|
||||
const valid = {
|
||||
id: "sq_1",
|
||||
url: "/api/v1/orders",
|
||||
method: "POST",
|
||||
createdAt: 1_700_000_000_000,
|
||||
retryCount: 0,
|
||||
maxRetries: 3,
|
||||
schemaVersion: SYNC_QUEUE_SCHEMA_VERSION,
|
||||
};
|
||||
|
||||
it("accepts a fully-populated entry", { timeout: 5000 }, () => {
|
||||
const parsed = SyncQueueEntrySchema.parse({
|
||||
...valid,
|
||||
headers: { "x-trace": "abc" },
|
||||
body: '{"a":1}',
|
||||
metadata: { tenant: "acme", attempts: 2, flags: [true, "x"] },
|
||||
});
|
||||
expect(parsed.id).toBe("sq_1");
|
||||
expect(parsed.metadata?.tenant).toBe("acme");
|
||||
});
|
||||
|
||||
it("rejects entries with the wrong schemaVersion", {
|
||||
timeout: 5000,
|
||||
}, () => {
|
||||
expect(() =>
|
||||
SyncQueueEntrySchema.parse({ ...valid, schemaVersion: 1 })
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
it("rejects negative retryCount", { timeout: 5000 }, () => {
|
||||
expect(() =>
|
||||
SyncQueueEntrySchema.parse({ ...valid, retryCount: -1 })
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
it("rejects metadata containing non-JSON values", { timeout: 5000 }, () => {
|
||||
expect(() =>
|
||||
SyncQueueEntrySchema.parse({
|
||||
...valid,
|
||||
metadata: { fn: () => 1 },
|
||||
})
|
||||
).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe("JsonValueSchema", () => {
|
||||
it("accepts nested JSON values", { timeout: 5000 }, () => {
|
||||
expect(() =>
|
||||
JsonValueSchema.parse({
|
||||
a: [1, "x", true, null, { b: [false, "y"] }],
|
||||
})
|
||||
).not.toThrow();
|
||||
});
|
||||
|
||||
it("rejects functions", { timeout: 5000 }, () => {
|
||||
expect(() => JsonValueSchema.parse(() => 1)).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe("WebAppManifestSchema", () => {
|
||||
it("accepts a minimal valid manifest", { timeout: 5000 }, () => {
|
||||
const parsed = WebAppManifestSchema.parse({
|
||||
name: "Suaveplan",
|
||||
icons: [{ src: "/icon.png", sizes: "512x512" }],
|
||||
});
|
||||
expect(parsed.name).toBe("Suaveplan");
|
||||
});
|
||||
|
||||
it("rejects manifests without icons", { timeout: 5000 }, () => {
|
||||
expect(() =>
|
||||
WebAppManifestSchema.parse({ name: "X", icons: [] })
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
it("rejects manifests with invalid display", { timeout: 5000 }, () => {
|
||||
expect(() =>
|
||||
WebAppManifestSchema.parse({
|
||||
name: "X",
|
||||
icons: [{ src: "/i.png", sizes: "1x1" }],
|
||||
display: "bogus",
|
||||
})
|
||||
).toThrow();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user