Skip to content

Commit 1c8a112

Browse files
committed
test: avoid repeated module reloads in unit tests
1 parent 608fa52 commit 1c8a112

3 files changed

Lines changed: 22 additions & 58 deletions

File tree

src/flows/channel-setup.status.test.ts

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ type FormatChannelPrimerLine = typeof import("../channels/registry.js").formatCh
1212
type FormatChannelSelectionLine =
1313
typeof import("../channels/registry.js").formatChannelSelectionLine;
1414
type IsChannelConfigured = typeof import("../config/channel-configured.js").isChannelConfigured;
15-
type ChannelSetupStatusModule = typeof import("./channel-setup.status.js");
1615
type NoteChannelPrimerChannels = Parameters<
1716
typeof import("./channel-setup.status.js").noteChannelPrimer
1817
>[1];
@@ -74,11 +73,13 @@ vi.mock("../plugins/bundled-sources.js", () => ({
7473
findBundledPluginSourceInMap: () => undefined,
7574
}));
7675

77-
let collectChannelStatus: ChannelSetupStatusModule["collectChannelStatus"];
78-
let noteChannelStatus: ChannelSetupStatusModule["noteChannelStatus"];
79-
let noteChannelPrimer: ChannelSetupStatusModule["noteChannelPrimer"];
80-
let resolveChannelSelectionNoteLines: ChannelSetupStatusModule["resolveChannelSelectionNoteLines"];
81-
let resolveChannelSetupSelectionContributions: ChannelSetupStatusModule["resolveChannelSetupSelectionContributions"];
76+
import {
77+
collectChannelStatus,
78+
noteChannelPrimer,
79+
noteChannelStatus,
80+
resolveChannelSelectionNoteLines,
81+
resolveChannelSetupSelectionContributions,
82+
} from "./channel-setup.status.js";
8283

8384
function requireFirstMockCall<const Calls extends readonly unknown[][]>(
8485
calls: Calls,
@@ -92,8 +93,7 @@ function requireFirstMockCall<const Calls extends readonly unknown[][]>(
9293
}
9394

9495
describe("resolveChannelSetupSelectionContributions", () => {
95-
beforeEach(async () => {
96-
vi.resetModules();
96+
beforeEach(() => {
9797
vi.clearAllMocks();
9898
listChatChannels.mockReturnValue([
9999
makeMeta("discord", "Discord"),
@@ -105,13 +105,6 @@ describe("resolveChannelSetupSelectionContributions", () => {
105105
);
106106
formatChannelSelectionLine.mockImplementation((meta) => `${meta.label}${meta.blurb}`);
107107
isChannelConfigured.mockReturnValue(false);
108-
({
109-
collectChannelStatus,
110-
noteChannelStatus,
111-
noteChannelPrimer,
112-
resolveChannelSelectionNoteLines,
113-
resolveChannelSetupSelectionContributions,
114-
} = await import("./channel-setup.status.js"));
115108
});
116109

117110
it("sorts channels alphabetically by picker label", () => {

src/image-generation/provider-registry.test.ts

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { beforeEach, describe, expect, it, vi } from "vitest";
22
import type { OpenClawConfig } from "../config/types.js";
33
import type { ImageGenerationProviderPlugin } from "../plugins/types.js";
4+
import { getImageGenerationProvider, listImageGenerationProviders } from "./provider-registry.js";
45

56
const resolvePluginCapabilityProvidersMock = vi.hoisted(() =>
67
vi.fn<() => ImageGenerationProviderPlugin[]>(() => []),
@@ -25,33 +26,21 @@ function createProvider(
2526
};
2627
}
2728

28-
type ImageProviderRegistry = typeof import("./provider-registry.js");
29-
30-
function requireImageProvider(
31-
registry: ImageProviderRegistry,
32-
id: string,
33-
): ImageGenerationProviderPlugin {
34-
const provider = registry.getImageGenerationProvider(id);
29+
function requireImageProvider(id: string): ImageGenerationProviderPlugin {
30+
const provider = getImageGenerationProvider(id);
3531
if (!provider) {
3632
throw new Error(`expected image generation provider ${id}`);
3733
}
3834
return provider;
3935
}
4036

41-
async function loadProviderRegistry(): Promise<ImageProviderRegistry> {
42-
vi.resetModules();
43-
return await import("./provider-registry.js");
44-
}
45-
4637
describe("image-generation provider registry", () => {
4738
beforeEach(() => {
48-
vi.resetModules();
4939
resolvePluginCapabilityProvidersMock.mockReset();
5040
resolvePluginCapabilityProvidersMock.mockReturnValue([]);
5141
});
5242

53-
it("delegates provider resolution to the capability provider boundary", async () => {
54-
const { listImageGenerationProviders } = await loadProviderRegistry();
43+
it("delegates provider resolution to the capability provider boundary", () => {
5544
const cfg = {} as OpenClawConfig;
5645

5746
expect(listImageGenerationProviders(cfg)).toStrictEqual([]);
@@ -61,9 +50,8 @@ describe("image-generation provider registry", () => {
6150
});
6251
});
6352

64-
it("uses active plugin providers without loading from disk", async () => {
53+
it("uses active plugin providers without loading from disk", () => {
6554
resolvePluginCapabilityProvidersMock.mockReturnValue([createProvider({ id: "custom-image" })]);
66-
const { getImageGenerationProvider } = await loadProviderRegistry();
6755

6856
const provider = getImageGenerationProvider("custom-image");
6957

@@ -74,17 +62,15 @@ describe("image-generation provider registry", () => {
7462
});
7563
});
7664

77-
it("ignores prototype-like provider ids and aliases", async () => {
65+
it("ignores prototype-like provider ids and aliases", () => {
7866
resolvePluginCapabilityProvidersMock.mockReturnValue([
7967
createProvider({ id: "__proto__", aliases: ["constructor", "prototype"] }),
8068
createProvider({ id: "safe-image", aliases: ["safe-alias", "constructor"] }),
8169
]);
82-
const registry = await loadProviderRegistry();
83-
const { getImageGenerationProvider, listImageGenerationProviders } = registry;
8470

8571
expect(listImageGenerationProviders().map((provider) => provider.id)).toEqual(["safe-image"]);
8672
expect(getImageGenerationProvider("__proto__")).toBeUndefined();
8773
expect(getImageGenerationProvider("constructor")).toBeUndefined();
88-
expect(requireImageProvider(registry, "safe-alias").id).toBe("safe-image");
74+
expect(requireImageProvider("safe-alias").id).toBe("safe-image");
8975
});
9076
});
Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { beforeEach, describe, expect, it, vi } from "vitest";
22
import type { VideoGenerationProviderPlugin } from "../plugins/types.js";
3+
import { getVideoGenerationProvider, listVideoGenerationProviders } from "./provider-registry.js";
34

45
const resolvePluginCapabilityProvidersMock = vi.hoisted(() =>
56
vi.fn<() => VideoGenerationProviderPlugin[]>(() => []),
@@ -21,44 +22,30 @@ function createProvider(
2122
};
2223
}
2324

24-
type VideoProviderRegistry = typeof import("./provider-registry.js");
25-
26-
function requireVideoProvider(
27-
registry: VideoProviderRegistry,
28-
id: string,
29-
): VideoGenerationProviderPlugin {
30-
const provider = registry.getVideoGenerationProvider(id);
25+
function requireVideoProvider(id: string): VideoGenerationProviderPlugin {
26+
const provider = getVideoGenerationProvider(id);
3127
if (!provider) {
3228
throw new Error(`expected video generation provider ${id}`);
3329
}
3430
return provider;
3531
}
3632

37-
async function loadProviderRegistry(): Promise<VideoProviderRegistry> {
38-
vi.resetModules();
39-
return await import("./provider-registry.js");
40-
}
41-
4233
describe("video-generation provider registry", () => {
4334
beforeEach(() => {
44-
vi.resetModules();
4535
resolvePluginCapabilityProvidersMock.mockReset();
4636
resolvePluginCapabilityProvidersMock.mockReturnValue([]);
4737
});
4838

49-
it("delegates provider resolution to the capability provider boundary", async () => {
50-
const { listVideoGenerationProviders } = await loadProviderRegistry();
51-
39+
it("delegates provider resolution to the capability provider boundary", () => {
5240
expect(listVideoGenerationProviders()).toStrictEqual([]);
5341
expect(resolvePluginCapabilityProvidersMock).toHaveBeenCalledWith({
5442
key: "videoGenerationProviders",
5543
cfg: undefined,
5644
});
5745
});
5846

59-
it("uses active plugin providers without loading from disk", async () => {
47+
it("uses active plugin providers without loading from disk", () => {
6048
resolvePluginCapabilityProvidersMock.mockReturnValue([createProvider({ id: "custom-video" })]);
61-
const { getVideoGenerationProvider } = await loadProviderRegistry();
6249

6350
const provider = getVideoGenerationProvider("custom-video");
6451

@@ -69,17 +56,15 @@ describe("video-generation provider registry", () => {
6956
});
7057
});
7158

72-
it("ignores prototype-like provider ids and aliases", async () => {
59+
it("ignores prototype-like provider ids and aliases", () => {
7360
resolvePluginCapabilityProvidersMock.mockReturnValue([
7461
createProvider({ id: "__proto__", aliases: ["constructor", "prototype"] }),
7562
createProvider({ id: "safe-video", aliases: ["safe-alias", "constructor"] }),
7663
]);
77-
const registry = await loadProviderRegistry();
78-
const { getVideoGenerationProvider, listVideoGenerationProviders } = registry;
7964

8065
expect(listVideoGenerationProviders().map((provider) => provider.id)).toEqual(["safe-video"]);
8166
expect(getVideoGenerationProvider("__proto__")).toBeUndefined();
8267
expect(getVideoGenerationProvider("constructor")).toBeUndefined();
83-
expect(requireVideoProvider(registry, "safe-alias").id).toBe("safe-video");
68+
expect(requireVideoProvider("safe-alias").id).toBe("safe-video");
8469
});
8570
});

0 commit comments

Comments
 (0)