fix(housekeeping): count preference payload bytes
This commit is contained in:
1 parent
4e0bf598ed
commit
60968409aa
3 files changed
+28
-2
No files matched your search
@@ -1,4 +1,4 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { beforeEach, describe, expect, expectTypeOf, it, vi } from "vitest";
|
||||
|
||||
vi.mock("@/features/housekeeping/foundation/server-capability-context", () => ({
|
||||
getHousekeepingCapabilityContext: vi.fn(),
|
||||
@@ -40,6 +40,15 @@ describe("housekeeping preference actions", () => {
|
||||
expect(saveHousekeepingPreferences).toHaveLength(1);
|
||||
});
|
||||
|
||||
it("publishes exact action signatures without caller-controlled dependencies", () => {
|
||||
expectTypeOf<
|
||||
Parameters<typeof loadHousekeepingPreferences>
|
||||
>().toEqualTypeOf<[]>();
|
||||
expectTypeOf<
|
||||
Parameters<typeof saveHousekeepingPreferences>
|
||||
>().toEqualTypeOf<[input: unknown]>();
|
||||
});
|
||||
|
||||
it("derives the read owner from the server capability context", async () => {
|
||||
const result = await loadHousekeepingPreferences();
|
||||
|
||||
|
||||
@@ -71,4 +71,21 @@ describe("housekeeping preferences schema", () => {
|
||||
}).success,
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("rejects a Unicode payload whose UTF-8 bytes exceed the 4096-byte limit", () => {
|
||||
const value = {
|
||||
...defaultHousekeepingPreferences(),
|
||||
pinnedRouteIds: Array.from(
|
||||
{ length: 29 },
|
||||
(_, index) => `${index.toString().padStart(3, "0")}${"é".repeat(125)}`,
|
||||
),
|
||||
};
|
||||
const serialized = JSON.stringify(value);
|
||||
|
||||
expect(serialized.length).toBeLessThanOrEqual(4096);
|
||||
expect(new TextEncoder().encode(serialized).byteLength).toBeGreaterThan(
|
||||
4096,
|
||||
);
|
||||
expect(housekeepingPreferencesSchema.safeParse(value).success).toBe(false);
|
||||
});
|
||||
});
|
||||
@@ -45,7 +45,7 @@ export const housekeepingPreferencesSchema: z.ZodType<HousekeepingPreferences> =
|
||||
.strict()
|
||||
.superRefine((preferences, context) => {
|
||||
if (
|
||||
JSON.stringify(preferences).length >
|
||||
new TextEncoder().encode(JSON.stringify(preferences)).byteLength >
|
||||
HOUSEKEEPING_PREFERENCE_MAX_SERIALIZED_BYTES
|
||||
) {
|
||||
context.addIssue({
|
||||
|
||||
Reference in new issue
Block a user