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:
@@ -8,7 +8,7 @@ import { BugReportDto } from './dto/bug-report.dto';
|
||||
/**
|
||||
* BugReportsController.spec — NEU (quick-260914-m97, Fehler-melden-Knopf).
|
||||
*
|
||||
* Drei Tests an der Grenze Browser -> API:
|
||||
* Vier Tests an der Grenze Browser -> API:
|
||||
* 1. die globale Pipe (`whitelist: true, transform: true`, wie in
|
||||
* `main.ts`) entfernt Fremdfelder wie `tenantId` (T-M97-06) und
|
||||
* normalisiert `errors` (multer/append-field liefert EIN Feld als
|
||||
@@ -16,6 +16,8 @@ import { BugReportDto } from './dto/bug-report.dto';
|
||||
* 2. die DTO-Grenzen greifen (31 Eintraege, 4001 Zeichen -> 400);
|
||||
* 3. die Route steht JEDEM angemeldeten Benutzer offen — kein
|
||||
* `@Roles`-Metadatum, Pfad `bug-reports`.
|
||||
* 4. (quick-260918-gza) die vier neuen Client-Felder bleiben optional
|
||||
* und laengenbegrenzt erhalten.
|
||||
*/
|
||||
const pipe = new ValidationPipe({ whitelist: true, transform: true });
|
||||
const meta = { type: 'body' as const, metatype: BugReportDto };
|
||||
@@ -63,4 +65,29 @@ describe('BugReportsController (quick-260914-m97)', () => {
|
||||
expect(Reflect.getMetadata(ROLES_KEY, BugReportsController.prototype.submit)).toBeUndefined();
|
||||
expect(Reflect.getMetadata('path', BugReportsController)).toBe('bug-reports');
|
||||
});
|
||||
|
||||
it('Test 4 (quick-260918-gza): die vier Client-Felder bleiben optional und laengenbegrenzt erhalten', async () => {
|
||||
const withDesktop = (await pipe.transform(
|
||||
{ ...baseBody, clientKind: 'desktop', clientOs: 'windows', clientVersion: '1.2.0', clientCommit: '' },
|
||||
meta,
|
||||
)) as any;
|
||||
expect(withDesktop.clientKind).toBe('desktop');
|
||||
expect(withDesktop.clientOs).toBe('windows');
|
||||
expect(withDesktop.clientVersion).toBe('1.2.0');
|
||||
expect(withDesktop.clientCommit).toBe('');
|
||||
|
||||
const withoutClientFields = (await pipe.transform({ ...baseBody }, meta)) as any;
|
||||
expect(withoutClientFields.clientKind).toBeUndefined();
|
||||
|
||||
await expect(pipe.transform({ ...baseBody, clientKind: 'tablet' }, meta)).rejects.toThrow(BadRequestException);
|
||||
await expect(pipe.transform({ ...baseBody, clientOs: 'x'.repeat(21) }, meta)).rejects.toThrow(
|
||||
BadRequestException,
|
||||
);
|
||||
await expect(pipe.transform({ ...baseBody, clientVersion: 'x'.repeat(41) }, meta)).rejects.toThrow(
|
||||
BadRequestException,
|
||||
);
|
||||
await expect(pipe.transform({ ...baseBody, clientCommit: 'x'.repeat(41) }, meta)).rejects.toThrow(
|
||||
BadRequestException,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user