Das Repo ist jetzt oeffentlich, die Pakete haengen an der Veroeffentlichung `latest`. Damit funktioniert `abdulive update` ohne Token. - config.example.yaml traegt die gepruefte Update-Adresse - .gitea/workflows/release.yml baut beim Tag und ersetzt `latest` - Byte Order Mark: Notepad und `Set-Content -Encoding utf8` schreiben eines, und ohne Behandlung hiess der erste Schluessel in der config.yaml "\ufeffchannel" - die Einstellung waere stillschweigend ignoriert worden - Der YAML-Leser hatte gar keine Tests; er liest die Konfiguration, an der alles haengt. Jetzt acht. Der Updater ist einmal komplett durchgelaufen: 0.4.0 erkannt, 119 MB geladen, Pruefsumme geprueft, bereitgelegt, von launcher.ps1 getauscht. 93 Tests, Typpruefung sauber. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AhVSfMFdWnXKCv5JfLnArZ
54 lines
2.3 KiB
TypeScript
54 lines
2.3 KiB
TypeScript
// Tests fuer den Updater. Der Anlass fuer `looksLikeLogin` war ein echter
|
||
// Fehlschlag: git.zeasy.dev verlangt instanzweit eine Anmeldung und antwortet
|
||
// auf jede Adresse mit 303 auf /user/login. `irm ... | iex` folgte der
|
||
// Umleitung und versuchte, die Anmeldeseite als PowerShell auszufuehren.
|
||
|
||
import { test } from 'node:test';
|
||
import assert from 'node:assert/strict';
|
||
import { isNewer, looksLikeLogin, parseJsonLoose } from './update.ts';
|
||
|
||
test('vergleicht Versionen als Zahlen, nicht als Text', () => {
|
||
// Der Fall, der bei Zeichenkettenvergleich falsch herauskaeme
|
||
assert.equal(isNewer('2026.10.1', '2026.9.9'), true);
|
||
assert.equal(isNewer('2026.9.9', '2026.10.1'), false);
|
||
assert.equal(isNewer('0.5.1', '0.5.0'), true);
|
||
assert.equal(isNewer('0.5.0', '0.5.0'), false);
|
||
assert.equal(isNewer('0.10.0', '0.9.0'), true);
|
||
});
|
||
|
||
test('fehlende Stellen zaehlen als Null', () => {
|
||
assert.equal(isNewer('1.1', '1'), true);
|
||
assert.equal(isNewer('1', '1.0.0'), false);
|
||
});
|
||
|
||
test('erkennt eine Anmeldeseite am Inhaltstyp', () => {
|
||
assert.equal(looksLikeLogin('text/html; charset=utf-8', Buffer.from('x')), true);
|
||
assert.equal(looksLikeLogin('application/json', Buffer.from('{"version":"1"}')), false);
|
||
assert.equal(looksLikeLogin('application/zip', Buffer.from([0x50, 0x4b, 3, 4])), false);
|
||
});
|
||
|
||
test('erkennt sie auch, wenn der Inhaltstyp schweigt', () => {
|
||
// Genau die Antwort, die git.zeasy.dev geliefert hat
|
||
const gitea = Buffer.from(
|
||
'<a href="/user/login?redirect_to=%2FZeasyAlex%2Fabdulive">See Other</a>.');
|
||
assert.equal(looksLikeLogin(null, gitea), true);
|
||
assert.equal(looksLikeLogin(null, Buffer.from('<!DOCTYPE html><html>')), true);
|
||
});
|
||
|
||
test('haelt ein echtes Manifest nicht faelschlich fuer HTML', () => {
|
||
const manifest = Buffer.from(JSON.stringify({
|
||
version: '0.5.0', datei: 'abdulive-0.5.0-win-x64.zip', groesse: 119_000_000,
|
||
sha256: 'a'.repeat(64),
|
||
}));
|
||
assert.equal(looksLikeLogin(null, manifest), false);
|
||
});
|
||
|
||
test('ein Byte Order Mark macht das Manifest nicht unlesbar', () => {
|
||
// Windows PowerShell 5.1 schreibt bei `Set-Content -Encoding utf8` eines,
|
||
// und Notepad ebenso. JSON.parse verschluckt sich daran.
|
||
const mitBom = '{"version":"0.5.0"}';
|
||
assert.throws(() => JSON.parse(mitBom));
|
||
assert.deepEqual(parseJsonLoose(mitBom), { version: '0.5.0' });
|
||
assert.deepEqual(parseJsonLoose('{"a":1}'), { a: 1 });
|
||
});
|