@@ -138,6 +138,42 @@ describe("onboard-search provider resolution", () => {
|
138 | 138 | ).toBe("next-key"); |
139 | 139 | }); |
140 | 140 | |
| 141 | +it("uses provider-owned legacy search config readers generically", async () => { |
| 142 | +const legacyEntry: PluginWebSearchProviderEntry = { |
| 143 | + ...createCustomProviderEntry(), |
| 144 | +id: "legacy-search" as never, |
| 145 | +pluginId: "legacy-search-plugin", |
| 146 | +credentialPath: "plugins.entries.legacy-search-plugin.config.webSearch.apiKey", |
| 147 | +getCredentialValue: (searchConfig) => |
| 148 | +(searchConfig?.legacySearch && |
| 149 | +typeof searchConfig.legacySearch === "object" && |
| 150 | +!Array.isArray(searchConfig.legacySearch) |
| 151 | + ? (searchConfig.legacySearch as Record<string, unknown>) |
| 152 | + : undefined |
| 153 | +)?.apiKey, |
| 154 | +getConfiguredCredentialValue: () => undefined, |
| 155 | +}; |
| 156 | +mocks.resolvePluginWebSearchProviders.mockImplementation((params) => |
| 157 | +params?.config ? [legacyEntry] : [], |
| 158 | +); |
| 159 | + |
| 160 | +const cfg: OpenClawConfig = { |
| 161 | +tools: { |
| 162 | +web: { |
| 163 | +search: { |
| 164 | +provider: "legacy-search" as never, |
| 165 | +legacySearch: { |
| 166 | +apiKey: "legacy-key", |
| 167 | +}, |
| 168 | +} as never, |
| 169 | +}, |
| 170 | +}, |
| 171 | +}; |
| 172 | + |
| 173 | +expect(mod.hasExistingKey(cfg, "legacy-search" as never)).toBe(true); |
| 174 | +expect(mod.resolveExistingKey(cfg, "legacy-search" as never)).toBe("legacy-key"); |
| 175 | +}); |
| 176 | + |
141 | 177 | it("uses config-aware non-bundled providers when building secret refs", async () => { |
142 | 178 | const customEntry = createCustomProviderEntry(); |
143 | 179 | mocks.resolvePluginWebSearchProviders.mockImplementation((params) => |
|