From 6b1d337aaaab5963322a51bd37dc68fd82b6affe Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Wed, 22 Jul 2026 10:02:03 +0200 Subject: [PATCH 1/3] fix(test): shared settings ignoring setPipeDelimiter=false (@fehmer) --- .../__tests__/controllers/url-handler.spec.ts | 19 +++++++++++++++++++ frontend/src/ts/controllers/url-handler.tsx | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/frontend/__tests__/controllers/url-handler.spec.ts b/frontend/__tests__/controllers/url-handler.spec.ts index e55ec6304172..7acc91c2f490 100644 --- a/frontend/__tests__/controllers/url-handler.spec.ts +++ b/frontend/__tests__/controllers/url-handler.spec.ts @@ -193,6 +193,25 @@ describe("url-handler", () => { ); expect(restartTestMock).toHaveBeenCalled(); }); + it("sets pipeDelimiter to false", () => { + //GIVEN + findGetParameterMock.mockReturnValue( + urlData({ + customText: { + text: ["abc"], + pipeDelimiter: false, + mode: "repeat", + limit: { mode: "word", value: 10 }, + }, + }), + ); + + //WHEN + loadTestSettingsFromUrl(""); + + //THEN + expect(TestLogic.restart).toHaveBeenCalled(); + }); it("sets funbox legacy", () => { //GIVEN findGetParameterMock.mockReturnValue( diff --git a/frontend/src/ts/controllers/url-handler.tsx b/frontend/src/ts/controllers/url-handler.tsx index f87365c62521..c43f0c6717bd 100644 --- a/frontend/src/ts/controllers/url-handler.tsx +++ b/frontend/src/ts/controllers/url-handler.tsx @@ -235,7 +235,7 @@ export function loadTestSettingsFromUrl(getOverride?: string): void { } } - if (customTextSettings.pipeDelimiter) { + if (customTextSettings.pipeDelimiter !== undefined) { CustomText.setPipeDelimiter(customTextSettings.pipeDelimiter); } //convert legacy values From 0c79f07c95d2971bc87fb3e7ab9e89b274170cc6 Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Wed, 22 Jul 2026 10:17:06 +0200 Subject: [PATCH 2/3] tests --- .../__tests__/controllers/url-handler.spec.ts | 55 ++++++++++++------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/frontend/__tests__/controllers/url-handler.spec.ts b/frontend/__tests__/controllers/url-handler.spec.ts index 7acc91c2f490..ae595b9b19f9 100644 --- a/frontend/__tests__/controllers/url-handler.spec.ts +++ b/frontend/__tests__/controllers/url-handler.spec.ts @@ -6,6 +6,7 @@ import * as Notifications from "../../src/ts/states/notifications"; import * as TestLogic from "../../src/ts/test/test-logic"; import * as TestState from "../../src/ts/states/test"; import * as Misc from "../../src/ts/utils/misc"; +import * as CustomText from "../../src/ts/test/custom-text"; import { FunboxName } from "@monkeytype/schemas/configs"; import { CustomTextSettings } from "@monkeytype/schemas/results"; import { loadTestSettingsFromUrl } from "../../src/ts/controllers/url-handler"; @@ -28,6 +29,12 @@ describe("url-handler", () => { ); const notifyMock = vi.spyOn(Notifications, "showNoticeNotification"); + const setTextMock = vi.spyOn(CustomText, "setText"); + const setModeMock = vi.spyOn(CustomText, "setMode"); + const setLimitModeMock = vi.spyOn(CustomText, "setLimitMode"); + const setLimitValueMock = vi.spyOn(CustomText, "setLimitValue"); + const setPipeDelimiterMock = vi.spyOn(CustomText, "setPipeDelimiter"); + beforeEach(() => { [ setConfigMock, @@ -36,6 +43,11 @@ describe("url-handler", () => { restartTestMock, notifySuccessMock, notifyMock, + setTextMock, + setModeMock, + setLimitModeMock, + setLimitValueMock, + setPipeDelimiterMock, ].forEach((it) => it.mockClear()); findGetParameterMock.mockImplementation((override) => override); @@ -193,25 +205,6 @@ describe("url-handler", () => { ); expect(restartTestMock).toHaveBeenCalled(); }); - it("sets pipeDelimiter to false", () => { - //GIVEN - findGetParameterMock.mockReturnValue( - urlData({ - customText: { - text: ["abc"], - pipeDelimiter: false, - mode: "repeat", - limit: { mode: "word", value: 10 }, - }, - }), - ); - - //WHEN - loadTestSettingsFromUrl(""); - - //THEN - expect(TestLogic.restart).toHaveBeenCalled(); - }); it("sets funbox legacy", () => { //GIVEN findGetParameterMock.mockReturnValue( @@ -231,6 +224,30 @@ describe("url-handler", () => { ); expect(restartTestMock).toHaveBeenCalled(); }); + it("sets customText with pipeDelimiter to false", () => { + //GIVEN + findGetParameterMock.mockReturnValue( + urlData({ + customText: { + text: ["a b c"], + pipeDelimiter: false, + mode: "repeat", + limit: { mode: "word", value: 10 }, + }, + }), + ); + + //WHEN + loadTestSettingsFromUrl(""); + + //THEN + expect(setTextMock).toHaveBeenLastCalledWith(["a b c"]); + expect(setModeMock).toHaveBeenCalledWith("repeat"); + expect(setLimitModeMock).toHaveBeenCalledWith("word"); + expect(setLimitValueMock).toHaveBeenLastCalledWith(10); + expect(setPipeDelimiterMock).toHaveBeenCalledWith(false); + expect(restartTestMock).toHaveBeenCalled(); + }); it("adds notification", () => { //GIVEN findGetParameterMock.mockReturnValue( From 49ffe6b4e8b8ed2a717c6f27d3e550383f20f964 Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Wed, 22 Jul 2026 10:23:09 +0200 Subject: [PATCH 3/3] add missing tests for testSettings url --- .../__tests__/controllers/url-handler.spec.ts | 124 +++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/frontend/__tests__/controllers/url-handler.spec.ts b/frontend/__tests__/controllers/url-handler.spec.ts index ae595b9b19f9..c7af3df60019 100644 --- a/frontend/__tests__/controllers/url-handler.spec.ts +++ b/frontend/__tests__/controllers/url-handler.spec.ts @@ -224,7 +224,31 @@ describe("url-handler", () => { ); expect(restartTestMock).toHaveBeenCalled(); }); - it("sets customText with pipeDelimiter to false", () => { + it("sets custom text (text, mode, limit, pipeDelimiter)", () => { + //GIVEN + findGetParameterMock.mockReturnValue( + urlData({ + customText: { + text: ["hello", "world"], + limit: { mode: "word", value: 5 }, + mode: "random", + pipeDelimiter: true, + }, + }), + ); + + //WHEN + loadTestSettingsFromUrl(""); + + //THEN + expect(setTextMock).toHaveBeenCalledWith(["hello", "world"]); + expect(setModeMock).toHaveBeenCalledWith("random"); + expect(setLimitModeMock).toHaveBeenCalledWith("word"); + expect(setLimitValueMock).toHaveBeenCalledWith(5); + expect(setPipeDelimiterMock).toHaveBeenCalledWith(true); + expect(restartTestMock).toHaveBeenCalled(); + }); + it("sets custom text with pipeDelimiter to false", () => { //GIVEN findGetParameterMock.mockReturnValue( urlData({ @@ -248,6 +272,104 @@ describe("url-handler", () => { expect(setPipeDelimiterMock).toHaveBeenCalledWith(false); expect(restartTestMock).toHaveBeenCalled(); }); + it("sets custom text mode to 'repeat' when undefined", () => { + //GIVEN + findGetParameterMock.mockReturnValue( + urlData({ + customText: { + text: ["hello"], + limit: { mode: "word", value: 5 }, + } as any, + }), + ); + + //WHEN + loadTestSettingsFromUrl(""); + + //THEN + expect(setModeMock).toHaveBeenCalledWith("repeat"); + expect(restartTestMock).toHaveBeenCalled(); + }); + it("does not call limit setters when limit is undefined", () => { + //GIVEN + findGetParameterMock.mockReturnValue( + urlData({ + customText: { + text: ["hello", "world"], + mode: "repeat", + } as any, + }), + ); + + //WHEN + loadTestSettingsFromUrl(""); + + //THEN + expect(setLimitModeMock).not.toHaveBeenCalled(); + expect(setLimitValueMock).not.toHaveBeenCalled(); + expect(restartTestMock).toHaveBeenCalled(); + }); + it("sets pipeDelimiter to true when delimiter is '|' (legacy)", () => { + //GIVEN + findGetParameterMock.mockReturnValue( + urlData({ + customText: { + text: ["a", "b"], + mode: "repeat", + delimiter: "|", + } as any, + }), + ); + + //WHEN + loadTestSettingsFromUrl(""); + + //THEN + expect(setPipeDelimiterMock).toHaveBeenCalledWith(true); + expect(restartTestMock).toHaveBeenCalled(); + }); + it("handles legacy isWordRandom", () => { + //GIVEN + findGetParameterMock.mockReturnValue( + urlData({ + customText: { + text: ["hello"], + mode: "repeat", + isWordRandom: true, + word: 10, + } as any, + }), + ); + + //WHEN + loadTestSettingsFromUrl(""); + + //THEN + expect(setLimitModeMock).toHaveBeenCalledWith("word"); + expect(setLimitValueMock).toHaveBeenCalledWith(10); + expect(restartTestMock).toHaveBeenCalled(); + }); + it("handles legacy isTimeRandom", () => { + //GIVEN + findGetParameterMock.mockReturnValue( + urlData({ + customText: { + text: ["hello"], + mode: "repeat", + isTimeRandom: true, + time: 60, + } as any, + }), + ); + + //WHEN + loadTestSettingsFromUrl(""); + + //THEN + expect(setLimitModeMock).toHaveBeenCalledWith("time"); + expect(setLimitValueMock).toHaveBeenCalledWith(60); + expect(restartTestMock).toHaveBeenCalled(); + }); it("adds notification", () => { //GIVEN findGetParameterMock.mockReturnValue(