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", () => ({
|
vi.mock("@/features/housekeeping/foundation/server-capability-context", () => ({
|
||||||
getHousekeepingCapabilityContext: vi.fn(),
|
getHousekeepingCapabilityContext: vi.fn(),
|
||||||
@@ -40,6 +40,15 @@ describe("housekeeping preference actions", () => {
|
|||||||
expect(saveHousekeepingPreferences).toHaveLength(1);
|
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 () => {
|
it("derives the read owner from the server capability context", async () => {
|
||||||
const result = await loadHousekeepingPreferences();
|
const result = await loadHousekeepingPreferences();
|
||||||
|
|
||||||
|
|||||||
@@ -71,4 +71,21 @@ describe("housekeeping preferences schema", () => {
|
|||||||
}).success,
|
}).success,
|
||||||
).toBe(false);
|
).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()
|
.strict()
|
||||||
.superRefine((preferences, context) => {
|
.superRefine((preferences, context) => {
|
||||||
if (
|
if (
|
||||||
JSON.stringify(preferences).length >
|
new TextEncoder().encode(JSON.stringify(preferences)).byteLength >
|
||||||
HOUSEKEEPING_PREFERENCE_MAX_SERIALIZED_BYTES
|
HOUSEKEEPING_PREFERENCE_MAX_SERIALIZED_BYTES
|
||||||
) {
|
) {
|
||||||
context.addIssue({
|
context.addIssue({
|
||||||
|
|||||||
Reference in new issue
Block a user