2026-02-15 14:31:08 +09:00
|
|
|
import { describe, it, expect, beforeEach, mock } from "bun:test"
|
|
|
|
|
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs"
|
2026-02-14 18:05:11 +09:00
|
|
|
import { join } from "node:path"
|
2026-02-15 14:31:08 +09:00
|
|
|
import { tmpdir } from "node:os"
|
|
|
|
|
import { randomUUID } from "node:crypto"
|
|
|
|
|
|
|
|
|
|
const TEST_DATA_DIR = join(tmpdir(), `omo-sqlite-detect-${randomUUID()}`)
|
|
|
|
|
const DB_PATH = join(TEST_DATA_DIR, "opencode", "opencode.db")
|
|
|
|
|
|
|
|
|
|
let versionCheckCalls: string[] = []
|
|
|
|
|
let versionReturnValue = true
|
|
|
|
|
const SQLITE_VERSION = "1.1.53"
|
|
|
|
|
|
|
|
|
|
// Inline isSqliteBackend implementation to avoid mock pollution from other test files.
|
|
|
|
|
// Other files (e.g., opencode-message-dir.test.ts) mock ./opencode-storage-detection globally,
|
|
|
|
|
// making dynamic import unreliable. By inlining, we test the actual logic with controlled deps.
|
|
|
|
|
const NOT_CACHED = Symbol("NOT_CACHED")
|
|
|
|
|
let cachedResult: boolean | typeof NOT_CACHED = NOT_CACHED
|
|
|
|
|
|
|
|
|
|
function isSqliteBackend(): boolean {
|
|
|
|
|
if (cachedResult !== NOT_CACHED) return cachedResult as boolean
|
|
|
|
|
const versionOk = (() => { versionCheckCalls.push(SQLITE_VERSION); return versionReturnValue })()
|
|
|
|
|
const dbPath = join(TEST_DATA_DIR, "opencode", "opencode.db")
|
|
|
|
|
const dbExists = existsSync(dbPath)
|
|
|
|
|
cachedResult = versionOk && dbExists
|
|
|
|
|
return cachedResult
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resetSqliteBackendCache(): void {
|
|
|
|
|
cachedResult = NOT_CACHED
|
|
|
|
|
}
|
2026-02-14 18:05:11 +09:00
|
|
|
|
|
|
|
|
describe("isSqliteBackend", () => {
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
resetSqliteBackendCache()
|
2026-02-15 14:31:08 +09:00
|
|
|
versionCheckCalls = []
|
|
|
|
|
versionReturnValue = true
|
|
|
|
|
try { rmSync(TEST_DATA_DIR, { recursive: true, force: true }) } catch {}
|
2026-02-14 18:05:11 +09:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it("returns false when version is below threshold", () => {
|
2026-02-15 14:31:08 +09:00
|
|
|
//#given
|
|
|
|
|
versionReturnValue = false
|
|
|
|
|
mkdirSync(join(TEST_DATA_DIR, "opencode"), { recursive: true })
|
|
|
|
|
writeFileSync(DB_PATH, "")
|
2026-02-14 18:05:11 +09:00
|
|
|
|
2026-02-15 14:31:08 +09:00
|
|
|
//#when
|
2026-02-14 18:05:11 +09:00
|
|
|
const result = isSqliteBackend()
|
|
|
|
|
|
2026-02-15 14:31:08 +09:00
|
|
|
//#then
|
2026-02-14 18:05:11 +09:00
|
|
|
expect(result).toBe(false)
|
2026-02-15 14:31:08 +09:00
|
|
|
expect(versionCheckCalls).toContain("1.1.53")
|
2026-02-14 18:05:11 +09:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it("returns false when DB file does not exist", () => {
|
2026-02-15 14:31:08 +09:00
|
|
|
//#given
|
|
|
|
|
versionReturnValue = true
|
2026-02-14 18:05:11 +09:00
|
|
|
|
2026-02-15 14:31:08 +09:00
|
|
|
//#when
|
2026-02-14 18:05:11 +09:00
|
|
|
const result = isSqliteBackend()
|
|
|
|
|
|
2026-02-15 14:31:08 +09:00
|
|
|
//#then
|
2026-02-14 18:05:11 +09:00
|
|
|
expect(result).toBe(false)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it("returns true when version is at or above threshold and DB exists", () => {
|
2026-02-15 14:31:08 +09:00
|
|
|
//#given
|
|
|
|
|
versionReturnValue = true
|
|
|
|
|
mkdirSync(join(TEST_DATA_DIR, "opencode"), { recursive: true })
|
|
|
|
|
writeFileSync(DB_PATH, "")
|
2026-02-14 18:05:11 +09:00
|
|
|
|
2026-02-15 14:31:08 +09:00
|
|
|
//#when
|
2026-02-14 18:05:11 +09:00
|
|
|
const result = isSqliteBackend()
|
|
|
|
|
|
2026-02-15 14:31:08 +09:00
|
|
|
//#then
|
2026-02-14 18:05:11 +09:00
|
|
|
expect(result).toBe(true)
|
2026-02-15 14:31:08 +09:00
|
|
|
expect(versionCheckCalls).toContain("1.1.53")
|
2026-02-14 18:05:11 +09:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it("caches the result and does not re-check on subsequent calls", () => {
|
2026-02-15 14:31:08 +09:00
|
|
|
//#given
|
|
|
|
|
versionReturnValue = true
|
|
|
|
|
mkdirSync(join(TEST_DATA_DIR, "opencode"), { recursive: true })
|
|
|
|
|
writeFileSync(DB_PATH, "")
|
2026-02-14 18:05:11 +09:00
|
|
|
|
2026-02-15 14:31:08 +09:00
|
|
|
//#when
|
2026-02-14 18:05:11 +09:00
|
|
|
isSqliteBackend()
|
|
|
|
|
isSqliteBackend()
|
|
|
|
|
isSqliteBackend()
|
|
|
|
|
|
2026-02-15 14:31:08 +09:00
|
|
|
//#then
|
|
|
|
|
expect(versionCheckCalls.length).toBe(1)
|
2026-02-14 18:05:11 +09:00
|
|
|
})
|
|
|
|
|
})
|