forked from EduCraft/curriculum-project-hub
129 lines
4.7 KiB
TypeScript
129 lines
4.7 KiB
TypeScript
import { createServer } from "node:http";
|
|
import { once } from "node:events";
|
|
import { afterEach, describe, expect, it } from "vitest";
|
|
import { ProviderReadinessError, probeOpenRouterCredential } from "../../src/connections/providerReadiness.js";
|
|
|
|
const servers: ReturnType<typeof createServer>[] = [];
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(servers.splice(0).map(async (server) => {
|
|
server.closeAllConnections();
|
|
if (server.listening) {
|
|
server.close();
|
|
await once(server, "close");
|
|
}
|
|
}));
|
|
});
|
|
|
|
describe("provider credential readiness", () => {
|
|
it("authenticates the OpenRouter key endpoint before activation", async () => {
|
|
const requests: Array<{ url: string | undefined; authorization: string | undefined }> = [];
|
|
const server = createServer((request, response) => {
|
|
requests.push({ url: request.url, authorization: request.headers.authorization });
|
|
response.writeHead(200, { "content-type": "application/json" });
|
|
response.end('{"data":{"label":"test"}}');
|
|
});
|
|
servers.push(server);
|
|
server.listen(0, "127.0.0.1");
|
|
await once(server, "listening");
|
|
const address = server.address();
|
|
if (address === null || typeof address === "string") throw new Error("expected TCP address");
|
|
|
|
await expect(probeOpenRouterCredential({
|
|
providerId: "openrouter",
|
|
baseUrl: `http://127.0.0.1:${address.port}/api`,
|
|
authToken: "readiness-secret",
|
|
anthropicApiKey: "",
|
|
})).resolves.toBeUndefined();
|
|
expect(requests).toEqual([{
|
|
url: "/api/v1/key",
|
|
authorization: "Bearer readiness-secret",
|
|
}]);
|
|
});
|
|
|
|
it("fails closed on rejected credentials without exposing them in the error", async () => {
|
|
const server = createServer((_request, response) => {
|
|
response.writeHead(401, { "content-type": "application/json" });
|
|
response.end('{"error":"token rejected"}');
|
|
});
|
|
servers.push(server);
|
|
server.listen(0, "127.0.0.1");
|
|
await once(server, "listening");
|
|
const address = server.address();
|
|
if (address === null || typeof address === "string") throw new Error("expected TCP address");
|
|
|
|
let message = "";
|
|
try {
|
|
await probeOpenRouterCredential({
|
|
providerId: "openrouter",
|
|
baseUrl: `http://127.0.0.1:${address.port}`,
|
|
authToken: "never-return-readiness-secret",
|
|
anthropicApiKey: "",
|
|
});
|
|
} catch (error) {
|
|
message = error instanceof Error ? error.message : String(error);
|
|
}
|
|
expect(message).toBe("provider credential readiness check failed: status 401");
|
|
expect(message).not.toContain("never-return-readiness-secret");
|
|
});
|
|
|
|
it("does not follow redirects with the provider credential", async () => {
|
|
let redirected = 0;
|
|
const target = createServer((_request, response) => {
|
|
redirected += 1;
|
|
response.end("leaked");
|
|
});
|
|
servers.push(target);
|
|
target.listen(0, "127.0.0.1");
|
|
await once(target, "listening");
|
|
const targetAddress = target.address();
|
|
if (targetAddress === null || typeof targetAddress === "string") throw new Error("expected target address");
|
|
const provider = createServer((_request, response) => {
|
|
response.writeHead(307, { location: `http://127.0.0.1:${targetAddress.port}/capture` });
|
|
response.end();
|
|
});
|
|
servers.push(provider);
|
|
provider.listen(0, "127.0.0.1");
|
|
await once(provider, "listening");
|
|
const providerAddress = provider.address();
|
|
if (providerAddress === null || typeof providerAddress === "string") throw new Error("expected provider address");
|
|
|
|
await expect(probeOpenRouterCredential({
|
|
providerId: "openrouter",
|
|
baseUrl: `http://127.0.0.1:${providerAddress.port}`,
|
|
authToken: "redirect-secret",
|
|
anthropicApiKey: "",
|
|
})).rejects.toThrow("status 307");
|
|
expect(redirected).toBe(0);
|
|
});
|
|
|
|
it("preserves a redacted network category for observability", async () => {
|
|
const server = createServer();
|
|
server.listen(0, "127.0.0.1");
|
|
await once(server, "listening");
|
|
const address = server.address();
|
|
if (address === null || typeof address === "string") throw new Error("expected provider address");
|
|
server.close();
|
|
await once(server, "close");
|
|
|
|
let failure: unknown;
|
|
try {
|
|
await probeOpenRouterCredential({
|
|
providerId: "openrouter",
|
|
baseUrl: `http://127.0.0.1:${address.port}`,
|
|
authToken: "network-secret",
|
|
anthropicApiKey: "",
|
|
});
|
|
} catch (error) {
|
|
failure = error;
|
|
}
|
|
expect(failure).toBeInstanceOf(ProviderReadinessError);
|
|
expect(failure).toMatchObject({
|
|
code: "provider_readiness_unreachable",
|
|
category: "connection",
|
|
message: "provider credential readiness check could not reach provider",
|
|
});
|
|
expect(JSON.stringify(failure)).not.toContain("network-secret");
|
|
});
|
|
});
|