CH-J Server Managerserver management over SSH
Menu
Published source

CH-J Server Manager

Browse directories and files for a specific application release.

Download source ZIP
CH-J Proprietary Software License 1.14

Source is provided under the CH-J Proprietary Software License 1.14. Its availability does not change the license terms or grant additional rights.

3,7 KB · 97 linesDownload file
1"use strict";
3const test = require("node:test");
4const assert = require("node:assert/strict");
5const { UpdateService } = require("../src/main/updates/updateService");
7function release(id, publishedAt) {
8 return {
9 id,
10 version: "0.0.1",
11 publishedAt,
12 filename: `${id}.dmg`,
13 size: 10,
14 sha512: "a".repeat(128)
15 };
18test("service exposes and selects distinct builds with the installed version", async () => {
19 const older = release("build-older", "2026-08-07T15:00:00Z");
20 const newer = release("build-newer", "2026-08-07T16:00:00Z");
21 const provider = {
22 async listReleases() { return { releases: [newer, older], sourceBaseUrl: "https://192.168.10.154/" }; },
23 async downloadAndVerify(selected) {
24 return {
25 path: `/tmp/${selected.filename}`,
26 signaturePath: `/tmp/${selected.filename}.asc`,
27 filename: selected.filename,
28 size: selected.size,
29 sha512: selected.sha512,
30 reused: false,
31 signatureVerified: true,
32 primaryFingerprint: "0".repeat(40),
33 signingFingerprints: ["1".repeat(40)]
34 };
35 }
36 };
37 const service = new UpdateService({
38 appVersion: "0.0.1",
39 platform: "darwin",
40 arch: "arm64",
41 configStore: { get: () => ({ updates: { channel: "alpha", lastLaunchedRelease: null } }) },
42 providerFactory: () => provider
43 });
45 const checked = await service.check();
46 assert.equal(checked.releases.length, 2);
47 assert.equal(checked.selectedReleaseId, "build-newer");
48 assert.equal(checked.releaseRelation, "sameVersionNewerRelease");
50 const selected = service.select("build-older");
51 assert.equal(selected.selectedReleaseId, "build-older");
52 assert.equal(selected.releaseRelation, "sameVersionOlderRelease");
53 const downloaded = await service.download();
54 assert.equal(downloaded.downloaded.releaseId, "build-older");
55 assert.throws(() => service.select("missing"), /not available/);
56});
58test("service compares same-version releases with the last launched installer by publication time", async () => {
59 const current = release("build-current", "2026-08-07T15:00:00Z");
60 const newer = release("build-newer", "2026-08-07T16:00:00Z");
61 const older = release("build-older", "2026-08-07T14:00:00Z");
62 newer.sha512 = "b".repeat(128);
63 older.sha512 = "c".repeat(128);
64 const config = { updates: { channel: "alpha", lastLaunchedRelease: current } };
65 const service = new UpdateService({
66 appVersion: "0.0.1",
67 platform: "darwin",
68 arch: "arm64",
69 configStore: { get: () => config },
70 providerFactory: () => ({
71 async listReleases() { return { releases: [newer, current, older], sourceBaseUrl: "https://192.168.10.154/" }; }
72 })
73 });
75 assert.equal((await service.check()).releaseRelation, "sameVersionNewerRelease");
76 assert.equal(service.select("build-current").releaseRelation, "sameVersionCurrentRelease");
77 assert.equal(service.select("build-older").releaseRelation, "sameVersionOlderRelease");
78});
80test("embedded build identity marks the exact repository release as current", async () => {
81 const current = { ...release("repository-release", "2026-08-08T15:35:00Z"), buildId: "core-20260808T153400Z-a1b2c3d4e5f6" };
82 const service = new UpdateService({
83 appVersion: "0.0.1",
84 buildId: current.buildId,
85 platform: "darwin",
86 arch: "arm64",
87 configStore: { get: () => ({ updates: { channel: "alpha", lastLaunchedRelease: null } }) },
88 providerFactory: () => ({
89 async listReleases() { return { releases: [current], sourceBaseUrl: "https://192.168.10.154/" }; }
90 })
91 });
93 const state = await service.check();
94 assert.equal(state.releaseRelation, "sameVersionCurrentRelease");
95 assert.equal(state.updateAvailable, false);
96 assert.equal(state.currentBuildId, current.buildId);
97});

SHA-256: 0c9bb8f92ae5f6488150fb3db0588d3628757c6263dbb4bcb2e65200f366c0e0

Archive SHA-256: 5ac91caf4fa32a6fdb114f2430deed486fbe7489d5eea343d1f034169fafb5e0