diff --git a/frontend/__tests__/controllers/url-handler.spec.ts b/frontend/__tests__/controllers/url-handler.spec.ts index e55ec6304172..c7af3df60019 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); @@ -212,6 +224,152 @@ describe("url-handler", () => { ); expect(restartTestMock).toHaveBeenCalled(); }); + 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({ + 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("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( 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