chore: Fix types in tests 6/N.

This commit is contained in:
cpojer
2026-02-17 10:52:25 +09:00
parent b6d4f7c00e
commit 003d6c45d6
6 changed files with 180 additions and 116 deletions

View File

@@ -19,11 +19,18 @@ vi.mock("./node-llama.js", () => ({
}));
const createFetchMock = () =>
vi.fn(async () => ({
vi.fn(async (_input?: unknown, _init?: unknown) => ({
ok: true,
status: 200,
json: async () => ({ data: [{ embedding: [1, 2, 3] }] }),
})) as unknown as typeof fetch;
}));
function requireProvider(result: Awaited<ReturnType<typeof createEmbeddingProvider>>) {
if (!result.provider) {
throw new Error("Expected embedding provider");
}
return result.provider;
}
describe("embedding provider remote overrides", () => {
afterEach(() => {
@@ -69,10 +76,12 @@ describe("embedding provider remote overrides", () => {
fallback: "openai",
});
await result.provider.embedQuery("hello");
const provider = requireProvider(result);
await provider.embedQuery("hello");
expect(authModule.resolveApiKeyForProvider).not.toHaveBeenCalled();
const [url, init] = fetchMock.mock.calls[0] ?? [];
const url = fetchMock.mock.calls[0]?.[0];
const init = fetchMock.mock.calls[0]?.[1] as RequestInit | undefined;
expect(url).toBe("https://remote.example/v1/embeddings");
const headers = (init?.headers ?? {}) as Record<string, string>;
expect(headers.Authorization).toBe("Bearer remote-key");
@@ -112,19 +121,21 @@ describe("embedding provider remote overrides", () => {
fallback: "openai",
});
await result.provider.embedQuery("hello");
const provider = requireProvider(result);
await provider.embedQuery("hello");
expect(authModule.resolveApiKeyForProvider).toHaveBeenCalledTimes(1);
const headers = (fetchMock.mock.calls[0]?.[1]?.headers as Record<string, string>) ?? {};
const init = fetchMock.mock.calls[0]?.[1] as RequestInit | undefined;
const headers = (init?.headers as Record<string, string>) ?? {};
expect(headers.Authorization).toBe("Bearer provider-key");
});
it("builds Gemini embeddings requests with api key header", async () => {
const fetchMock = vi.fn(async () => ({
const fetchMock = vi.fn(async (_input?: unknown, _init?: unknown) => ({
ok: true,
status: 200,
json: async () => ({ embedding: { values: [1, 2, 3] } }),
})) as unknown as typeof fetch;
}));
vi.stubGlobal("fetch", fetchMock);
vi.mocked(authModule.resolveApiKeyForProvider).mockResolvedValue({
apiKey: "provider-key",
@@ -152,9 +163,11 @@ describe("embedding provider remote overrides", () => {
fallback: "openai",
});
await result.provider.embedQuery("hello");
const provider = requireProvider(result);
await provider.embedQuery("hello");
const [url, init] = fetchMock.mock.calls[0] ?? [];
const url = fetchMock.mock.calls[0]?.[0];
const init = fetchMock.mock.calls[0]?.[1] as RequestInit | undefined;
expect(url).toBe(
"https://generativelanguage.googleapis.com/v1beta/models/text-embedding-004:embedContent",
);
@@ -186,15 +199,16 @@ describe("embedding provider auto selection", () => {
});
expect(result.requestedProvider).toBe("auto");
expect(result.provider.id).toBe("openai");
const provider = requireProvider(result);
expect(provider.id).toBe("openai");
});
it("uses gemini when openai is missing", async () => {
const fetchMock = vi.fn(async () => ({
const fetchMock = vi.fn(async (_input?: unknown, _init?: unknown) => ({
ok: true,
status: 200,
json: async () => ({ embedding: { values: [1, 2, 3] } }),
})) as unknown as typeof fetch;
}));
vi.stubGlobal("fetch", fetchMock);
vi.mocked(authModule.resolveApiKeyForProvider).mockImplementation(async ({ provider }) => {
if (provider === "openai") {
@@ -214,8 +228,9 @@ describe("embedding provider auto selection", () => {
});
expect(result.requestedProvider).toBe("auto");
expect(result.provider.id).toBe("gemini");
await result.provider.embedQuery("hello");
const provider = requireProvider(result);
expect(provider.id).toBe("gemini");
await provider.embedQuery("hello");
const [url] = fetchMock.mock.calls[0] ?? [];
expect(url).toBe(
`https://generativelanguage.googleapis.com/v1beta/models/${DEFAULT_GEMINI_EMBEDDING_MODEL}:embedContent`,
@@ -223,11 +238,11 @@ describe("embedding provider auto selection", () => {
});
it("keeps explicit model when openai is selected", async () => {
const fetchMock = vi.fn(async () => ({
const fetchMock = vi.fn(async (_input?: unknown, _init?: unknown) => ({
ok: true,
status: 200,
json: async () => ({ data: [{ embedding: [1, 2, 3] }] }),
})) as unknown as typeof fetch;
}));
vi.stubGlobal("fetch", fetchMock);
vi.mocked(authModule.resolveApiKeyForProvider).mockImplementation(async ({ provider }) => {
if (provider === "openai") {
@@ -244,11 +259,13 @@ describe("embedding provider auto selection", () => {
});
expect(result.requestedProvider).toBe("auto");
expect(result.provider.id).toBe("openai");
await result.provider.embedQuery("hello");
const [url, init] = fetchMock.mock.calls[0] ?? [];
const provider = requireProvider(result);
expect(provider.id).toBe("openai");
await provider.embedQuery("hello");
const url = fetchMock.mock.calls[0]?.[0];
const init = fetchMock.mock.calls[0]?.[1] as RequestInit | undefined;
expect(url).toBe("https://api.openai.com/v1/embeddings");
const payload = JSON.parse(String(init?.body ?? "{}")) as { model?: string };
const payload = JSON.parse(init?.body as string) as { model?: string };
expect(payload.model).toBe("text-embedding-3-small");
});
});
@@ -282,7 +299,8 @@ describe("embedding provider local fallback", () => {
fallback: "openai",
});
expect(result.provider.id).toBe("openai");
const provider = requireProvider(result);
expect(provider.id).toBe("openai");
expect(result.fallbackFrom).toBe("local");
expect(result.fallbackReason).toContain("node-llama-cpp");
});
@@ -365,7 +383,8 @@ describe("local embedding normalization", () => {
const result = await createLocalProviderForTest();
const embedding = await result.provider.embedQuery("test query");
const provider = requireProvider(result);
const embedding = await provider.embedQuery("test query");
const magnitude = Math.sqrt(embedding.reduce((sum, x) => sum + x * x, 0));
@@ -380,7 +399,8 @@ describe("local embedding normalization", () => {
const result = await createLocalProviderForTest();
const embedding = await result.provider.embedQuery("test");
const provider = requireProvider(result);
const embedding = await provider.embedQuery("test");
expect(embedding).toEqual([0, 0, 0, 0]);
expect(embedding.every((value) => Number.isFinite(value))).toBe(true);
@@ -393,7 +413,8 @@ describe("local embedding normalization", () => {
const result = await createLocalProviderForTest();
const embedding = await result.provider.embedQuery("test");
const provider = requireProvider(result);
const embedding = await provider.embedQuery("test");
expect(embedding).toEqual([1, 0, 0, 0]);
expect(embedding.every((value) => Number.isFinite(value))).toBe(true);
@@ -424,7 +445,8 @@ describe("local embedding normalization", () => {
const result = await createLocalProviderForTest();
const embeddings = await result.provider.embedBatch(["text1", "text2", "text3"]);
const provider = requireProvider(result);
const embeddings = await provider.embedBatch(["text1", "text2", "text3"]);
for (const embedding of embeddings) {
const magnitude = Math.sqrt(embedding.reduce((sum, x) => sum + x * x, 0));