Delete container show duplicate toast notifications

When trying to delete a container with objects in it the
Swift rest API rejects the request with 409.

In the JS code we catch() the promise from the request
and show a toast error that the request failed but we
don't throw in that catch() so the then() callback that
the callee specified gets called which shows a toast
message that the container delete was successful and
removes it from the list, if you refresh the page the
container is still in the list (as expected).

This subtle error probably exists in multiple places
where the same kind of logic exists.

Change-Id: Iadf1e58f23c935a7dd599b9fd3444a0a22396213
This commit is contained in:
Tobias Urdin 2024-06-17 14:43:50 +02:00
parent a4404445ab
commit 4f9b5b90d6
3 changed files with 15 additions and 3 deletions

View File

@ -87,7 +87,14 @@
var innerFunc = promise.catch.calls.argsFor(0)[0]; var innerFunc = promise.catch.calls.argsFor(0)[0];
expect(innerFunc).toBeDefined(); expect(innerFunc).toBeDefined();
spyOn(toastService, 'add'); spyOn(toastService, 'add');
innerFunc({status: 500}); var response = {status: 500};
if (angular.isDefined(config.throws) && config.throws) {
expect(function() {
innerFunc(response);
}).toThrow(response);
} else {
innerFunc(response);
}
expect(toastService.add).toHaveBeenCalledWith(config.messageType || 'error', config.error); expect(toastService.add).toHaveBeenCalledWith(config.messageType || 'error', config.error);
} }
} }

View File

@ -186,6 +186,7 @@
} else { } else {
toastService.add('error', gettext('Unable to delete the container.')); toastService.add('error', gettext('Unable to delete the container.'));
} }
throw response;
}); });
} }

View File

@ -95,7 +95,8 @@
method: 'delete', method: 'delete',
path: '/api/swift/containers/spam/metadata/', path: '/api/swift/containers/spam/metadata/',
error: 'Unable to delete the container.', error: 'Unable to delete the container.',
testInput: [ 'spam' ] testInput: [ 'spam' ],
throws: true
}, },
{ {
func: 'setContainerAccess', func: 'setContainerAccess',
@ -205,7 +206,10 @@
var innerFunc = promise.catch.calls.argsFor(0)[0]; var innerFunc = promise.catch.calls.argsFor(0)[0];
// In the case of 409 // In the case of 409
var message = 'Unable to delete the container because it is not empty.'; var message = 'Unable to delete the container because it is not empty.';
innerFunc({data: message, status: 409}); var response = {data: message, status: 409};
expect(function() {
innerFunc(response);
}).toThrow(response);
expect(toastService.add).toHaveBeenCalledWith('error', message); expect(toastService.add).toHaveBeenCalledWith('error', message);
} }
); );