Skip to content

Commit 2040c2f

Browse files
committed
add test
1 parent a839ca3 commit 2040c2f

File tree

1 file changed

+173
-0
lines changed

1 file changed

+173
-0
lines changed

tests/update-check.test.ts

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
#!/usr/bin/env tsx
2+
3+
import assert from "node:assert/strict";
4+
import * as updateCheck from "../src/utils/update-check";
5+
6+
type TestCase = {
7+
name: string;
8+
run: () => void | Promise<void>;
9+
};
10+
11+
const tests: TestCase[] = [];
12+
const originalArgv1 = process.argv[1];
13+
const originalEnvExecPath = process.env.npm_execpath;
14+
const originalEnvUserAgent = process.env.npm_config_user_agent;
15+
16+
function test(name: string, run: TestCase["run"]) {
17+
tests.push({ name, run });
18+
}
19+
20+
function cleanup() {
21+
process.argv[1] = originalArgv1;
22+
process.env.npm_execpath = originalEnvExecPath ?? "";
23+
process.env.npm_config_user_agent = originalEnvUserAgent ?? "";
24+
}
25+
26+
test("parseVersion handles valid versions", () => {
27+
assert.deepStrictEqual(updateCheck.parseVersion("1.2.3"), [1, 2, 3]);
28+
assert.deepStrictEqual(updateCheck.parseVersion("0.0.0"), [0, 0, 0]);
29+
assert.deepStrictEqual(updateCheck.parseVersion("10.20.30"), [10, 20, 30]);
30+
});
31+
32+
test("parseVersion handles invalid versions", () => {
33+
assert.strictEqual(updateCheck.parseVersion("1.2"), null);
34+
assert.strictEqual(updateCheck.parseVersion("1.2.3.4"), null);
35+
assert.strictEqual(updateCheck.parseVersion("v1.2.3"), null);
36+
assert.strictEqual(updateCheck.parseVersion(""), null);
37+
assert.strictEqual(updateCheck.parseVersion("invalid"), null);
38+
});
39+
40+
test("isOutdated detects newer versions", () => {
41+
assert.strictEqual(updateCheck.isOutdated("1.0.0", "1.0.1"), true);
42+
assert.strictEqual(updateCheck.isOutdated("1.0.0", "1.1.0"), true);
43+
assert.strictEqual(updateCheck.isOutdated("1.0.0", "2.0.0"), true);
44+
assert.strictEqual(updateCheck.isOutdated("1.2.3", "1.2.4"), true);
45+
});
46+
47+
test("isOutdated returns false when up to date", () => {
48+
assert.strictEqual(updateCheck.isOutdated("1.0.0", "1.0.0"), false);
49+
assert.strictEqual(updateCheck.isOutdated("1.1.0", "1.0.0"), false);
50+
assert.strictEqual(updateCheck.isOutdated("1.0.1", "1.0.0"), false);
51+
assert.strictEqual(updateCheck.isOutdated("1.2.4", "1.2.3"), false);
52+
assert.strictEqual(updateCheck.isOutdated("2.0.0", "1.0.0"), false);
53+
});
54+
55+
test("isOutdated handles invalid versions gracefully", () => {
56+
assert.strictEqual(updateCheck.isOutdated("invalid", "1.0.0"), false);
57+
assert.strictEqual(updateCheck.isOutdated("1.0.0", "invalid"), false);
58+
assert.strictEqual(updateCheck.isOutdated("1.2", "1.2.4"), false);
59+
});
60+
61+
test("formatUpdateNotice creates boxed output", () => {
62+
const output = updateCheck.formatUpdateNotice({
63+
current: "1.0.0",
64+
latest: "1.1.0",
65+
packageName: "@donnes/syncode",
66+
});
67+
68+
assert.ok(output.includes("┌"));
69+
assert.ok(output.includes("┐"));
70+
assert.ok(output.includes("└"));
71+
assert.ok(output.includes("┘"));
72+
assert.ok(output.includes("│"));
73+
assert.ok(output.includes("─"));
74+
assert.ok(output.includes("Current: 1.0.0"));
75+
assert.ok(output.includes("Latest: 1.1.0"));
76+
assert.ok(output.includes("npm install -g @donnes/syncode@latest"));
77+
});
78+
79+
test("formatUpdateNotice handles different package names", () => {
80+
const output = updateCheck.formatUpdateNotice({
81+
current: "1.0.0",
82+
latest: "2.0.0",
83+
packageName: "test-package",
84+
});
85+
86+
assert.ok(output.includes("npm install -g test-package@latest"));
87+
});
88+
89+
test("isNpxInvocation detects npx execution", () => {
90+
const originalArgv1 = process.argv[1];
91+
try {
92+
process.argv[1] = "/tmp/_npx/package/lib/index.js";
93+
assert.strictEqual(updateCheck.isNpxInvocation(), true);
94+
95+
process.argv[1] = "C:\\Users\\_npx\\package\\lib\\index.js";
96+
assert.strictEqual(updateCheck.isNpxInvocation(), true);
97+
} finally {
98+
process.argv[1] = originalArgv1;
99+
}
100+
});
101+
102+
test("isNpxInvocation detects npx via npm_execpath", () => {
103+
const originalEnvNodeExecpath = process.env.npm_execpath;
104+
try {
105+
process.env.npm_execpath = "/usr/local/lib/node_modules/npm/bin/npx-cli.js";
106+
assert.strictEqual(updateCheck.isNpxInvocation(), true);
107+
108+
process.env.npm_execpath =
109+
"C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npx-cli.js";
110+
assert.strictEqual(updateCheck.isNpxInvocation(), true);
111+
} finally {
112+
process.env.npm_execpath = originalEnvNodeExecpath ?? "";
113+
}
114+
});
115+
116+
test("isNpxInvocation detects npx via user agent", () => {
117+
const originalEnvUserAgent = process.env.npm_config_user_agent;
118+
try {
119+
process.env.npm_config_user_agent = "npm/9.0.0 node/v18.0.0 npx/9.0.0";
120+
assert.strictEqual(updateCheck.isNpxInvocation(), true);
121+
} finally {
122+
process.env.npm_config_user_agent = originalEnvUserAgent ?? "";
123+
}
124+
});
125+
126+
test("isNpxInvocation returns false for global install", () => {
127+
const originalArgv1 = process.argv[1];
128+
const originalEnvNodeExecpath = process.env.npm_execpath;
129+
const originalEnvUserAgent = process.env.npm_config_user_agent;
130+
131+
try {
132+
process.argv[1] = "/usr/local/bin/syncode";
133+
process.env.npm_execpath = "";
134+
process.env.npm_config_user_agent = "";
135+
136+
assert.strictEqual(updateCheck.isNpxInvocation(), false);
137+
} finally {
138+
process.argv[1] = originalArgv1;
139+
process.env.npm_execpath = originalEnvNodeExecpath ?? "";
140+
process.env.npm_config_user_agent = originalEnvUserAgent ?? "";
141+
}
142+
});
143+
144+
test("isOutdated comparison edge cases", () => {
145+
assert.strictEqual(updateCheck.isOutdated("9.9.9", "10.0.0"), true);
146+
assert.strictEqual(updateCheck.isOutdated("10.0.0", "9.9.9"), false);
147+
assert.strictEqual(updateCheck.isOutdated("0.0.0", "0.0.1"), true);
148+
assert.strictEqual(updateCheck.isOutdated("1.9.9", "2.0.0"), true);
149+
assert.strictEqual(updateCheck.isOutdated("2.0.0", "2.0.1"), true);
150+
assert.strictEqual(updateCheck.isOutdated("2.0.0", "2.1.0"), true);
151+
assert.strictEqual(updateCheck.isOutdated("2.1.0", "3.0.0"), true);
152+
});
153+
154+
async function run() {
155+
for (const { name, run } of tests) {
156+
try {
157+
await run();
158+
console.log(`✓ ${name}`);
159+
} catch (error) {
160+
console.error(`✗ ${name}`);
161+
console.error(error);
162+
process.exitCode = 1;
163+
} finally {
164+
cleanup();
165+
}
166+
}
167+
168+
if (process.exitCode) {
169+
process.exit(1);
170+
}
171+
}
172+
173+
await run();

0 commit comments

Comments
 (0)