fix(logos): 404 „logoGone“ beim Löschen gilt als Erfolg
Schlussreview F5. Geht die Antwort einer Löschanfrage verloren und der Nutzer klickt noch einmal auf „Löschen“, antwortet der Dienst mit 404 `logoGone` (das Logo ist ja schon weg). Die Infozeile zeigte dann „Dieses Logo ist nicht (mehr) verfügbar.“ als Fehler, die Kachel blieb stehen. - Dieser Fehler (ApiError mit Status 404 und Schlüssel `logoGone`) gilt wie ein gelungenes Löschen: forgetLogo, die Kachel verschwindet, eine Auswahl wird aufgehoben (onSelect(null)), kein Fehlertext – wie bei „Zurückziehen“ einer schon zurückgezogenen Karte. - Jeder andere Fehler bleibt einer, auch ein 404 mit anderem oder ohne Schlüssel (etwa ein Dienst, der die Anfrage nicht kennt). - Tests in logo-info.test.ts (Hochlader, Admin, Seite verlassen, Fehler, die Fehler bleiben) und im Picker mit Raster und Auswahl. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4aedb1d322
commit
df1cf29d42
3 files changed
+80
-1
No files matched your search
@@ -388,6 +388,62 @@ describe('Löschen durch den Hochlader', () => {
|
||||
expect(host.removeLogo).toHaveBeenCalledExactlyOnceWith('a');
|
||||
});
|
||||
|
||||
it('404 „logoGone“ (das Logo gibt es schon nicht mehr, etwa weil die Antwort einer ersten Anfrage verloren ging): gilt als Erfolg wie ein gelungenes Löschen', async () => {
|
||||
user = 'u9';
|
||||
const order: string[] = [];
|
||||
fx.deleteLogo.mockRejectedValueOnce(new ApiError(404, 'Dieses Logo ist nicht (mehr) verfügbar.', true, 'logoGone'));
|
||||
mocks.forgetLogo.mockImplementation(() => void order.push('forget'));
|
||||
host.removeLogo.mockImplementation(() => void order.push('remove'));
|
||||
await mount();
|
||||
button('Löschen').click();
|
||||
await flush();
|
||||
expect(order).toEqual(['forget', 'remove']);
|
||||
expect(mocks.forgetLogo).toHaveBeenCalledExactlyOnceWith('a');
|
||||
expect(host.removeLogo).toHaveBeenCalledExactlyOnceWith('a');
|
||||
expect(message()).toBe(''); // kein Fehlertext
|
||||
});
|
||||
|
||||
it('404 „logoGone“ gilt für den Admin ebenso, auch bei einem fremden Logo', async () => {
|
||||
admin = true;
|
||||
fx.deleteLogo.mockRejectedValueOnce(new ApiError(404, 'Dieses Logo ist nicht (mehr) verfügbar.', true, 'logoGone'));
|
||||
await mount();
|
||||
button('Löschen').click();
|
||||
await flush();
|
||||
expect(mocks.forgetLogo).toHaveBeenCalledExactlyOnceWith('a');
|
||||
expect(host.removeLogo).toHaveBeenCalledExactlyOnceWith('a');
|
||||
expect(message()).toBe('');
|
||||
});
|
||||
|
||||
it('404 „logoGone“ nach dem Verlassen der Seite: der Zwischenspeicher vergisst das Logo trotzdem, die Kachel wird nicht mehr angefasst', async () => {
|
||||
user = 'u9';
|
||||
const request = deferred<void>();
|
||||
fx.deleteLogo.mockReturnValue(request.promise);
|
||||
await mount();
|
||||
button('Löschen').click();
|
||||
await flush();
|
||||
abort.abort();
|
||||
request.reject(new ApiError(404, 'Dieses Logo ist nicht (mehr) verfügbar.', true, 'logoGone'));
|
||||
await flush();
|
||||
expect(mocks.forgetLogo).toHaveBeenCalledExactlyOnceWith('a');
|
||||
expect(host.removeLogo).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it.each([
|
||||
['ein 404 ohne diesen Schlüssel (etwa ein Dienst, der die Anfrage nicht kennt)', new ApiError(404, 'Etwas ist schiefgelaufen. Bitte nochmal versuchen.', true, 'generic')],
|
||||
['ein 404 ohne Schlüssel', new ApiError(404, 'Nicht gefunden', true)],
|
||||
['logoGone mit einem anderen Status', new ApiError(500, 'Dieses Logo ist nicht (mehr) verfügbar.', false, 'logoGone')],
|
||||
['ein 403', new ApiError(403, 'Dazu hast du keine Berechtigung.', true, 'forbidden')],
|
||||
])('%s bleibt ein Fehler: Text in der Meldezeile, nichts wird vergessen oder entfernt', async (_name, error) => {
|
||||
user = 'u9';
|
||||
fx.deleteLogo.mockRejectedValueOnce(error);
|
||||
await mount();
|
||||
button('Löschen').click();
|
||||
await flush();
|
||||
expect(message()).not.toBe('');
|
||||
expect(mocks.forgetLogo).not.toHaveBeenCalled();
|
||||
expect(host.removeLogo).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('ein Fehler anderer Art (Netz) bekommt den allgemeinen Text', async () => {
|
||||
user = 'u9';
|
||||
fx.deleteLogo.mockRejectedValueOnce(new TypeError('offline'));
|
||||
|
||||
Reference in new issue
Block a user