Published source
Download source ZIP
CH-J Server Manager
Browse directories and files for a specific application release.
Source is provided under the CH-J Proprietary Software License 1.14. Its availability does not change the license terms or grant additional rights.
1
"use strict";3
const test = require("node:test");4
const assert = require("node:assert/strict");5
const { UpdateService } = require("../src/main/updates/updateService");7
function 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
};16
}18
test("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: () => provider43
});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
});58
test("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
});80
test("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