fix(18): Manifest-Eintraege in getManifest() auf gueltige Form pruefen (WR-03)

Ein kaputter Plattform-Eintrag (z. B. fehlendes name-Feld oder ungueltiger
sha256) fiel bisher erst spaeter unbemerkt durch -- entry.name === undefined
wurde zu "undefined" gecoerct und als Dateiname gesucht. getManifest()
prueft jetzt jeden vorhandenen Plattform-Eintrag (name: string, size: number,
sha256: 64-stelliger Hex-String) und behandelt ein kaputtes Manifest wie ein
fehlendes (404 + Warn-Log), statt die kaputte Form durchzureichen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-16 17:38:50 +02:00
parent 65efdf6ab7
commit a8964f1a23
2 changed files with 66 additions and 2 deletions
+27 -1
View File
@@ -161,7 +161,33 @@ describe('DesktopService/DesktopController — HTTP-Durchstich (Phase 18)', () =
expect(res.status).toBe(404);
});
it('Test 8 (bewusst oeffentlich): getLatest und download tragen @Public()', () => {
it('Test 9 (WR-03, ungueltiger Eintrag im Manifest): name fehlt -- getLatest wirft NotFoundException statt "undefined" als Datei zu suchen', () => {
// Bewusst am `writeManifest()`-Helper vorbei direkt geschrieben -- dessen
// Parametertyp verlangt `name`, hier soll aber genau dessen Fehlen
// geprueft werden (kaputtes Manifest, kein TS-Typfehler im Test).
fs.writeFileSync(
path.join(tempDir, 'manifest.json'),
JSON.stringify({
version: '1.1.0',
channel: 'dev',
commit: 'abc1234',
buildTime: '2026-09-16T00:00:00Z',
files: { linux: { size: 123, sha256: 'a'.repeat(64) } },
}),
);
const service = new DesktopService();
expect(() => service.getLatest()).toThrow(NotFoundException);
});
it('Test 10 (WR-03, ungueltiger Eintrag im Manifest): sha256 ist kein 64-stelliger Hex-String -- 404', async () => {
writeManifest({
linux: { name: PACKAGE_NAME, size: packageSize, sha256: 'not-a-hash' },
});
const res = await fetch(`${baseUrl}/desktop/download/linux`);
expect(res.status).toBe(404);
});
it('Test 11 (bewusst oeffentlich): getLatest und download tragen @Public()', () => {
expect(Reflect.getMetadata(IS_PUBLIC_KEY, DesktopController.prototype.getLatest)).toBe(true);
expect(Reflect.getMetadata(IS_PUBLIC_KEY, DesktopController.prototype.download)).toBe(true);
});