Files
ZeasyAlexandClaude Opus 5 08f7c21450 Veroeffentlichung ueber Gitea, BOM-Toleranz, Tests fuer den YAML-Leser
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
2026-09-09 17:43:43 +02:00

54 lines
2.3 KiB
TypeScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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 });
});