Files
kandev/apps/cli/src/version.test.ts
T

106 lines
2.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { compareVersions, parseVersion, sortVersionsDesc } from "./version";
describe("parseVersion", () => {
it("parses simple version", () => {
const v = parseVersion("1.2.3");
expect(v.segments).toEqual([1, 2, 3]);
expect(v.raw).toBe("1.2.3");
});
it("strips v prefix", () => {
expect(parseVersion("v1.2").segments).toEqual([1, 2]);
});
it("handles single segment", () => {
expect(parseVersion("3").segments).toEqual([3]);
});
it("handles two segments", () => {
expect(parseVersion("v0.9").segments).toEqual([0, 9]);
});
it("returns empty segments for non-numeric input", () => {
expect(parseVersion("latest").segments).toEqual([]);
});
it("returns empty segments for partially numeric input", () => {
expect(parseVersion("1.2.beta").segments).toEqual([]);
});
});
describe("compareVersions", () => {
it("returns 0 for equal versions", () => {
expect(compareVersions("1.0.0", "1.0.0")).toBe(0);
});
it("returns 1 when a > b (patch)", () => {
expect(compareVersions("1.0.1", "1.0.0")).toBe(1);
});
it("returns -1 when a < b (patch)", () => {
expect(compareVersions("1.0.0", "1.0.1")).toBe(-1);
});
it("returns 1 when a > b (minor)", () => {
expect(compareVersions("1.1.0", "1.0.0")).toBe(1);
});
it("returns 1 when a > b (major)", () => {
expect(compareVersions("2.0.0", "1.9.9")).toBe(1);
});
it("strips v prefix", () => {
expect(compareVersions("v1.2.0", "1.2.0")).toBe(0);
});
it("strips v prefix on both sides", () => {
expect(compareVersions("v2.0.0", "v1.0.0")).toBe(1);
});
it("treats missing segments as 0", () => {
expect(compareVersions("1.0", "1.0.0")).toBe(0);
});
it("compares different length versions", () => {
expect(compareVersions("1.0.1", "1.0")).toBe(1);
});
it("handles single-segment versions", () => {
expect(compareVersions("2", "1")).toBe(1);
});
it("handles single vs multi-segment", () => {
expect(compareVersions("1", "1.0.0")).toBe(0);
});
});
describe("sortVersionsDesc", () => {
it("sorts versions newest first", () => {
expect(sortVersionsDesc(["v0.1", "v1.2", "v0.9"])).toEqual(["v1.2", "v0.9", "v0.1"]);
});
it("sorts major versions correctly", () => {
expect(sortVersionsDesc(["v1.9", "v2.0"])).toEqual(["v2.0", "v1.9"]);
});
it("sorts numerically not lexicographically", () => {
expect(sortVersionsDesc(["v1.9", "v1.10", "v1.2"])).toEqual(["v1.10", "v1.9", "v1.2"]);
});
it("handles single element", () => {
expect(sortVersionsDesc(["v1.0"])).toEqual(["v1.0"]);
});
it("handles empty array", () => {
expect(sortVersionsDesc([])).toEqual([]);
});
it("does not mutate the original array", () => {
const input = ["v0.2", "v0.1"];
sortVersionsDesc(input);
expect(input).toEqual(["v0.2", "v0.1"]);
});
});