const test = require('node:test'); const assert = require('node:assert'); const { parseVersionFromFileName, compareVersions, parseSidecar, checkNewTag, buildReleaseBody } = require('../src/features/releaseAssist.js'); const HASH = '5ca7f0c680b6d73a92eadb5e90f8164f7f3fa52071ffaac54803b0e5ec95f35d'; test('Version aus dem Dateinamen', () => { assert.strictEqual(parseVersionFromFileName('Git-Manager-GUI-Setup-2.2.1.exe'), '2.2.1'); assert.strictEqual(parseVersionFromFileName('Git Manager GUI Setup 2.1.10.exe'), '2.1.10'); assert.strictEqual(parseVersionFromFileName('setup.exe'), null); assert.strictEqual(parseVersionFromFileName(null), null); }); test('Versionen werden numerisch verglichen, nicht als Text', () => { assert.strictEqual(compareVersions('2.2.1', '2.2.0'), 1); assert.strictEqual(compareVersions('v2.10.0', 'v2.9.9'), 1); assert.strictEqual(compareVersions('2.2.1', 'v2.2.1'), 0); assert.strictEqual(compareVersions('2.1.9', '2.2.0'), -1); assert.deepStrictEqual(['v2.10.0', 'v2.9.0', 'v2.2.1'].sort(compareVersions), ['v2.2.1', 'v2.9.0', 'v2.10.0']); }); test('Sidecar-Datei: Hash wird gefunden, auch mit Großbuchstaben', () => { assert.strictEqual(parseSidecar(`${HASH} Git-Manager-GUI-Setup-2.2.1.exe\n`), HASH); assert.strictEqual(parseSidecar(HASH.toUpperCase()), HASH); assert.strictEqual(parseSidecar('kein Hash'), null); assert.strictEqual(parseSidecar('abc123'), null); }); test('Neuer Tag: Format, Duplikat und Reihenfolge werden geprüft', () => { const releases = [{ tag_name: 'v2.2.0' }, { tag_name: 'v2.1.9' }]; assert.strictEqual(checkNewTag('v2.2.1', releases).ok, true); assert.strictEqual(checkNewTag('2.2.1', releases).ok, true); assert.strictEqual(checkNewTag('v2.10.0', releases).ok, true); assert.match(checkNewTag('release-2', releases).reason, /Version wie v2\.2\.1/); assert.match(checkNewTag('v2.2.0', releases).reason, /gibt es schon/); assert.match(checkNewTag('V2.2.0', releases).reason, /gibt es schon/); assert.match(checkNewTag('v2.1.5', releases).reason, /nicht neuer/); }); test('Neuer Tag: ohne vorhandene Releases ist jede Version erlaubt', () => { assert.strictEqual(checkNewTag('v1.0.0', []).ok, true); assert.strictEqual(checkNewTag('v1.0.0', null).ok, true); assert.strictEqual(checkNewTag('v1.0.0', [{ tag_name: 'nightly' }]).ok, true); }); test('Release-Text: Prüfsummen im Format, das der Updater liest', () => { const body = buildReleaseBody('## Neu\n\n- Abbrechen\n', [{ name: 'Git-Manager-GUI-Setup-2.2.1.exe', sha256: HASH.toUpperCase() }]); assert.match(body, /^## Neu/); assert.ok(body.includes(`- Git-Manager-GUI-Setup-2.2.1.exe: ${HASH}`)); // genau so liest updater.js die Zeile const line = body.split('\n').find((l) => l.toLowerCase().includes('git-manager-gui-setup-2.2.1.exe') && /\b[a-f0-9]{64}\b/i.test(l)); assert.ok(line); assert.strictEqual(line.match(/\b([a-fA-F0-9]{64})\b/)[1], HASH); }); test('Release-Text: ungültige Prüfsummen und leere Notizen', () => { assert.strictEqual(buildReleaseBody('Nur Text', [{ name: 'a.exe', sha256: 'zu kurz' }]), 'Nur Text'); assert.strictEqual(buildReleaseBody('', []), ''); assert.ok(buildReleaseBody('', [{ name: 'a.exe', sha256: HASH }]).startsWith('### Prüfsummen')); });