embedding-provider.test.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * embedding-provider.test.ts - Tests for the EmbeddingProvider abstraction
  3. * (interface-level: model-id guard, ModelMismatchError).
  4. */
  5. import { describe, test, expect } from "vitest";
  6. import {
  7. ModelMismatchError,
  8. assertModelCompatible,
  9. } from "../src/embedding/provider.js";
  10. describe("assertModelCompatible", () => {
  11. test("empty existingModels → no throw (fresh DB)", () => {
  12. expect(() => assertModelCompatible("anything", [])).not.toThrow();
  13. });
  14. test("matching model id → no throw", () => {
  15. expect(() =>
  16. assertModelCompatible("embeddinggemma", ["embeddinggemma"]),
  17. ).not.toThrow();
  18. });
  19. test("matching one of several → no throw", () => {
  20. expect(() =>
  21. assertModelCompatible("embeddinggemma", ["embeddinggemma", "qwen3-embed"]),
  22. ).not.toThrow();
  23. });
  24. test("mismatch throws ModelMismatchError", () => {
  25. expect(() =>
  26. assertModelCompatible("openai-text-embedding", ["embeddinggemma"]),
  27. ).toThrow(ModelMismatchError);
  28. });
  29. test("error message lists existing models + provider model", () => {
  30. try {
  31. assertModelCompatible("provider-x", ["model-a", "model-b"]);
  32. throw new Error("should have thrown");
  33. } catch (err) {
  34. expect(err).toBeInstanceOf(ModelMismatchError);
  35. const e = err as ModelMismatchError;
  36. expect(e.providerModel).toBe("provider-x");
  37. expect(e.existingModels).toEqual(["model-a", "model-b"]);
  38. expect(e.message).toContain("provider-x");
  39. expect(e.message).toContain("model-a");
  40. expect(e.message).toContain("qmd embed -f");
  41. expect(e.message).toContain("QMD_EMBED_MODEL_ID");
  42. }
  43. });
  44. });
  45. describe("ModelMismatchError", () => {
  46. test("name set correctly", () => {
  47. const err = new ModelMismatchError("a", ["b"]);
  48. expect(err.name).toBe("ModelMismatchError");
  49. });
  50. test("instanceof Error", () => {
  51. const err = new ModelMismatchError("a", ["b"]);
  52. expect(err).toBeInstanceOf(Error);
  53. expect(err).toBeInstanceOf(ModelMismatchError);
  54. });
  55. });