model-preference.test.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { expect, test } from "bun:test"
  2. import path from "node:path"
  3. import { createModelPreferenceRepository, decodeModelPreference } from "../src/model-preference"
  4. import { tmpdir } from "./fixture/fixture"
  5. test("repairs known model preferences and preserves unrelated fields", () => {
  6. expect(
  7. decodeModelPreference({
  8. unrelated: { keep: true },
  9. recent: [{ providerID: "openai", modelID: "gpt-5", ignored: true }, null],
  10. favorite: "malformed",
  11. variant: { "openai/gpt-5": "high", default: "default", invalid: 42 },
  12. }),
  13. ).toEqual({
  14. unrelated: { keep: true },
  15. recent: [{ providerID: "openai", modelID: "gpt-5" }],
  16. favorite: [],
  17. variant: { "openai/gpt-5": "high" },
  18. })
  19. })
  20. test("atomically serializes patches and variant updates", async () => {
  21. await using tmp = await tmpdir()
  22. const file = path.join(tmp.path, "model.json")
  23. await Bun.write(file, JSON.stringify({ unrelated: "keep", favorite: [], variant: {} }))
  24. const repository = createModelPreferenceRepository(file)
  25. const openai = { providerID: "openai", modelID: "org/gpt-5" }
  26. const anthropic = { providerID: "anthropic", modelID: "claude/sonnet" }
  27. await Promise.all([
  28. repository.patch({ recent: [openai] }),
  29. repository.saveVariant(openai, "high"),
  30. repository.saveVariant(anthropic, "low"),
  31. ])
  32. expect(await Bun.file(file).json()).toEqual({
  33. unrelated: "keep",
  34. recent: [openai],
  35. favorite: [],
  36. variant: { "openai/org/gpt-5": "high", "anthropic/claude/sonnet": "low" },
  37. })
  38. await repository.saveVariant(openai, "default")
  39. expect(await repository.resolveVariant(openai)).toBeUndefined()
  40. expect((await Bun.file(file).json()).variant).toEqual({ "anthropic/claude/sonnet": "low" })
  41. })