Skip to content

Commit 241b8fc

Browse files
authored
Merge branch 'master' into patch-1
2 parents 2776e72 + f04e28e commit 241b8fc

187 files changed

Lines changed: 2253 additions & 1735 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

frontend/__tests__/commandline/util.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
//import type { ConfigMetadata } from "../../src/ts/config-metadata";
1+
//import type { ConfigMetadata } from "../../src/ts/config/metadata";
22

33
import { describe, it, expect, afterAll, vi } from "vitest";
44
import * as Util from "../../src/ts/commandline/util";
55

66
import type { CommandlineConfigMetadata } from "../../src/ts/commandline/commandline-metadata";
77
import type { ConfigKey } from "@monkeytype/schemas/configs";
8-
import type { ConfigMetadata } from "../../src/ts/config-metadata";
8+
import type { ConfigMetadata } from "../../src/ts/config/metadata";
99
import { z, ZodSchema } from "zod";
1010

1111
const buildCommandForConfigKey = Util.__testing._buildCommandForConfigKey;
1212

1313
describe("CommandlineUtils", () => {
14-
vi.mock("../../src/ts/config-metadata", () => ({ configMetadata: [] }));
14+
vi.mock("../../src/ts/config/metadata", () => ({ configMetadata: [] }));
1515
vi.mock("../../src/ts/commandline/commandline-metadata", () => ({
1616
commandlineConfigMetadata: [],
1717
}));

frontend/__tests__/controllers/preset-controller.spec.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import { describe, it, expect, beforeEach, vi } from "vitest";
22
import * as PresetController from "../../src/ts/controllers/preset-controller";
33
import { Preset } from "@monkeytype/schemas/presets";
44
import * as DB from "../../src/ts/db";
5-
import * as UpdateConfig from "../../src/ts/config";
5+
import { setConfig } from "../../src/ts/config/setters";
6+
import { Config } from "../../src/ts/config/store";
7+
import * as Lifecycle from "../../src/ts/config/lifecycle";
8+
import * as ConfigUtils from "../../src/ts/config/utils";
9+
import * as Persistence from "../../src/ts/config/persistence";
610
import * as Notifications from "../../src/ts/states/notifications";
711
import * as TestLogic from "../../src/ts/test/test-logic";
812
import * as TagController from "../../src/ts/controllers/tag-controller";
@@ -16,13 +20,13 @@ describe("PresetController", () => {
1620
//
1721
}));
1822
const dbGetSnapshotMock = vi.spyOn(DB, "getSnapshot");
19-
const configApplyMock = vi.spyOn(UpdateConfig, "applyConfig");
23+
const configApplyMock = vi.spyOn(Lifecycle, "applyConfig");
2024
const configSaveFullConfigMock = vi.spyOn(
21-
UpdateConfig,
25+
Persistence,
2226
"saveFullConfigToLocalStorage",
2327
);
2428
const configGetConfigChangesMock = vi.spyOn(
25-
UpdateConfig,
29+
ConfigUtils,
2630
"getConfigChanges",
2731
);
2832
const notificationAddMock = vi.spyOn(
@@ -111,8 +115,8 @@ describe("PresetController", () => {
111115
settingGroups: ["test"],
112116
});
113117

114-
UpdateConfig.setConfig("numbers", true);
115-
const oldConfig = structuredClone(UpdateConfig.default);
118+
setConfig("numbers", true);
119+
const oldConfig = structuredClone(Config);
116120

117121
//WHEN
118122
await PresetController.apply(preset._id);

frontend/__tests__/controllers/url-handler.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { describe, it, expect, beforeEach, vi } from "vitest";
22
import { Difficulty, Mode, Mode2 } from "@monkeytype/schemas/shared";
33
import { compressToURI } from "lz-ts";
4-
import * as UpdateConfig from "../../src/ts/config";
4+
import * as UpdateConfig from "../../src/ts/config/setters";
55
import * as Notifications from "../../src/ts/states/notifications";
66
import * as TestLogic from "../../src/ts/test/test-logic";
77
import * as TestState from "../../src/ts/test/test-state";
Lines changed: 65 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,81 @@
11
import { createRoot } from "solid-js";
2-
import { describe, expect, it } from "vitest";
2+
import { describe, expect, it, vi } from "vitest";
33
import { createEvent } from "../../src/ts/hooks/createEvent";
44

55
describe("createEvent", () => {
6-
it("initial value is 0", () => {
7-
createRoot((dispose) => {
8-
const [event] = createEvent();
9-
expect(event()).toBe(0);
10-
dispose();
11-
});
6+
it("dispatch notifies subscribers", () => {
7+
const event = createEvent<string>();
8+
const fn = vi.fn();
9+
event.subscribe(fn);
10+
event.dispatch("hello");
11+
expect(fn).toHaveBeenCalledWith("hello");
1212
});
1313

14-
it("dispatch increments the value by 1", () => {
15-
createRoot((dispose) => {
16-
const [event, dispatch] = createEvent();
17-
dispatch();
18-
expect(event()).toBe(1);
19-
dispose();
20-
});
14+
it("dispatch notifies multiple subscribers", () => {
15+
const event = createEvent<number>();
16+
const fn1 = vi.fn();
17+
const fn2 = vi.fn();
18+
event.subscribe(fn1);
19+
event.subscribe(fn2);
20+
event.dispatch(42);
21+
expect(fn1).toHaveBeenCalledWith(42);
22+
expect(fn2).toHaveBeenCalledWith(42);
2123
});
2224

23-
it("each dispatch increments independently", () => {
24-
createRoot((dispose) => {
25-
const [event, dispatch] = createEvent();
26-
dispatch();
27-
dispatch();
28-
dispatch();
29-
expect(event()).toBe(3);
30-
dispose();
31-
});
25+
it("dispatch with no type arg requires no arguments", () => {
26+
const event = createEvent();
27+
const fn = vi.fn();
28+
event.subscribe(fn);
29+
event.dispatch();
30+
expect(fn).toHaveBeenCalledTimes(1);
31+
});
32+
33+
it("subscribe returns an unsubscribe function", () => {
34+
const event = createEvent<string>();
35+
const fn = vi.fn();
36+
const unsub = event.subscribe(fn);
37+
event.dispatch("a");
38+
unsub();
39+
event.dispatch("b");
40+
expect(fn).toHaveBeenCalledTimes(1);
41+
expect(fn).toHaveBeenCalledWith("a");
3242
});
3343

3444
it("two independent events do not share state", () => {
45+
const eventA = createEvent<string>();
46+
const eventB = createEvent<string>();
47+
const fnA = vi.fn();
48+
const fnB = vi.fn();
49+
eventA.subscribe(fnA);
50+
eventB.subscribe(fnB);
51+
eventA.dispatch("a");
52+
expect(fnA).toHaveBeenCalledWith("a");
53+
expect(fnB).not.toHaveBeenCalled();
54+
});
55+
56+
it("useListener auto-unsubscribes on dispose", () => {
57+
const event = createEvent<string>();
58+
const fn = vi.fn();
3559
createRoot((dispose) => {
36-
const [eventA, dispatchA] = createEvent();
37-
const [eventB, dispatchB] = createEvent();
38-
dispatchA();
39-
dispatchA();
40-
dispatchB();
41-
expect(eventA()).toBe(2);
42-
expect(eventB()).toBe(1);
60+
event.useListener(fn);
61+
event.dispatch("inside");
4362
dispose();
4463
});
64+
event.dispatch("outside");
65+
expect(fn).toHaveBeenCalledTimes(1);
66+
expect(fn).toHaveBeenCalledWith("inside");
67+
});
68+
69+
it("subscriber errors do not prevent other subscribers from running", () => {
70+
const event = createEvent<string>();
71+
const fn1 = vi.fn(() => {
72+
throw new Error("oops");
73+
});
74+
const fn2 = vi.fn();
75+
event.subscribe(fn1);
76+
event.subscribe(fn2);
77+
event.dispatch("test");
78+
expect(fn1).toHaveBeenCalled();
79+
expect(fn2).toHaveBeenCalled();
4580
});
4681
});

frontend/__tests__/input/helpers/fail-or-finish.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
checkIfFailedDueToDifficulty,
55
checkIfFinished,
66
} from "../../../src/ts/input/helpers/fail-or-finish";
7-
import { __testing } from "../../../src/ts/config";
7+
import { __testing } from "../../../src/ts/config/testing";
88
import * as Misc from "../../../src/ts/utils/misc";
99
import * as TestLogic from "../../../src/ts/test/test-logic";
1010
import * as Strings from "../../../src/ts/utils/strings";

frontend/__tests__/input/helpers/validation.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
isCharCorrect,
44
shouldInsertSpaceCharacter,
55
} from "../../../src/ts/input/helpers/validation";
6-
import { __testing } from "../../../src/ts/config";
6+
import { __testing } from "../../../src/ts/config/testing";
77
import * as FunboxList from "../../../src/ts/test/funbox/list";
88
import * as Strings from "../../../src/ts/utils/strings";
99

frontend/__tests__/root/config-metadata.spec.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { describe, it, expect, afterAll, vi } from "vitest";
2-
import { configMetadata } from "../../src/ts/config-metadata";
3-
import * as Config from "../../src/ts/config";
2+
import { configMetadata } from "../../src/ts/config/metadata";
3+
import { __testing } from "../../src/ts/config/testing";
4+
import { setConfig } from "../../src/ts/config/setters";
45
import { ConfigKey, Config as ConfigType } from "@monkeytype/schemas/configs";
56

6-
const { replaceConfig, getConfig } = Config.__testing;
7+
const { replaceConfig, getConfig } = __testing;
78

89
type TestsByConfig<T> = Partial<{
910
[K in keyof ConfigType]: (T & { value: ConfigType[K] })[];
@@ -138,7 +139,7 @@ describe("ConfigMeta", () => {
138139
replaceConfig(given ?? {});
139140

140141
//WHEN
141-
Config.setConfig(key, value as any);
142+
setConfig(key, value as any);
142143

143144
//THEN
144145
expect(getConfig()).toMatchObject(expected);
@@ -175,7 +176,7 @@ describe("ConfigMeta", () => {
175176
replaceConfig(given ?? {});
176177

177178
//WHEN
178-
const applied = Config.setConfig(key, value as any);
179+
const applied = setConfig(key, value as any);
179180

180181
//THEN
181182
expect(applied).toEqual(!fail);
@@ -335,7 +336,7 @@ describe("ConfigMeta", () => {
335336
replaceConfig(given);
336337

337338
//WHEN
338-
Config.setConfig(key, value as any);
339+
setConfig(key, value as any);
339340

340341
//THEN
341342
expect(getConfig()).toMatchObject(expected ?? {});

frontend/__tests__/root/config.spec.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import { describe, it, expect, beforeEach, afterAll, vi } from "vitest";
2-
import * as Config from "../../src/ts/config";
2+
import * as Config from "../../src/ts/config/setters";
3+
import * as Lifecycle from "../../src/ts/config/lifecycle";
4+
import * as ConfigUtils from "../../src/ts/config/utils";
5+
import { __testing } from "../../src/ts/config/testing";
36
import * as Misc from "../../src/ts/utils/misc";
47
import * as Env from "../../src/ts/utils/env";
58
import {
69
ConfigKey,
710
Config as ConfigType,
811
CaretStyleSchema,
912
} from "@monkeytype/schemas/configs";
10-
import * as FunboxValidation from "../../src/ts/test/funbox/funbox-validation";
11-
import * as ConfigValidation from "../../src/ts/config-validation";
12-
import * as ConfigEvent from "../../src/ts/observables/config-event";
13+
import * as FunboxValidation from "../../src/ts/config/funbox-validation";
14+
import * as ConfigValidation from "../../src/ts/config/validation";
15+
import { configEvent } from "../../src/ts/events/config";
1316
import * as ApeConfig from "../../src/ts/ape/config";
1417
import * as Notifications from "../../src/ts/states/notifications";
15-
const { replaceConfig, getConfig } = Config.__testing;
18+
const { replaceConfig, getConfig } = __testing;
1619

1720
describe("Config", () => {
1821
const isDevEnvironmentMock = vi.spyOn(Env, "isDevEnvironment");
@@ -30,7 +33,7 @@ describe("Config", () => {
3033
ConfigValidation,
3134
"isConfigValueValid",
3235
);
33-
const dispatchConfigEventMock = vi.spyOn(ConfigEvent, "dispatch");
36+
const dispatchConfigEventMock = vi.spyOn(configEvent, "dispatch");
3437
const dbSaveConfigMock = vi.spyOn(ApeConfig, "saveConfig");
3538
const notificationAddMock = vi.spyOn(
3639
Notifications,
@@ -281,7 +284,7 @@ describe("Config", () => {
281284
replaceConfig({
282285
mode: "words",
283286
});
284-
await Config.applyConfig({
287+
await Lifecycle.applyConfig({
285288
numbers: true,
286289
punctuation: true,
287290
});
@@ -326,7 +329,7 @@ describe("Config", () => {
326329
];
327330

328331
it.each(testCases)("$display", async ({ value, expected }) => {
329-
await Config.applyConfig(value);
332+
await Lifecycle.applyConfig(value);
330333

331334
const config = getConfig();
332335
const applied = Object.fromEntries(
@@ -363,7 +366,7 @@ describe("Config", () => {
363366
];
364367

365368
it.each(testCases)("$display", async ({ value, expected }) => {
366-
await Config.applyConfig(value);
369+
await Lifecycle.applyConfig(value);
367370
const config = getConfig();
368371
const applied = Object.fromEntries(
369372
Object.entries(config).filter(([key]) =>
@@ -378,8 +381,8 @@ describe("Config", () => {
378381
replaceConfig({
379382
numbers: true,
380383
});
381-
await Config.applyConfig({
382-
...Config.getConfigChanges(),
384+
await Lifecycle.applyConfig({
385+
...ConfigUtils.getConfigChanges(),
383386
punctuation: true,
384387
});
385388
const config = getConfig();
@@ -390,7 +393,7 @@ describe("Config", () => {
390393
replaceConfig({
391394
minWpm: "off",
392395
});
393-
await Config.applyConfig({
396+
await Lifecycle.applyConfig({
394397
minWpmCustomSpeed: 100,
395398
});
396399
const config = getConfig();
@@ -402,7 +405,7 @@ describe("Config", () => {
402405
replaceConfig({
403406
minWpm: "off",
404407
});
405-
await Config.applyConfig({
408+
await Lifecycle.applyConfig({
406409
minWpm: "custom",
407410
minWpmCustomSpeed: 100,
408411
});
@@ -413,7 +416,7 @@ describe("Config", () => {
413416

414417
it("should keep the keymap off when applying keymapLayout", async () => {
415418
replaceConfig({});
416-
await Config.applyConfig({
419+
await Lifecycle.applyConfig({
417420
keymapLayout: "qwerty",
418421
});
419422
const config = getConfig();

frontend/__tests__/test/british-english.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, it, expect, beforeEach } from "vitest";
22
import { replace } from "../../src/ts/test/british-english";
3-
import Config from "../../src/ts/config";
3+
import { Config } from "../../src/ts/config/store";
44

55
describe("british-english", () => {
66
describe("replace", () => {

0 commit comments

Comments
 (0)