Make deleting a non-existent file is tolerable

This commit is contained in:
Torsten Grote
2022-01-21 15:04:51 -03:00
parent 0fba65a722
commit 61ea7ff8de
4 changed files with 22 additions and 2 deletions

View File

@@ -92,9 +92,13 @@ interface MailboxApi {
* Used by owner and contacts to delete files. * Used by owner and contacts to delete files.
* <p> * <p>
* Returns 200 OK (no exception) if deletion was successful. * Returns 200 OK (no exception) if deletion was successful.
*
* @throws TolerableFailureException on 404 response,
* because file was most likely deleted already.
*/ */
void deleteFile(MailboxProperties properties, String folderId, void deleteFile(MailboxProperties properties, String folderId,
String fileId) throws IOException, ApiException; String fileId)
throws IOException, ApiException, TolerableFailureException;
/** /**
* Lists all contact outboxes that have files available * Lists all contact outboxes that have files available

View File

@@ -223,7 +223,8 @@ class MailboxApiImpl implements MailboxApi {
@Override @Override
public void deleteFile(MailboxProperties properties, String folderId, public void deleteFile(MailboxProperties properties, String folderId,
String fileId) throws IOException, ApiException { String fileId)
throws IOException, ApiException, TolerableFailureException {
String path = "/files/" + folderId + "/" + fileId; String path = "/files/" + folderId + "/" + fileId;
Request request = getRequestBuilder(properties.getAuthToken()) Request request = getRequestBuilder(properties.getAuthToken())
.delete() .delete()
@@ -231,6 +232,7 @@ class MailboxApiImpl implements MailboxApi {
.build(); .build();
OkHttpClient client = httpClientProvider.get(); OkHttpClient client = httpClientProvider.get();
Response response = client.newCall(request).execute(); Response response = client.newCall(request).execute();
if (response.code() == 404) throw new TolerableFailureException();
if (response.code() != 200) throw new ApiException(); if (response.code() != 200) throw new ApiException();
} }

View File

@@ -591,6 +591,7 @@ public class MailboxApiTest extends BrambleTestCase {
server.enqueue(new MockResponse()); server.enqueue(new MockResponse());
server.enqueue(new MockResponse().setResponseCode(205)); server.enqueue(new MockResponse().setResponseCode(205));
server.enqueue(new MockResponse().setResponseCode(401)); server.enqueue(new MockResponse().setResponseCode(401));
server.enqueue(new MockResponse().setResponseCode(404));
server.start(); server.start();
String baseUrl = getBaseUrl(server); String baseUrl = getBaseUrl(server);
MailboxProperties properties = MailboxProperties properties =
@@ -621,6 +622,15 @@ public class MailboxApiTest extends BrambleTestCase {
assertEquals("/files/" + contactInboxId + "/" + name, assertEquals("/files/" + contactInboxId + "/" + name,
request3.getPath()); request3.getPath());
assertToken(request3, token); assertToken(request3, token);
// file not found is tolerable
assertThrows(TolerableFailureException.class, () ->
api.deleteFile(properties, contactInboxId, name));
RecordedRequest request4 = server.takeRequest();
assertEquals("DELETE", request4.getMethod());
assertEquals("/files/" + contactInboxId + "/" + name,
request4.getPath());
assertToken(request4, token);
} }
@Test @Test

View File

@@ -225,6 +225,10 @@ public class MailboxIntegrationTest extends BrambleTestCase {
api.getFiles(ownerProperties, contact.outboxId)); api.getFiles(ownerProperties, contact.outboxId));
assertEquals(emptyList(), api.getFolders(ownerProperties)); assertEquals(emptyList(), api.getFolders(ownerProperties));
// deleting a non-existent file is tolerable
assertThrows(TolerableFailureException.class, () ->
api.deleteFile(ownerProperties, contact.outboxId, file3name));
// owner deletes contact again to leave clean state for other tests // owner deletes contact again to leave clean state for other tests
api.deleteContact(ownerProperties, contactId); api.deleteContact(ownerProperties, contactId);
assertEquals(emptyList(), api.getContacts(ownerProperties)); assertEquals(emptyList(), api.getContacts(ownerProperties));