ktx/packages/cli/test/llm/embedding-health.test.ts
Andrey Avtomonov 00cdf2de90
refactor: enforce ktx naming and AGENTS.md compliance sweep (#289)
Align the tree with AGENTS.md/CLAUDE.md conventions:

- Rewrite user-facing strings, docs, and tests to lowercase `ktx`
  (no bare uppercase `KTX` tokens remain outside literal identifiers).
- Drop the legacy `historicSql` migration path and its now-unused
  helpers, per the no-backward-compat rule.
- Remove `as unknown as` / `any` casts: narrow `BaseTool` generics to
  `z.ZodObject`, add a typed `createLookerClient`, and delete the dead
  `getParametersSchema`/`toAnthropicFormat` pre-AI-SDK helpers.
- Use `InvalidArgumentError` for Commander parse failures.
- Finish the adapter→connector prose conversion in the `ktx.yaml` docs
  while keeping the literal `adapters` config key.
2026-06-11 13:49:45 +02:00

106 lines
3.1 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import { runKtxEmbeddingHealthCheck } from '../../src/llm/embedding-health.js';
describe('ktx embedding health check', () => {
it('runs a one-shot OpenAI embedding check through the configured provider', async () => {
const createOpenAIClient = vi.fn(() => ({
embeddings: {
create: vi.fn().mockResolvedValue({
data: [{ index: 0, embedding: [0.1, 0.2, 0.3] }],
}),
},
}));
await expect(
runKtxEmbeddingHealthCheck(
{
backend: 'openai',
model: 'text-embedding-3-small',
dimensions: 3,
openai: { apiKey: 'sk-openai-test' }, // pragma: allowlist secret
},
{ deps: { createOpenAIClient } },
),
).resolves.toEqual({ ok: true });
expect(createOpenAIClient).toHaveBeenCalledWith({ apiKey: 'sk-openai-test', baseURL: undefined }); // pragma: allowlist secret
});
it('returns failed when the provider returns the wrong dimensions', async () => {
const createOpenAIClient = vi.fn(() => ({
embeddings: {
create: vi.fn().mockResolvedValue({
data: [{ index: 0, embedding: [0.1, 0.2] }],
}),
},
}));
await expect(
runKtxEmbeddingHealthCheck(
{
backend: 'openai',
model: 'text-embedding-3-small',
dimensions: 3,
openai: { apiKey: 'sk-openai-test' }, // pragma: allowlist secret
},
{ deps: { createOpenAIClient } },
),
).resolves.toEqual({
ok: false,
message: 'Embedding provider openai returned vector with 2 dimensions; expected 3',
});
});
it('redacts credential values from health-check failures', async () => {
const createOpenAIClient = vi.fn(() => ({
embeddings: {
create: vi.fn(async () => {
throw new Error('401 invalid api key sk-openai-secret');
}),
},
}));
await expect(
runKtxEmbeddingHealthCheck(
{
backend: 'openai',
model: 'text-embedding-3-small',
dimensions: 3,
openai: { apiKey: 'sk-openai-secret' }, // pragma: allowlist secret
},
{ deps: { createOpenAIClient } },
),
).resolves.toEqual({
ok: false,
message: '401 invalid api key [redacted]',
});
});
it('returns failed when the health check times out', async () => {
const createOpenAIClient = vi.fn(() => ({
embeddings: {
create: vi.fn(
() =>
new Promise<{ data: Array<{ index?: number; embedding: number[] }>; usage?: { total_tokens?: number } }>(
() => undefined,
),
),
},
}));
await expect(
runKtxEmbeddingHealthCheck(
{
backend: 'openai',
model: 'text-embedding-3-small',
dimensions: 3,
openai: { apiKey: 'sk-openai-test' }, // pragma: allowlist secret
},
{ timeoutMs: 1, deps: { createOpenAIClient } },
),
).resolves.toEqual({
ok: false,
message: 'Embedding health check timed out after 1ms',
});
});
});