112 lines
3.2 KiB
TypeScript
112 lines
3.2 KiB
TypeScript
import { beforeAll, describe, expect, mock, test } from "bun:test"
|
|
import { createRoot } from "solid-js"
|
|
import type { LineComment } from "./comments"
|
|
|
|
let createCommentSessionForTest: typeof import("./comments").createCommentSessionForTest
|
|
|
|
beforeAll(async () => {
|
|
mock.module("@solidjs/router", () => ({
|
|
useParams: () => ({}),
|
|
}))
|
|
mock.module("@opencode-ai/ui/context", () => ({
|
|
createSimpleContext: () => ({
|
|
use: () => undefined,
|
|
provider: () => undefined,
|
|
}),
|
|
}))
|
|
const mod = await import("./comments")
|
|
createCommentSessionForTest = mod.createCommentSessionForTest
|
|
})
|
|
|
|
function line(file: string, id: string, time: number): LineComment {
|
|
return {
|
|
id,
|
|
file,
|
|
comment: id,
|
|
time,
|
|
selection: { start: 1, end: 1 },
|
|
}
|
|
}
|
|
|
|
describe("comments session indexing", () => {
|
|
test("keeps file list behavior and aggregate chronological order", () => {
|
|
createRoot((dispose) => {
|
|
const now = Date.now()
|
|
const comments = createCommentSessionForTest({
|
|
"a.ts": [line("a.ts", "a-late", now + 20_000), line("a.ts", "a-early", now + 1_000)],
|
|
"b.ts": [line("b.ts", "b-mid", now + 10_000)],
|
|
})
|
|
|
|
expect(comments.list("a.ts").map((item) => item.id)).toEqual(["a-late", "a-early"])
|
|
expect(comments.all().map((item) => item.id)).toEqual(["a-early", "b-mid", "a-late"])
|
|
|
|
const next = comments.add({
|
|
file: "b.ts",
|
|
comment: "next",
|
|
selection: { start: 2, end: 2 },
|
|
})
|
|
|
|
expect(comments.list("b.ts").at(-1)?.id).toBe(next.id)
|
|
expect(comments.all().map((item) => item.time)).toEqual(
|
|
comments
|
|
.all()
|
|
.map((item) => item.time)
|
|
.slice()
|
|
.sort((a, b) => a - b),
|
|
)
|
|
|
|
dispose()
|
|
})
|
|
})
|
|
|
|
test("remove updates file and aggregate indexes consistently", () => {
|
|
createRoot((dispose) => {
|
|
const comments = createCommentSessionForTest({
|
|
"a.ts": [line("a.ts", "a1", 10), line("a.ts", "shared", 20)],
|
|
"b.ts": [line("b.ts", "shared", 30)],
|
|
})
|
|
|
|
comments.setFocus({ file: "a.ts", id: "shared" })
|
|
comments.setActive({ file: "a.ts", id: "shared" })
|
|
comments.remove("a.ts", "shared")
|
|
|
|
expect(comments.list("a.ts").map((item) => item.id)).toEqual(["a1"])
|
|
expect(
|
|
comments
|
|
.all()
|
|
.filter((item) => item.id === "shared")
|
|
.map((item) => item.file),
|
|
).toEqual(["b.ts"])
|
|
expect(comments.focus()).toBeNull()
|
|
expect(comments.active()).toEqual({ file: "a.ts", id: "shared" })
|
|
|
|
dispose()
|
|
})
|
|
})
|
|
|
|
test("clear resets file and aggregate indexes plus focus state", () => {
|
|
createRoot((dispose) => {
|
|
const comments = createCommentSessionForTest({
|
|
"a.ts": [line("a.ts", "a1", 10)],
|
|
})
|
|
|
|
const next = comments.add({
|
|
file: "b.ts",
|
|
comment: "next",
|
|
selection: { start: 2, end: 2 },
|
|
})
|
|
|
|
comments.setActive({ file: "b.ts", id: next.id })
|
|
comments.clear()
|
|
|
|
expect(comments.list("a.ts")).toEqual([])
|
|
expect(comments.list("b.ts")).toEqual([])
|
|
expect(comments.all()).toEqual([])
|
|
expect(comments.focus()).toBeNull()
|
|
expect(comments.active()).toBeNull()
|
|
|
|
dispose()
|
|
})
|
|
})
|
|
})
|