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
(cherry picked from commit 4f9b5b90d6d6c8e2f49b16cfef1c5c605af450de)
This commit is contained in:
Tobias Urdin 2024-06-17 14:43:50 +02:00
parent dcaf0cc51f
commit a761ec8d3c
3 changed files with 15 additions and 3 deletions

View File

@ -87,7 +87,14 @@
var innerFunc = promise.catch.calls.argsFor(0)[0];
expect(innerFunc).toBeDefined();
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);
}
}

View File

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

View File

@ -95,7 +95,8 @@
method: 'delete',
path: '/api/swift/containers/spam/metadata/',
error: 'Unable to delete the container.',
testInput: [ 'spam' ]
testInput: [ 'spam' ],
throws: true
},
{
func: 'setContainerAccess',
@ -205,7 +206,10 @@
var innerFunc = promise.catch.calls.argsFor(0)[0];
// In the case of 409
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);
}
);