Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

97 linesCodeBlameRaw
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import type { UpdatePull, VersionUpdateEntry } from "@g1t/contracts";
5
6import { conditionText, entryStatus, groupText, ignoreText, livePulls, timeUntil, utc } from "./dependency-updates.ts";
7
8const NOW = Date.parse("2026-10-07T12:00:00Z");
9
10test("a next run is said as a time ahead", () => {
11 assert.equal(timeUntil("2026-10-07T15:30:00Z", NOW), "in 3h");
12 assert.equal(timeUntil("2026-10-09T12:00:00Z", NOW), "in 2d");
13 assert.equal(timeUntil("2026-10-07T12:20:00Z", NOW), "in 20m");
14 assert.equal(timeUntil("2026-10-07T11:00:00Z", NOW), "due now");
15 assert.equal(utc("2026-10-12T05:00:00.000Z"), "2026-10-12 05:00 UTC");
16});
17
18const entry: VersionUpdateEntry = {
19 id: "npm:/",
20 ecosystem: "npm",
21 directories: ["/"],
22 supported: true,
23 interval: "weekly",
24 schedule: "Mondays at 05:00 (UTC)",
25 openPullRequestsLimit: 5,
26 targetBranch: null,
27 multiEcosystemGroup: null,
28 groups: [],
29 ignore: [],
30 allow: [],
31 labels: null,
32 assignees: [],
33 reviewers: [],
34 milestone: null,
35 versioningStrategy: null,
36 options: {},
37 notes: [],
38 nextRunAt: "2026-10-12T05:00:00Z",
39 lastCheckedAt: null,
40 lastResult: null,
41 lastError: null,
42};
43
44test("an entry's status", () => {
45 assert.deepEqual(entryStatus(entry), { label: "Active", tone: "accent" });
46 assert.equal(entryStatus({ ...entry, supported: false }).label, "Not updated yet");
47 assert.equal(entryStatus({ ...entry, openPullRequestsLimit: 0 }).label, "Off");
48 assert.equal(entryStatus({ ...entry, nextRunAt: null }).label, "Not scheduled");
49 assert.equal(entryStatus({ ...entry, lastError: "boom" }).label, "Last check failed");
50});
51
52test("rules read as one line", () => {
53 assert.equal(
54 groupText({
55 name: "lint",
56 appliesTo: "version-updates",
57 patterns: ["eslint*"],
58 excludePatterns: ["eslint-old"],
59 updateTypes: ["minor"],
60 dependencyType: "development",
61 groupBy: null,
62 }),
63 "lint: eslint* · not eslint-old · development · minor",
64 );
65 assert.equal(
66 groupText({ name: "fixes", appliesTo: "security-updates", patterns: [], excludePatterns: [], updateTypes: [], dependencyType: null, groupBy: null }),
67 "fixes: every dependency · security updates",
68 );
69 assert.equal(ignoreText({ dependency: "react", versions: [">=19"], updateTypes: [] }), "react >=19");
70 assert.equal(ignoreText({ dependency: "*", versions: [], updateTypes: ["version-update:semver-major"] }), "* major");
71 assert.equal(ignoreText({ dependency: "left-pad", versions: [], updateTypes: [] }), "left-pad (every version)");
72 const condition = { ecosystem: "npm", dependency: "react", versions: null, updateType: null, by: "ana", pull: 4, at: "" };
73 assert.equal(conditionText(condition), "every version");
74 assert.equal(conditionText({ ...condition, versions: ">= 19.a, < 20" }), ">= 19.a, < 20");
75 assert.equal(conditionText({ ...condition, updateType: "version-update:semver-minor" }), "minor versions");
76});
77
78test("only live update pull requests are listed", () => {
79 const pull = (state: UpdatePull["state"]): UpdatePull => ({
80 kind: "version",
81 entry: "npm:/",
82 ecosystem: "npm",
83 group: null,
84 branch: "g1t/npm_and_yarn/x",
85 title: "Bump x",
86 state,
87 pull: 1,
88 dependencies: [],
89 mergeRequestedBy: null,
90 error: null,
91 updatedAt: "",
92 });
93 assert.deepEqual(
94 livePulls([pull("open"), pull("merged"), pull("requested"), pull("superseded"), pull("needs_code")]).map((p) => p.state),
95 ["open", "requested", "needs_code"],
96 );
97});