session-schema.test.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { describe, expect, test } from "bun:test"
  2. import { Schema } from "effect"
  3. import { ProjectV2 } from "@kirincode-ai/core/project"
  4. import { MessageID, SessionID } from "../../src/session/schema"
  5. import { Session } from "../../src/session/session"
  6. const info = {
  7. id: SessionID.descending(),
  8. slug: "test-session",
  9. projectID: ProjectV2.ID.global,
  10. workspaceID: undefined,
  11. directory: "/tmp/opencode",
  12. parentID: undefined,
  13. summary: undefined,
  14. cost: 0,
  15. tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
  16. share: undefined,
  17. title: "Test session",
  18. version: "1.0.0",
  19. time: {
  20. created: 1,
  21. updated: 2,
  22. compacting: undefined,
  23. archived: undefined,
  24. },
  25. permission: undefined,
  26. revert: undefined,
  27. } satisfies Session.Info
  28. describe("Session schema", () => {
  29. test("encodes undefined optional session fields as omitted keys", () => {
  30. const encoded = Schema.encodeUnknownSync(Session.Info)(info) as Record<string, unknown>
  31. for (const key of ["workspaceID", "parentID", "summary", "share", "permission", "revert"]) {
  32. expect(Object.hasOwn(encoded, key)).toBe(false)
  33. }
  34. expect(Object.hasOwn(encoded.time as Record<string, unknown>, "compacting")).toBe(false)
  35. expect(Object.hasOwn(encoded.time as Record<string, unknown>, "archived")).toBe(false)
  36. expect(JSON.stringify(encoded)).not.toContain("parentID")
  37. })
  38. test("encodes undefined optional global session project fields as omitted keys", () => {
  39. const encoded = Schema.encodeUnknownSync(Session.GlobalInfo)({
  40. ...info,
  41. project: {
  42. id: ProjectV2.ID.global,
  43. name: undefined,
  44. worktree: "/tmp/opencode",
  45. },
  46. }) as Record<string, unknown>
  47. expect(Object.hasOwn(encoded, "parentID")).toBe(false)
  48. expect(Object.hasOwn(encoded.project as Record<string, unknown>, "name")).toBe(false)
  49. })
  50. test("encodes nested undefined optional session fields as omitted keys", () => {
  51. const encoded = Schema.encodeUnknownSync(Session.Info)({
  52. ...info,
  53. summary: {
  54. additions: 1,
  55. deletions: 2,
  56. files: 3,
  57. diffs: undefined,
  58. },
  59. revert: {
  60. messageID: MessageID.ascending(),
  61. partID: undefined,
  62. snapshot: undefined,
  63. diff: undefined,
  64. },
  65. }) as Record<string, unknown>
  66. expect(Object.hasOwn(encoded.summary as Record<string, unknown>, "diffs")).toBe(false)
  67. for (const key of ["partID", "snapshot", "diff"]) {
  68. expect(Object.hasOwn(encoded.revert as Record<string, unknown>, key)).toBe(false)
  69. }
  70. })
  71. })