import { describe, test, expect, beforeEach, afterEach } from "bun:test" import { parseVersion, compareVersions, getOpenCodeVersion, isOpenCodeVersionAtLeast, resetVersionCache, setVersionCache, MINIMUM_OPENCODE_VERSION, OPENCODE_NATIVE_AGENTS_INJECTION_VERSION, } from "./opencode-version" describe("opencode-version", () => { describe("parseVersion", () => { test("parses simple version", () => { // #given a simple version string const version = "1.2.3" // #when parsed const result = parseVersion(version) // #then returns array of numbers expect(result).toEqual([1, 2, 3]) }) test("handles v prefix", () => { // #given version with v prefix const version = "v1.2.3" // #when parsed const result = parseVersion(version) // #then strips prefix and parses correctly expect(result).toEqual([1, 2, 3]) }) test("handles prerelease suffix", () => { // #given version with prerelease const version = "1.2.3-beta.1" // #when parsed const result = parseVersion(version) // #then ignores prerelease part expect(result).toEqual([1, 2, 3]) }) test("handles two-part version", () => { // #given two-part version const version = "1.2" // #when parsed const result = parseVersion(version) // #then returns two numbers expect(result).toEqual([1, 2]) }) }) describe("compareVersions", () => { test("returns 0 for equal versions", () => { // #given two equal versions // #when compared const result = compareVersions("1.1.1", "1.1.1") // #then returns 0 expect(result).toBe(0) }) test("returns 1 when a > b", () => { // #given a is greater than b // #when compared const result = compareVersions("1.2.0", "1.1.0") // #then returns 1 expect(result).toBe(1) }) test("returns -1 when a < b", () => { // #given a is less than b // #when compared const result = compareVersions("1.0.9", "1.1.0") // #then returns -1 expect(result).toBe(-1) }) test("handles different length versions", () => { // #given versions with different lengths // #when compared expect(compareVersions("1.1", "1.1.0")).toBe(0) expect(compareVersions("1.1.1", "1.1")).toBe(1) expect(compareVersions("1.1", "1.1.1")).toBe(-1) }) test("handles major version differences", () => { // #given major version difference // #when compared expect(compareVersions("2.0.0", "1.9.9")).toBe(1) expect(compareVersions("1.9.9", "2.0.0")).toBe(-1) }) }) describe("getOpenCodeVersion", () => { beforeEach(() => { resetVersionCache() }) afterEach(() => { resetVersionCache() }) test("returns cached version on subsequent calls", () => { // #given version is set in cache setVersionCache("1.2.3") // #when getting version const result = getOpenCodeVersion() // #then returns cached value expect(result).toBe("1.2.3") }) test("returns null when cache is set to null", () => { // #given cache is explicitly set to null setVersionCache(null) // #when getting version (cache is already set) const result = getOpenCodeVersion() // #then returns null without executing command expect(result).toBe(null) }) }) describe("isOpenCodeVersionAtLeast", () => { beforeEach(() => { resetVersionCache() }) afterEach(() => { resetVersionCache() }) test("returns true for exact version", () => { // #given version is 1.1.1 setVersionCache("1.1.1") // #when checking against 1.1.1 const result = isOpenCodeVersionAtLeast("1.1.1") // #then returns true expect(result).toBe(true) }) test("returns true for versions above target", () => { // #given version is above target setVersionCache("1.2.0") // #when checking against 1.1.1 const result = isOpenCodeVersionAtLeast("1.1.1") // #then returns true expect(result).toBe(true) }) test("returns false for versions below target", () => { // #given version is below target setVersionCache("1.1.0") // #when checking against 1.1.1 const result = isOpenCodeVersionAtLeast("1.1.1") // #then returns false expect(result).toBe(false) }) test("returns true when version cannot be detected", () => { // #given version is null (undetectable) setVersionCache(null) // #when checking const result = isOpenCodeVersionAtLeast("1.1.1") // #then returns true (assume newer version) expect(result).toBe(true) }) }) describe("MINIMUM_OPENCODE_VERSION", () => { test("is set to 1.1.1", () => { expect(MINIMUM_OPENCODE_VERSION).toBe("1.1.1") }) }) describe("OPENCODE_NATIVE_AGENTS_INJECTION_VERSION", () => { test("is set to 1.1.37", () => { // #given the native agents injection version constant // #when exported // #then it should be 1.1.37 (PR #10678) expect(OPENCODE_NATIVE_AGENTS_INJECTION_VERSION).toBe("1.1.37") }) test("version detection works correctly with native agents version", () => { // #given OpenCode version at or above native agents injection version setVersionCache("1.1.37") // #when checking against native agents version const result = isOpenCodeVersionAtLeast(OPENCODE_NATIVE_AGENTS_INJECTION_VERSION) // #then returns true (native support available) expect(result).toBe(true) }) test("version detection returns false for older versions", () => { // #given OpenCode version below native agents injection version setVersionCache("1.1.36") // #when checking against native agents version const result = isOpenCodeVersionAtLeast(OPENCODE_NATIVE_AGENTS_INJECTION_VERSION) // #then returns false (no native support) expect(result).toBe(false) }) test("returns true when version detection fails (fail-safe)", () => { // #given version cannot be detected setVersionCache(null) // #when checking against native agents version const result = isOpenCodeVersionAtLeast(OPENCODE_NATIVE_AGENTS_INJECTION_VERSION) // #then returns true (assume latest, enable native support) expect(result).toBe(true) }) }) })