1import {
2 DEFAULT_SERVER_SETTINGS,
3 ProjectId,
4 ProviderDriverKind,
5 ProviderInstanceId,
6 type ServerSettings,
7} from "@t3tools/contracts";
8import { describe, expect, it } from "vite-plus/test";
9
10import { deriveProviderInstanceConfigMap } from "./ProviderInstanceRegistryHydration.ts";
11
12const projectId = ProjectId.make("project-a");
13const instanceId = ProviderInstanceId.make("codex_work");
14
15function settingsWith(overrides: Partial<ServerSettings>): ServerSettings {
16 return { ...DEFAULT_SERVER_SETTINGS, ...overrides };
17}
18
19describe("deriveProviderInstanceConfigMap", () => {
20 it("turns a machine-disabled instance on when a project enables it", () => {
21 const settings = settingsWith({
22 providerInstances: {
23 [instanceId]: { driver: ProviderDriverKind.make("codex"), enabled: false },
24 },
25 projectSettingsOverrides: {
26 [projectId]: { providerInstances: { [instanceId]: { enabled: true } } },
27 },
28 });
29
30 const merged = deriveProviderInstanceConfigMap(settings);
31
32 expect(merged[instanceId]).toEqual({ driver: ProviderDriverKind.make("codex"), enabled: true });
33 });
34
35 it("clears a nested config.enabled:false flag when a project enables the instance", () => {
36 const settings = settingsWith({
37 providerInstances: {
38 [instanceId]: {
39 driver: ProviderDriverKind.make("codex"),
40 config: { enabled: false },
41 },
42 },
43 projectSettingsOverrides: {
44 [projectId]: { providerInstances: { [instanceId]: { enabled: true } } },
45 },
46 });
47
48 const merged = deriveProviderInstanceConfigMap(settings);
49
50 expect(merged[instanceId]).toEqual({
51 driver: ProviderDriverKind.make("codex"),
52 enabled: true,
53 config: { enabled: true },
54 });
55 });
56
57 it("leaves an already machine-enabled instance untouched", () => {
58 const settings = settingsWith({
59 providerInstances: {
60 [instanceId]: { driver: ProviderDriverKind.make("codex"), enabled: true },
61 },
62 projectSettingsOverrides: {
63 [projectId]: { providerInstances: { [instanceId]: { enabled: true } } },
64 },
65 });
66
67 const merged = deriveProviderInstanceConfigMap(settings);
68
69 expect(merged[instanceId]).toBe(settings.providerInstances[instanceId]);
70 });
71
72 it("does not revive an instance a project override references but settings no longer configure", () => {
73 const settings = settingsWith({
74 providerInstances: {},
75 projectSettingsOverrides: {
76 [projectId]: { providerInstances: { [instanceId]: { enabled: true } } },
77 },
78 });
79
80 const merged = deriveProviderInstanceConfigMap(settings);
81
82 expect(merged[instanceId]).toBeUndefined();
83 });
84
85 it("ignores a project override that disables an instance, leaving the machine's config in charge", () => {
86 const settings = settingsWith({
87 providerInstances: {
88 [instanceId]: { driver: ProviderDriverKind.make("codex"), enabled: true },
89 },
90 projectSettingsOverrides: {
91 [projectId]: { providerInstances: { [instanceId]: { enabled: false } } },
92 },
93 });
94
95 const merged = deriveProviderInstanceConfigMap(settings);
96
97 expect(merged[instanceId]).toBe(settings.providerInstances[instanceId]);
98 });
99
100 it("folds overrides from multiple projects", () => {
101 const otherInstanceId = ProviderInstanceId.make("claudeAgent_personal");
102 const otherProjectId = ProjectId.make("project-b");
103 const settings = settingsWith({
104 providerInstances: {
105 [instanceId]: { driver: ProviderDriverKind.make("codex"), enabled: false },
106 [otherInstanceId]: { driver: ProviderDriverKind.make("claudeAgent"), enabled: false },
107 },
108 projectSettingsOverrides: {
109 [projectId]: { providerInstances: { [instanceId]: { enabled: true } } },
110 [otherProjectId]: { providerInstances: { [otherInstanceId]: { enabled: true } } },
111 },
112 });
113
114 const merged = deriveProviderInstanceConfigMap(settings);
115
116 expect(merged[instanceId]).toEqual({ driver: ProviderDriverKind.make("codex"), enabled: true });
117 expect(merged[otherInstanceId]).toEqual({
118 driver: ProviderDriverKind.make("claudeAgent"),
119 enabled: true,
120 });
121 });
122});