feat(bug-reports): Herkunft der Fehlermeldung im Betreff-Kuerzel und als Zeile Herkunft ausweisen
WebView2 (Windows) sieht im User-Agent aus wie Edge, WebKitGTK (Linux) wie Safari — im Postfach war eine Client-Meldung von einer Browser-Meldung nicht zu unterscheiden. Neuer reiner Helfer origin.ts leitet aus vier optionalen DTO-Feldern (Desktop-App) bzw. dem User-Agent (Browser) ein Betreff-Kuerzel und eine Zeile "Herkunft: ..." ab; rein informativ, laengenbegrenzt, nichts wird gespeichert (T-GZA-01). Browser-Pfad ist damit Ende-zu-Ende fertig. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016g2npLxzH5gZpg8s2S6vKh
This commit is contained in:
@@ -11,7 +11,7 @@ import { BugReportsService } from './bug-reports.service';
|
||||
/**
|
||||
* BugReportsService.spec — NEU (quick-260914-m97, Fehler-melden-Knopf).
|
||||
*
|
||||
* Acht Tests, darunter die vier Falsifizierungen des Plans:
|
||||
* Zehn Tests, darunter die vier Falsifizierungen des Plans:
|
||||
* (a) Drossel: der sechste Bericht in zehn Minuten -> 429, nach dem
|
||||
* Fenster (Fake-Timer) wieder durch;
|
||||
* (b) manipulierte Bilddatei ohne PNG-Kopf -> 400, nie versendet;
|
||||
@@ -20,6 +20,8 @@ import { BugReportsService } from './bug-reports.service';
|
||||
* (d) Fremdfelder im Rumpf (tenantId/userId) aendern NICHTS an der
|
||||
* Mandantenkennung — Empfaenger, Benutzerzeile und Versand laufen
|
||||
* ausschliesslich mit der Kennung aus dem Sitzungsnachweis.
|
||||
* Test 9 und 10 (quick-260918-gza): Betreff-Kuerzel und Zeile `Herkunft:`
|
||||
* fuer den Desktop- und den Browser-Pfad, Protokollzeile mit Kuerzel.
|
||||
*
|
||||
* `forTenant` wird wie in `user.controller.spec.ts` durch einen gebundenen
|
||||
* Fake-Klienten ersetzt, der nur Zeilen des eigenen Mandanten liefert;
|
||||
@@ -135,7 +137,7 @@ describe('BugReportsService (quick-260914-m97)', () => {
|
||||
const [tenantId, to, report] = mailService.sendBugReport.mock.calls[0] as any[];
|
||||
expect(tenantId).toBe('t1');
|
||||
expect(to).toBe('fehler@a.example.invalid');
|
||||
expect(report.subject).toBe('[Tessera Fehlermeldung] v1.2.3 beta - /admin/users?tab=x');
|
||||
expect(report.subject).toBe('[Tessera Fehlermeldung] [Browser] v1.2.3 beta - /admin/users?tab=x');
|
||||
for (const needle of [
|
||||
'Knopf tut nichts',
|
||||
'/admin/users?tab=x',
|
||||
@@ -145,6 +147,7 @@ describe('BugReportsService (quick-260914-m97)', () => {
|
||||
't1',
|
||||
'v1.2.3 (beta) abc1234',
|
||||
'Tessera API v9.9.9 (live)',
|
||||
'Herkunft: Browser — unbekannt auf unbekannt',
|
||||
'UA',
|
||||
'1920x1080',
|
||||
'[2026-09-14T09:59:00.000Z] fetch: GET /modules -> 500 {"statusCode":500}',
|
||||
@@ -291,4 +294,53 @@ describe('BugReportsService (quick-260914-m97)', () => {
|
||||
expect(report.text).not.toContain('Eindringling');
|
||||
expect(report.text).not.toContain('fremd@x.invalid');
|
||||
});
|
||||
|
||||
it('Test 9 (quick-260918-gza): Desktop/Windows — Betreff-Kuerzel, Zeile Herkunft VOR Browser:, Protokollzeile mit Kuerzel', async () => {
|
||||
const { service, mailService } = makeService({});
|
||||
const edgeUa =
|
||||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.2792.52';
|
||||
|
||||
await service.submit(
|
||||
sessionUser,
|
||||
{
|
||||
...baseDto,
|
||||
clientKind: 'desktop',
|
||||
clientOs: 'windows',
|
||||
clientVersion: '1.2.0',
|
||||
clientCommit: 'a6d1a64',
|
||||
userAgent: edgeUa,
|
||||
} as any,
|
||||
undefined,
|
||||
);
|
||||
|
||||
const report = (mailService.sendBugReport.mock.calls[0] as any[])[2];
|
||||
expect(report.subject.startsWith('[Tessera Fehlermeldung] [Desktop/Windows] v1.2.3 beta - ')).toBe(true);
|
||||
expect(report.text).toContain('Herkunft: Desktop-App (Windows), Tessera-App 1.2.0 · Stand a6d1a64');
|
||||
expect(report.text).toContain('Browser: Mozilla/5.0 (Windows NT 10.0');
|
||||
expect(report.text).toContain('Fenster: 1920x1080');
|
||||
expect(report.text.indexOf('Herkunft:')).toBeLessThan(report.text.indexOf('Browser:'));
|
||||
|
||||
const { service: freshService, mailService: freshMail } = makeService({});
|
||||
freshMail.sendBugReport.mockClear();
|
||||
(freshService as any).logger.log.mockClear();
|
||||
await freshService.submit(
|
||||
sessionUser,
|
||||
{ ...baseDto, clientKind: 'desktop', clientOs: 'windows', clientVersion: '1.2.0', clientCommit: 'a6d1a64', userAgent: edgeUa } as any,
|
||||
undefined,
|
||||
);
|
||||
expect((freshService as any).logger.log).toHaveBeenCalledTimes(1);
|
||||
expect((freshService as any).logger.log.mock.calls[0][0]).toContain('[Desktop/Windows]');
|
||||
});
|
||||
|
||||
it('Test 10 (quick-260918-gza): Browser mit echtem User-Agent — Betreff und Zeile Herkunft nennen Browser und Version', async () => {
|
||||
const { service, mailService } = makeService({});
|
||||
const chromeUa =
|
||||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36';
|
||||
|
||||
await service.submit(sessionUser, { ...baseDto, clientKind: 'browser', userAgent: chromeUa } as any, undefined);
|
||||
|
||||
const report = (mailService.sendBugReport.mock.calls[0] as any[])[2];
|
||||
expect(report.subject).toContain('[Browser]');
|
||||
expect(report.text).toContain('Herkunft: Browser — Chrome 129 auf Windows');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user