diff --git a/frontend/__tests__/utils/misc.spec.ts b/frontend/__tests__/utils/misc.spec.ts index dec5c7af5..61e6b0bc3 100644 --- a/frontend/__tests__/utils/misc.spec.ts +++ b/frontend/__tests__/utils/misc.spec.ts @@ -9,42 +9,47 @@ import { getLanguageDisplayString, removeLanguageSize, } from "../../src/ts/utils/strings"; +import { Language } from "@monkeytype/schemas/languages"; //todo this file is in the wrong place describe("misc.ts", () => { describe("getLanguageDisplayString", () => { it("should return correctly formatted strings", () => { - const tests = [ + const tests: { + input: Language; + noSizeString: boolean; + expected: string; + }[] = [ { - input: "language", + input: "english", noSizeString: false, - expected: "language", + expected: "english", }, { - input: "language_1k", + input: "english_1k", noSizeString: false, - expected: "language 1k", + expected: "english 1k", }, { - input: "language_1k", + input: "english_1k", noSizeString: true, - expected: "language", + expected: "english", }, { - input: "language_lang", + input: "english_medical", noSizeString: false, - expected: "language lang", + expected: "english medical", }, { - input: "language_lang_1k", + input: "arabic_egypt_1k", noSizeString: false, - expected: "language lang 1k", + expected: "arabic egypt 1k", }, { - input: "language_lang_1k", + input: "arabic_egypt_1k", noSizeString: true, - expected: "language lang", + expected: "arabic egypt", }, ]; @@ -56,22 +61,22 @@ describe("misc.ts", () => { }); describe("removeLanguageSize", () => { it("should remove language size", () => { - const tests = [ + const tests: { input: Language; expected: Language }[] = [ { - input: "language", - expected: "language", + input: "english", + expected: "english", }, { - input: "language_1k", - expected: "language", + input: "english_1k", + expected: "english", }, { - input: "language_lang", - expected: "language_lang", + input: "arabic_egypt", + expected: "arabic_egypt", }, { - input: "language_lang_1k", - expected: "language_lang", + input: "arabic_egypt_1k", + expected: "arabic_egypt", }, ]; @@ -284,6 +289,25 @@ describe("misc.ts", () => { }); }); + it("should throw on nested objects", () => { + const schema = z + .object({ + name: z.string(), + info: z.object({ age: z.number() }).partial(), + }) + .partial(); + const obj = { + name: "Alice", + info: { age: "42" as any }, + }; + + expect(() => { + sanitize(schema, obj); + }).toThrowError( + "sanitize does not support nested objects yet. path: info.age" + ); + }); + it("should remove entire property if all array elements are invalid", () => { const obj = { name: "Alice", age: 30, tags: [123, 456] as any }; const sanitized = sanitize(schema, obj); diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index db833c52d..862cd2ba3 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -734,6 +734,11 @@ export function sanitize( let val = errors.get(element); if (typeof error.path[1] === "number") { val = [...(val ?? []), error.path[1]]; + } else if (error.path.length > 1) { + throw new Error( + "sanitize does not support nested objects yet. path: " + + error.path.join(".") + ); } errors.set(element, val); }