Skip to content

Commit 0117df1

Browse files
committed
Share unified settings controller deps
(cherry picked from commit 1110df6)
1 parent 2aefb3d commit 0117df1

File tree

3 files changed

+98
-165
lines changed

3 files changed

+98
-165
lines changed

lib/codex-manager/unified-settings-controller.ts

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -10,54 +10,56 @@ export type SettingsHubActionType =
1010
| "backend"
1111
| "back";
1212

13+
export type UnifiedSettingsControllerDeps = {
14+
cloneDashboardSettings: (
15+
settings: DashboardDisplaySettings,
16+
) => DashboardDisplaySettings;
17+
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
18+
loadDashboardDisplaySettings: () => Promise<DashboardDisplaySettings>;
19+
loadPluginConfig: () => PluginConfig;
20+
applyUiThemeFromDashboardSettings: (
21+
settings: DashboardDisplaySettings,
22+
) => void;
23+
promptSettingsHub: (
24+
focus: SettingsHubActionType,
25+
) => Promise<{ type: SettingsHubActionType } | null>;
26+
configureDashboardDisplaySettings: (
27+
current: DashboardDisplaySettings,
28+
) => Promise<DashboardDisplaySettings>;
29+
configureStatuslineSettings: (
30+
current: DashboardDisplaySettings,
31+
) => Promise<DashboardDisplaySettings>;
32+
promptBehaviorSettings: (
33+
current: DashboardDisplaySettings,
34+
) => Promise<DashboardDisplaySettings | null>;
35+
promptThemeSettings: (
36+
current: DashboardDisplaySettings,
37+
) => Promise<DashboardDisplaySettings | null>;
38+
dashboardSettingsEqual: (
39+
left: DashboardDisplaySettings,
40+
right: DashboardDisplaySettings,
41+
) => boolean;
42+
persistDashboardSettingsSelection: (
43+
selected: DashboardDisplaySettings,
44+
keys: readonly (keyof DashboardDisplaySettings)[],
45+
scope: string,
46+
) => Promise<DashboardDisplaySettings>;
47+
promptExperimentalSettings: (
48+
config: PluginConfig,
49+
) => Promise<PluginConfig | null>;
50+
backendSettingsEqual: (left: PluginConfig, right: PluginConfig) => boolean;
51+
persistBackendConfigSelection: (
52+
config: PluginConfig,
53+
scope: string,
54+
) => Promise<PluginConfig>;
55+
configureBackendSettings: (config: PluginConfig) => Promise<PluginConfig>;
56+
BEHAVIOR_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
57+
THEME_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
58+
};
59+
1360
export async function configureUnifiedSettingsController(
1461
initialSettings: DashboardDisplaySettings | undefined,
15-
deps: {
16-
cloneDashboardSettings: (
17-
settings: DashboardDisplaySettings,
18-
) => DashboardDisplaySettings;
19-
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
20-
loadDashboardDisplaySettings: () => Promise<DashboardDisplaySettings>;
21-
loadPluginConfig: () => PluginConfig;
22-
applyUiThemeFromDashboardSettings: (
23-
settings: DashboardDisplaySettings,
24-
) => void;
25-
promptSettingsHub: (
26-
focus: SettingsHubActionType,
27-
) => Promise<{ type: SettingsHubActionType } | null>;
28-
configureDashboardDisplaySettings: (
29-
current: DashboardDisplaySettings,
30-
) => Promise<DashboardDisplaySettings>;
31-
configureStatuslineSettings: (
32-
current: DashboardDisplaySettings,
33-
) => Promise<DashboardDisplaySettings>;
34-
promptBehaviorSettings: (
35-
current: DashboardDisplaySettings,
36-
) => Promise<DashboardDisplaySettings | null>;
37-
promptThemeSettings: (
38-
current: DashboardDisplaySettings,
39-
) => Promise<DashboardDisplaySettings | null>;
40-
dashboardSettingsEqual: (
41-
left: DashboardDisplaySettings,
42-
right: DashboardDisplaySettings,
43-
) => boolean;
44-
persistDashboardSettingsSelection: (
45-
selected: DashboardDisplaySettings,
46-
keys: readonly (keyof DashboardDisplaySettings)[],
47-
scope: string,
48-
) => Promise<DashboardDisplaySettings>;
49-
promptExperimentalSettings: (
50-
config: PluginConfig,
51-
) => Promise<PluginConfig | null>;
52-
backendSettingsEqual: (left: PluginConfig, right: PluginConfig) => boolean;
53-
persistBackendConfigSelection: (
54-
config: PluginConfig,
55-
scope: string,
56-
) => Promise<PluginConfig>;
57-
configureBackendSettings: (config: PluginConfig) => Promise<PluginConfig>;
58-
BEHAVIOR_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
59-
THEME_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
60-
},
62+
deps: UnifiedSettingsControllerDeps,
6163
): Promise<DashboardDisplaySettings> {
6264
let current = deps.cloneDashboardSettings(
6365
initialSettings ?? (await deps.loadDashboardDisplaySettings()),

lib/codex-manager/unified-settings-entry.ts

Lines changed: 5 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,16 @@
11
import type { DashboardDisplaySettings } from "../dashboard-settings.js";
2-
import type { PluginConfig } from "../types.js";
3-
import type { SettingsHubActionType } from "./unified-settings-controller.js";
2+
import type {
3+
UnifiedSettingsControllerDeps,
4+
} from "./unified-settings-controller.js";
45

56
export async function configureUnifiedSettingsEntry(
67
initialSettings: DashboardDisplaySettings | undefined,
78
deps: {
89
configureUnifiedSettingsController: (
910
initialSettings: DashboardDisplaySettings | undefined,
10-
deps: {
11-
cloneDashboardSettings: (
12-
settings: DashboardDisplaySettings,
13-
) => DashboardDisplaySettings;
14-
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
15-
loadDashboardDisplaySettings: () => Promise<DashboardDisplaySettings>;
16-
loadPluginConfig: () => PluginConfig;
17-
applyUiThemeFromDashboardSettings: (
18-
settings: DashboardDisplaySettings,
19-
) => void;
20-
promptSettingsHub: (
21-
focus: SettingsHubActionType,
22-
) => Promise<{ type: SettingsHubActionType } | null>;
23-
configureDashboardDisplaySettings: (
24-
current: DashboardDisplaySettings,
25-
) => Promise<DashboardDisplaySettings>;
26-
configureStatuslineSettings: (
27-
current: DashboardDisplaySettings,
28-
) => Promise<DashboardDisplaySettings>;
29-
promptBehaviorSettings: (
30-
current: DashboardDisplaySettings,
31-
) => Promise<DashboardDisplaySettings | null>;
32-
promptThemeSettings: (
33-
current: DashboardDisplaySettings,
34-
) => Promise<DashboardDisplaySettings | null>;
35-
dashboardSettingsEqual: (
36-
left: DashboardDisplaySettings,
37-
right: DashboardDisplaySettings,
38-
) => boolean;
39-
persistDashboardSettingsSelection: (
40-
selected: DashboardDisplaySettings,
41-
keys: readonly (keyof DashboardDisplaySettings)[],
42-
scope: string,
43-
) => Promise<DashboardDisplaySettings>;
44-
promptExperimentalSettings: (
45-
config: PluginConfig,
46-
) => Promise<PluginConfig | null>;
47-
backendSettingsEqual: (
48-
left: PluginConfig,
49-
right: PluginConfig,
50-
) => boolean;
51-
persistBackendConfigSelection: (
52-
config: PluginConfig,
53-
scope: string,
54-
) => Promise<PluginConfig>;
55-
configureBackendSettings: (
56-
config: PluginConfig,
57-
) => Promise<PluginConfig>;
58-
BEHAVIOR_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
59-
THEME_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
60-
},
11+
deps: UnifiedSettingsControllerDeps,
6112
) => Promise<DashboardDisplaySettings>;
62-
cloneDashboardSettings: (
63-
settings: DashboardDisplaySettings,
64-
) => DashboardDisplaySettings;
65-
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
66-
loadDashboardDisplaySettings: () => Promise<DashboardDisplaySettings>;
67-
loadPluginConfig: () => PluginConfig;
68-
applyUiThemeFromDashboardSettings: (
69-
settings: DashboardDisplaySettings,
70-
) => void;
71-
promptSettingsHub: (
72-
focus: SettingsHubActionType,
73-
) => Promise<{ type: SettingsHubActionType } | null>;
74-
configureDashboardDisplaySettings: (
75-
current: DashboardDisplaySettings,
76-
) => Promise<DashboardDisplaySettings>;
77-
configureStatuslineSettings: (
78-
current: DashboardDisplaySettings,
79-
) => Promise<DashboardDisplaySettings>;
80-
promptBehaviorSettings: (
81-
current: DashboardDisplaySettings,
82-
) => Promise<DashboardDisplaySettings | null>;
83-
promptThemeSettings: (
84-
current: DashboardDisplaySettings,
85-
) => Promise<DashboardDisplaySettings | null>;
86-
dashboardSettingsEqual: (
87-
left: DashboardDisplaySettings,
88-
right: DashboardDisplaySettings,
89-
) => boolean;
90-
persistDashboardSettingsSelection: (
91-
selected: DashboardDisplaySettings,
92-
keys: readonly (keyof DashboardDisplaySettings)[],
93-
scope: string,
94-
) => Promise<DashboardDisplaySettings>;
95-
promptExperimentalSettings: (
96-
config: PluginConfig,
97-
) => Promise<PluginConfig | null>;
98-
backendSettingsEqual: (left: PluginConfig, right: PluginConfig) => boolean;
99-
persistBackendConfigSelection: (
100-
config: PluginConfig,
101-
scope: string,
102-
) => Promise<PluginConfig>;
103-
configureBackendSettings: (config: PluginConfig) => Promise<PluginConfig>;
104-
BEHAVIOR_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
105-
THEME_PANEL_KEYS: readonly (keyof DashboardDisplaySettings)[];
106-
},
13+
} & UnifiedSettingsControllerDeps,
10714
): Promise<DashboardDisplaySettings> {
10815
return deps.configureUnifiedSettingsController(initialSettings, {
10916
cloneDashboardSettings: deps.cloneDashboardSettings,
Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,61 @@
11
import { describe, expect, it, vi } from "vitest";
22
import { configureUnifiedSettingsEntry } from "../lib/codex-manager/unified-settings-entry.js";
33

4+
function createControllerDeps() {
5+
return {
6+
cloneDashboardSettings: vi.fn((settings) => settings),
7+
cloneBackendPluginConfig: vi.fn((config) => config),
8+
loadDashboardDisplaySettings: vi.fn(async () => ({
9+
menuShowStatusBadge: false,
10+
})),
11+
loadPluginConfig: vi.fn(() => ({ fetchTimeoutMs: 1000 })),
12+
applyUiThemeFromDashboardSettings: vi.fn(),
13+
promptSettingsHub: vi.fn(),
14+
configureDashboardDisplaySettings: vi.fn(),
15+
configureStatuslineSettings: vi.fn(),
16+
promptBehaviorSettings: vi.fn(),
17+
promptThemeSettings: vi.fn(),
18+
dashboardSettingsEqual: vi.fn(),
19+
persistDashboardSettingsSelection: vi.fn(),
20+
promptExperimentalSettings: vi.fn(),
21+
backendSettingsEqual: vi.fn(),
22+
persistBackendConfigSelection: vi.fn(),
23+
configureBackendSettings: vi.fn(),
24+
BEHAVIOR_PANEL_KEYS: [],
25+
THEME_PANEL_KEYS: [],
26+
};
27+
}
28+
429
describe("unified settings entry", () => {
530
it("delegates to the unified settings controller with provided deps", async () => {
631
const configureUnifiedSettingsController = vi.fn(async () => ({
732
menuShowStatusBadge: true,
833
}));
34+
const controllerDeps = createControllerDeps();
935

1036
const result = await configureUnifiedSettingsEntry(undefined, {
1137
configureUnifiedSettingsController,
12-
cloneDashboardSettings: vi.fn((settings) => settings),
13-
cloneBackendPluginConfig: vi.fn((config) => config),
14-
loadDashboardDisplaySettings: vi.fn(async () => ({
15-
menuShowStatusBadge: false,
16-
})),
17-
loadPluginConfig: vi.fn(() => ({ fetchTimeoutMs: 1000 })),
18-
applyUiThemeFromDashboardSettings: vi.fn(),
19-
promptSettingsHub: vi.fn(),
20-
configureDashboardDisplaySettings: vi.fn(),
21-
configureStatuslineSettings: vi.fn(),
22-
promptBehaviorSettings: vi.fn(),
23-
promptThemeSettings: vi.fn(),
24-
dashboardSettingsEqual: vi.fn(),
25-
persistDashboardSettingsSelection: vi.fn(),
26-
promptExperimentalSettings: vi.fn(),
27-
backendSettingsEqual: vi.fn(),
28-
persistBackendConfigSelection: vi.fn(),
29-
configureBackendSettings: vi.fn(),
30-
BEHAVIOR_PANEL_KEYS: [],
31-
THEME_PANEL_KEYS: [],
38+
...controllerDeps,
3239
});
3340

34-
expect(configureUnifiedSettingsController).toHaveBeenCalled();
41+
expect(configureUnifiedSettingsController).toHaveBeenCalledWith(
42+
undefined,
43+
controllerDeps,
44+
);
3545
expect(result).toEqual({ menuShowStatusBadge: true });
3646
});
47+
48+
it("propagates rejection from the controller", async () => {
49+
const expectedError = new Error("controller failure");
50+
const configureUnifiedSettingsController = vi.fn(async () => {
51+
throw expectedError;
52+
});
53+
54+
await expect(
55+
configureUnifiedSettingsEntry(undefined, {
56+
configureUnifiedSettingsController,
57+
...createControllerDeps(),
58+
}),
59+
).rejects.toThrow(expectedError);
60+
});
3761
});

0 commit comments

Comments
 (0)