Files
diegosouzapw--omniroute/tests/unit/memory-embedding-list-providers.test.ts
2026-07-13 13:39:12 +08:00

97 lines
4.1 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import { EMBEDDING_PROVIDERS } from "@omniroute/open-sse/config/embeddingRegistry.ts";
// This test validates the shape contract of listEmbeddingProviders
// and the EMBEDDING_PROVIDERS registry it aggregates from.
// getProviderCredentials is mocked at the module level via the Node.js
// register() mechanism, but here we test the structural guarantees.
describe("memory-embedding-list-providers: EMBEDDING_PROVIDERS shape", () => {
it("EMBEDDING_PROVIDERS contains at least one provider", () => {
const keys = Object.keys(EMBEDDING_PROVIDERS);
assert.ok(keys.length > 0, "Registry should have at least one provider");
});
it("each provider has id, baseUrl, authType, authHeader, models", () => {
for (const [id, config] of Object.entries(EMBEDDING_PROVIDERS)) {
assert.ok(config.id === id, `Provider id mismatch: ${config.id} !== ${id}`);
assert.ok(typeof config.baseUrl === "string" && config.baseUrl.length > 0, `${id}: missing baseUrl`);
assert.ok(typeof config.authType === "string", `${id}: missing authType`);
assert.ok(typeof config.authHeader === "string", `${id}: missing authHeader`);
assert.ok(Array.isArray(config.models), `${id}: models should be an array`);
}
});
it("each model has id and name fields", () => {
for (const [providerId, config] of Object.entries(EMBEDDING_PROVIDERS)) {
for (const model of config.models) {
assert.ok(typeof model.id === "string", `${providerId}/${model.id}: id should be a string`);
assert.ok(typeof model.name === "string", `${providerId}/${model.id}: name should be a string`);
}
}
});
it("dimensions when present is a positive number", () => {
for (const [providerId, config] of Object.entries(EMBEDDING_PROVIDERS)) {
for (const model of config.models) {
if (model.dimensions !== undefined) {
assert.ok(
typeof model.dimensions === "number" && model.dimensions > 0,
`${providerId}/${model.id}: dimensions should be positive number`
);
}
}
}
});
});
describe("memory-embedding-list-providers: listEmbeddingProviders contract", () => {
it("listEmbeddingProviders returns an array", async () => {
// We can't mock getProviderCredentials easily here,
// but we can verify the function exists and returns an array
// (it may throw if DB is not initialized, which is acceptable in unit test env)
const mod = await import("../../src/lib/memory/embedding/index");
assert.ok(typeof mod.listEmbeddingProviders === "function");
});
it("EmbeddingProviderListing shape: provider + hasKey + models array", () => {
// Validate the shape contract manually
const exampleListing = {
provider: "openai",
hasKey: true,
models: [
{ id: "openai/text-embedding-3-small", name: "Text Embedding 3 Small", dimensions: 1536 },
],
};
assert.strictEqual(typeof exampleListing.provider, "string");
assert.strictEqual(typeof exampleListing.hasKey, "boolean");
assert.ok(Array.isArray(exampleListing.models));
for (const m of exampleListing.models) {
// id must be in provider/model format
assert.ok(m.id.includes("/"), `model id should be in provider/model format: ${m.id}`);
assert.ok(typeof m.name === "string");
}
});
it("model ids in listEmbeddingProviders should be in provider/model format", () => {
// Verify the format we'll produce: ${providerId}/${model.id}
for (const [providerId, config] of Object.entries(EMBEDDING_PROVIDERS)) {
for (const model of config.models) {
const formattedId = `${providerId}/${model.id}`;
assert.ok(formattedId.includes("/"), `Format check: ${formattedId}`);
assert.ok(formattedId.startsWith(providerId + "/"), `Should start with providerId: ${formattedId}`);
}
}
});
it("hasKey is boolean for all providers", () => {
// This tests the contract, not the DB lookup
const hasKeyValues = [true, false];
for (const v of hasKeyValues) {
assert.strictEqual(typeof v, "boolean");
}
});
});