diff --git a/library/src/androidTest/java/com/nextcloud/android/lib/resources/recommendations/GetRecommendationsRemoteOperationIT.kt b/library/src/androidTest/java/com/nextcloud/android/lib/resources/recommendations/GetRecommendationsRemoteOperationIT.kt index ac2d4d343..7a3332dab 100644 --- a/library/src/androidTest/java/com/nextcloud/android/lib/resources/recommendations/GetRecommendationsRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/nextcloud/android/lib/resources/recommendations/GetRecommendationsRemoteOperationIT.kt @@ -17,7 +17,7 @@ class GetRecommendationsRemoteOperationIT : AbstractIT() { @Test fun getRecommendations() { testOnlyOnServer(NextcloudVersion.nextcloud_31) - assertTrue(CreateFolderRemoteOperation("/test/", true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation("/test/", true).execute(nextcloudClient).isSuccess) val result = GetRecommendationsRemoteOperation().execute(nextcloudClient).resultData diff --git a/library/src/androidTest/java/com/nextcloud/android/lib/resources/search/UnifiedSearchRemoteOperationIT.kt b/library/src/androidTest/java/com/nextcloud/android/lib/resources/search/UnifiedSearchRemoteOperationIT.kt index 9fc44f763..2edd2ca1e 100644 --- a/library/src/androidTest/java/com/nextcloud/android/lib/resources/search/UnifiedSearchRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/nextcloud/android/lib/resources/search/UnifiedSearchRemoteOperationIT.kt @@ -44,7 +44,7 @@ class UnifiedSearchRemoteOperationIT : AbstractIT() { @Test fun filesSearch() { val remotePath = "/testFolder" - assertTrue(CreateFolderRemoteOperation(remotePath, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient).isSuccess) val remoteFile = ReadFileRemoteOperation(remotePath) .execute(nextcloudClient) @@ -70,7 +70,7 @@ class UnifiedSearchRemoteOperationIT : AbstractIT() { @Test fun filesSearchWhitespace() { - assertTrue(CreateFolderRemoteOperation("/test Folder/", true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation("/test Folder/", true).execute(nextcloudClient).isSuccess) val result = UnifiedSearchRemoteOperation("files", "test").execute(nextcloudClient) assertTrue(result.isSuccess) diff --git a/library/src/androidTest/java/com/nextcloud/android/lib/richWorkspace/RichWorkspaceDirectEditingRemoteOperationIT.java b/library/src/androidTest/java/com/nextcloud/android/lib/richWorkspace/RichWorkspaceDirectEditingRemoteOperationIT.java index 8d4d2f8c3..3dd186119 100644 --- a/library/src/androidTest/java/com/nextcloud/android/lib/richWorkspace/RichWorkspaceDirectEditingRemoteOperationIT.java +++ b/library/src/androidTest/java/com/nextcloud/android/lib/richWorkspace/RichWorkspaceDirectEditingRemoteOperationIT.java @@ -39,7 +39,7 @@ public void getEditLinkForRoot() { public void getEditLinkForFolder() { String path = "/workspace/sub1/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); RemoteOperationResult result = new RichWorkspaceDirectEditingRemoteOperation(path).execute(client); assertTrue(result.isSuccess()); @@ -56,7 +56,7 @@ public void reuseExistingFile() throws IOException { String filePath = folder + "Readme.md"; File txtFile = getFile(ASSETS__TEXT_FILE_NAME); - assertTrue(new CreateFolderRemoteOperation(folder, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(folder, true).execute(nextcloudClient).isSuccess()); RemoteOperationResult uploadResult = new UploadFileRemoteOperation( txtFile.getAbsolutePath(), diff --git a/library/src/androidTest/java/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationIT.kt b/library/src/androidTest/java/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationIT.kt index 9d8a0215d..ca6878f4d 100644 --- a/library/src/androidTest/java/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationIT.kt @@ -17,7 +17,7 @@ class GetActivitiesRemoteOperationIT : AbstractIT() { @Test fun getActivities() { // set-up, create a folder so there is an activity - assertTrue(CreateFolderRemoteOperation("/test/123/1", true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation("/test/123/1", true).execute(nextcloudClient).isSuccess) val result = nextcloudClient.execute(GetActivitiesRemoteOperation()) assertTrue(result.isSuccess) diff --git a/library/src/androidTest/java/com/owncloud/android/AbstractIT.java b/library/src/androidTest/java/com/owncloud/android/AbstractIT.java index 3670898df..d51a36d73 100644 --- a/library/src/androidTest/java/com/owncloud/android/AbstractIT.java +++ b/library/src/androidTest/java/com/owncloud/android/AbstractIT.java @@ -117,7 +117,7 @@ public static void beforeAll() throws InterruptedException, client2.setUserId(loginName2); // for test same as userId String credentials2 = Credentials.basic(loginName2, password2); - nextcloudClient = new NextcloudClient(url, loginName2, credentials2, context); + nextcloudClient2 = new NextcloudClient(url, loginName2, credentials2, context); waitForServer(client, url); testConnection(); @@ -269,11 +269,11 @@ public static File extractAsset(String fileName, Context context) throws IOExcep @After public void after() { - removeOnClient(nextcloudClient); - removeOnClient(nextcloudClient2); + removeOnClient(client, nextcloudClient); + removeOnClient(client2, nextcloudClient2); } - private void removeOnClient(NextcloudClient nextcloudClient) { + private void removeOnClient(OwnCloudClient ownCloudClient, NextcloudClient nextcloudClient) { final var result = new ReadFolderRemoteOperation("/").execute(nextcloudClient); assertTrue(result.getLogMessage(context), result.isSuccess()); @@ -298,7 +298,7 @@ private void removeOnClient(NextcloudClient nextcloudClient) { unlockRemoteFile(remotePath); } - boolean isRemoteFileRemoved = removeRemoteFile(remotePath); + boolean isRemoteFileRemoved = removeRemoteFile(ownCloudClient, remotePath); assertTrue("Failed to remove " + remotePath, isRemoteFileRemoved); } @@ -320,7 +320,7 @@ private void unlockRemoteFile(String path) { } } - private boolean removeRemoteFile(String path) { + private boolean removeRemoteFile(OwnCloudClient client, String path) { final var operation = new RemoveFileRemoteOperation(path); final var result = operation.execute(client); return result.isSuccess(); diff --git a/library/src/androidTest/java/com/owncloud/android/CopyFileIT.java b/library/src/androidTest/java/com/owncloud/android/CopyFileIT.java index 7995043b1..9ebcf9aff 100644 --- a/library/src/androidTest/java/com/owncloud/android/CopyFileIT.java +++ b/library/src/androidTest/java/com/owncloud/android/CopyFileIT.java @@ -160,7 +160,7 @@ public void createFixtures() throws Exception { RemoteOperationResult result; for (String folderPath : FOLDERS_IN_FIXTURE) { - result = new CreateFolderRemoteOperation(folderPath, true).execute(client); + result = new CreateFolderRemoteOperation(folderPath, true).execute(nextcloudClient); assertTrue("Error creating folder" + folderPath + ": " + result, result.isSuccess()); } diff --git a/library/src/androidTest/java/com/owncloud/android/CreateFolderRemoteOperationIT.java b/library/src/androidTest/java/com/owncloud/android/CreateFolderRemoteOperationIT.java index 9740eea68..a0cd058ee 100644 --- a/library/src/androidTest/java/com/owncloud/android/CreateFolderRemoteOperationIT.java +++ b/library/src/androidTest/java/com/owncloud/android/CreateFolderRemoteOperationIT.java @@ -58,13 +58,13 @@ public void setUp() { public void testCreateFolder() { String remotePath = mFullPath2FolderBase; mCreatedFolderPaths.add(remotePath); - RemoteOperationResult result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + RemoteOperationResult result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue(result.isSuccess()); // Create Subfolder remotePath = mFullPath2FolderBase + FOLDER_PATH_BASE; mCreatedFolderPaths.add(remotePath); - result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue(result.isSuccess()); } @@ -75,12 +75,12 @@ public void testCreateFolder() { public void testCreateDuplicateFolder() { String remotePath = mFullPath2FolderBase + "duplicateFolder"; mCreatedFolderPaths.add(remotePath); - RemoteOperationResult result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + RemoteOperationResult result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue(result.isSuccess()); // Create folder again mCreatedFolderPaths.add(remotePath); - result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertFalse(result.isSuccess()); assertEquals(FOLDER_ALREADY_EXISTS, result.getCode()); } @@ -89,7 +89,7 @@ public void testCreateDuplicateFolder() { public void testFileID() { String remotePath = mFullPath2FolderBase + "/" + RandomStringGenerator.make(TAG_LENGTH); mCreatedFolderPaths.add(remotePath); - RemoteOperationResult result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + RemoteOperationResult result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue(result.isSuccess()); RemoteOperationResult readResult = new ReadFileRemoteOperation(remotePath).execute(nextcloudClient); @@ -106,31 +106,31 @@ public void testFileID() { @Test public void testCreateFolderSpecialCharactersOnNewVersion() { String remotePath = mFullPath2FolderBase + "_<"; - RemoteOperationResult result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + RemoteOperationResult result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue("Remote path: " + remotePath, result.isSuccess()); remotePath = mFullPath2FolderBase + "_>"; - result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue("Remote path: " + remotePath, result.isSuccess()); remotePath = mFullPath2FolderBase + "_:"; - result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue("Remote path: " + remotePath, result.isSuccess()); remotePath = mFullPath2FolderBase + "_\""; - result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue("Remote path: " + remotePath, result.isSuccess()); remotePath = mFullPath2FolderBase + "_|"; - result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue("Remote path: " + remotePath, result.isSuccess()); remotePath = mFullPath2FolderBase + "_?"; - result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue("Remote path: " + remotePath, result.isSuccess()); remotePath = mFullPath2FolderBase + "_*"; - result = new CreateFolderRemoteOperation(remotePath, true).execute(client); + result = new CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient); assertTrue("Remote path: " + remotePath, result.isSuccess()); } diff --git a/library/src/androidTest/java/com/owncloud/android/DeleteFileIT.java b/library/src/androidTest/java/com/owncloud/android/DeleteFileIT.java index 9c264ceb4..cc95982b3 100644 --- a/library/src/androidTest/java/com/owncloud/android/DeleteFileIT.java +++ b/library/src/androidTest/java/com/owncloud/android/DeleteFileIT.java @@ -38,7 +38,7 @@ public void setUp() throws Exception { mFullPath2Folder = baseFolderPath + FOLDER_PATH; mFullPath2File = baseFolderPath + FILE_PATH; - RemoteOperationResult result = new CreateFolderRemoteOperation(mFullPath2Folder, true).execute(client); + RemoteOperationResult result = new CreateFolderRemoteOperation(mFullPath2Folder, true).execute(nextcloudClient); assertTrue("Error creating folder" + mFullPath2Folder + ": " + result, result.isSuccess()); File textFile = getFile(ASSETS__TEXT_FILE_NAME); diff --git a/library/src/androidTest/java/com/owncloud/android/FileIT.java b/library/src/androidTest/java/com/owncloud/android/FileIT.java index 72c1f7b70..891e95dac 100644 --- a/library/src/androidTest/java/com/owncloud/android/FileIT.java +++ b/library/src/androidTest/java/com/owncloud/android/FileIT.java @@ -41,7 +41,7 @@ public void testCreateFolderSuccess() { String path = "/testFolder/"; // create folder - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // verify folder assertTrue(new ReadFolderRemoteOperation(path).execute(nextcloudClient).isSuccess()); @@ -55,10 +55,10 @@ public void testCreateFolderFailure() { String path = "/testFolder/"; // create folder - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // create folder a second time will fail - assertFalse(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertFalse(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // remove folder assertTrue(new RemoveFileRemoteOperation(path).execute(client).isSuccess()); @@ -69,7 +69,7 @@ public void testCreateNonExistingSubFolder() { String path = "/testFolder/1/2/3/4/5/"; String top = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // verify folder assertTrue(new ReadFolderRemoteOperation(path).execute(nextcloudClient).isSuccess()); @@ -85,7 +85,7 @@ public void testCreateFolderWithWrongURL() { client.setBaseUri(Uri.parse(uri.toString() + "/remote.php/dav/files/")); // create folder - assertFalse(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertFalse(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); client.setBaseUri(uri); } @@ -94,7 +94,7 @@ public void testCreateFolderWithWrongURL() { public void testZeroSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(nextcloudClient).isSuccess()); // verify @@ -117,7 +117,7 @@ public void testZeroSharees() { public void testShareViaLinkSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(nextcloudClient).isSuccess()); // share folder @@ -149,7 +149,7 @@ public void testShareViaLinkSharees() { public void testShareToGroupSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(nextcloudClient).isSuccess()); ShareeUser sharee = new ShareeUser("users", "", ShareType.GROUP); @@ -190,7 +190,7 @@ public void testShareToGroupSharees() { public void testOneSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(nextcloudClient).isSuccess()); ShareeUser sharee = new ShareeUser("user1", "User One", ShareType.USER); @@ -225,7 +225,7 @@ public void testOneSharees() { public void testTwoShareesOnParent() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(nextcloudClient).isSuccess()); List sharees = new ArrayList<>(); @@ -273,7 +273,7 @@ public void testTwoShareesOnParent() { public void testTwoSharees() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); assertTrue(new ReadFolderRemoteOperation(path).execute(nextcloudClient).isSuccess()); List sharees = new ArrayList<>(); @@ -314,7 +314,7 @@ public void testTwoSharees() { public void testLocalID() { // create & verify folder String path = "/testFolder/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); RemoteOperationResult result = new ReadFolderRemoteOperation(path).execute(nextcloudClient); assertTrue(result.isSuccess()); diff --git a/library/src/androidTest/java/com/owncloud/android/lib/common/operations/GetSharesIT.java b/library/src/androidTest/java/com/owncloud/android/lib/common/operations/GetSharesIT.java index 5a8061708..73c295c30 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/common/operations/GetSharesIT.java +++ b/library/src/androidTest/java/com/owncloud/android/lib/common/operations/GetSharesIT.java @@ -30,7 +30,7 @@ public class GetSharesIT extends AbstractIT { @Test public void testGetShares() { - assertTrue(new CreateFolderRemoteOperation("/1/", true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/1/", true).execute(nextcloudClient).isSuccess()); assertTrue(new CreateShareRemoteOperation("/1/", ShareType.PUBLIC_LINK, "", @@ -38,7 +38,7 @@ public void testGetShares() { "", 1).execute(client).isSuccess()); - assertTrue(new CreateFolderRemoteOperation("/2/", true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/2/", true).execute(nextcloudClient).isSuccess()); assertTrue(new CreateShareRemoteOperation("/2/", ShareType.PUBLIC_LINK, "", diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/e2ee/UpdateMetadataRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/e2ee/UpdateMetadataRemoteOperationIT.kt index 8b0f2271c..8eb1e4acd 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/e2ee/UpdateMetadataRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/e2ee/UpdateMetadataRemoteOperationIT.kt @@ -31,7 +31,7 @@ class UpdateMetadataRemoteOperationIT : AbstractIT() { // create folder val folder = "/" + make(20) + "/" - TestCase.assertTrue(CreateFolderRemoteOperation(folder, true).execute(client).isSuccess) + TestCase.assertTrue(CreateFolderRemoteOperation(folder, true).execute(nextcloudClient).isSuccess) val remoteFolder = ReadFileRemoteOperation(folder).execute(nextcloudClient).resultData TestCase.assertNotNull(remoteFolder) @@ -114,7 +114,7 @@ class UpdateMetadataRemoteOperationIT : AbstractIT() { // create folder val folder = "/" + make(20) + "/" - TestCase.assertTrue(CreateFolderRemoteOperation(folder, true).execute(client).isSuccess) + TestCase.assertTrue(CreateFolderRemoteOperation(folder, true).execute(nextcloudClient).isSuccess) val remoteFolder = ReadFileRemoteOperation(folder).execute(nextcloudClient).resultData TestCase.assertNotNull(remoteFolder) diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/ReadFileRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/ReadFileRemoteOperationIT.kt index bede2b35a..a19cebac2 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/ReadFileRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/ReadFileRemoteOperationIT.kt @@ -24,7 +24,7 @@ class ReadFileRemoteOperationIT : AbstractIT() { fun readRemoteFolder() { val remotePath = "/folder/" - assertTrue(CreateFolderRemoteOperation(remotePath, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient).isSuccess) // use ownCloud client for reference var result = ReadFileRemoteOperation(remotePath).execute(client) @@ -151,7 +151,7 @@ class ReadFileRemoteOperationIT : AbstractIT() { @Test fun readEncryptedState() { val remotePath = "/testEncryptedFolder/" - assertTrue(CreateFolderRemoteOperation(remotePath, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient).isSuccess) var result = ReadFileRemoteOperation(remotePath).execute(nextcloudClient) val remoteFile = result.resultData diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/ReadFolderRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/ReadFolderRemoteOperationIT.kt index d7823f736..7c3efadf3 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/ReadFolderRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/ReadFolderRemoteOperationIT.kt @@ -36,7 +36,7 @@ class ReadFolderRemoteOperationIT : AbstractIT() { fun readRemoteFolderWithContent() { val remotePath = "/test/" - assertTrue(CreateFolderRemoteOperation(remotePath, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(remotePath, true).execute(nextcloudClient).isSuccess) // create file val filePath = createFile("text") diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/SearchRemoteOperationIT.java b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/SearchRemoteOperationIT.java index 94577c8e9..a7f78e0a4 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/SearchRemoteOperationIT.java +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/SearchRemoteOperationIT.java @@ -55,7 +55,7 @@ public void testSearchByFileIdEmpty() { @Test public void testSearchByFileIdSuccess() { - assertTrue(new CreateFolderRemoteOperation("/test/", true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/test/", true).execute(nextcloudClient).isSuccess()); RemoteOperationResult readFile = new ReadFileRemoteOperation("/test/").execute(nextcloudClient); assertTrue(readFile.isSuccess()); @@ -146,7 +146,7 @@ public void oneFavorite() { String path = "/testFolder/"; // create folder, make it favorite - new CreateFolderRemoteOperation(path, true).execute(client); + new CreateFolderRemoteOperation(path, true).execute(nextcloudClient); assertTrue(new ToggleFavoriteRemoteOperation(true, path).execute(client).isSuccess()); SearchRemoteOperation sut = new SearchRemoteOperation("", @@ -448,7 +448,7 @@ public void showOnlyFolders() throws IOException { assertTrue(result.isSuccess()); assertEquals(1, result.getResultData().size()); - assertTrue(new CreateFolderRemoteOperation("/folder/", false).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/folder/", false).execute(nextcloudClient).isSuccess()); result = sut.execute(client); assertTrue(result.isSuccess()); diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/CreateShareRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/CreateShareRemoteOperationIT.kt index 0471536ed..fcf0658f3 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/CreateShareRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/CreateShareRemoteOperationIT.kt @@ -39,7 +39,7 @@ class CreateShareRemoteOperationIT : AbstractIT() { } private fun createFolder(path: String) { - assertTrue(CreateFolderRemoteOperation(path, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess) } private fun createShare( diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/GetSharesRemoteOperationIT.java b/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/GetSharesRemoteOperationIT.java index 4a7fc05c8..1a7aeac80 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/GetSharesRemoteOperationIT.java +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/GetSharesRemoteOperationIT.java @@ -37,12 +37,12 @@ public class GetSharesRemoteOperationIT extends AbstractIT { @Test public void searchSharedFiles() { - assertTrue(new CreateFolderRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess()); - assertTrue(new CreateFolderRemoteOperation("/shareToGroup/", true).execute(client).isSuccess()); - assertTrue(new CreateFolderRemoteOperation("/shareViaLink/", true).execute(client).isSuccess()); -// assertTrue(new CreateFolderRemoteOperation("/shareViaMail/", true).execute(client).isSuccess()); - assertTrue(new CreateFolderRemoteOperation("/noShare/", true).execute(client).isSuccess()); - //assertTrue(new CreateFolderRemoteOperation("/shareToCircle/", true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/shareToAdmin/", true).execute(nextcloudClient).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/shareToGroup/", true).execute(nextcloudClient).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/shareViaLink/", true).execute(nextcloudClient).isSuccess()); +// assertTrue(new CreateFolderRemoteOperation("/shareViaMail/", true).execute(nextcloudClient).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/noShare/", true).execute(nextcloudClient).isSuccess()); + //assertTrue(new CreateFolderRemoteOperation("/shareToCircle/", true).execute(nextcloudClient).isSuccess()); GetSharesRemoteOperation sut = new GetSharesRemoteOperation(); @@ -167,7 +167,7 @@ public void sharedWithMe() { // share folder to user "admin" - assertTrue(new CreateFolderRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/shareToAdmin/", true).execute(nextcloudClient).isSuccess()); assertTrue(new CreateShareRemoteOperation("/shareToAdmin/", ShareType.USER, "admin", @@ -217,7 +217,7 @@ public void favorites() { testOnlyOnServer(NextcloudVersion.nextcloud_25); // share folder to user "admin" - assertTrue(new CreateFolderRemoteOperation("/shareToAdminNoFavorite/", true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/shareToAdminNoFavorite/", true).execute(nextcloudClient).isSuccess()); RemoteOperationResult> createResult = new CreateShareRemoteOperation("/shareToAdminNoFavorite/", ShareType.USER, "admin", @@ -230,7 +230,7 @@ public void favorites() { assertTrue(createResult.isSuccess()); String path = "/shareToAdminFavorite/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // favorite it TestCase.assertTrue(new ToggleFavoriteRemoteOperation(true, path).execute(client).isSuccess()); @@ -259,7 +259,7 @@ public void noFavorite() { // only on NC25+ testOnlyOnServer(NextcloudVersion.nextcloud_25); - assertTrue(new CreateFolderRemoteOperation("/shareToAdminNoFavorite/", true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/shareToAdminNoFavorite/", true).execute(nextcloudClient).isSuccess()); // share folder to user "admin" RemoteOperationResult> createResult = new CreateShareRemoteOperation("/shareToAdminNoFavorite/", @@ -285,7 +285,7 @@ public void favorite() { assumeTrue(ocCapability.getVersion().isNewerOrEqual(NextcloudVersion.nextcloud_25)); String path = "/shareToAdminFavorite/"; - assertTrue(new CreateFolderRemoteOperation(path, true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation(path, true).execute(nextcloudClient).isSuccess()); // favorite it TestCase.assertTrue(new ToggleFavoriteRemoteOperation(true, path).execute(client).isSuccess()); diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/UpdateShareRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/UpdateShareRemoteOperationIT.kt index f5c3c0d76..0f0049416 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/UpdateShareRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/shares/UpdateShareRemoteOperationIT.kt @@ -44,7 +44,7 @@ class UpdateShareRemoteOperationIT : AbstractIT() { } private fun testUpdateNote(note: String) { - assertTrue(CreateFolderRemoteOperation("/note/", true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation("/note/", true).execute(nextcloudClient).isSuccess) // share folder to user "admin" val createOperationResult = @@ -82,7 +82,7 @@ class UpdateShareRemoteOperationIT : AbstractIT() { @Test fun updateMultipleParams() { - assertTrue(CreateFolderRemoteOperation("/label/", true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation("/label/", true).execute(nextcloudClient).isSuccess) val createOperationResult = CreateShareRemoteOperation( @@ -124,7 +124,7 @@ class UpdateShareRemoteOperationIT : AbstractIT() { @Test fun updateLabel() { val label = "test & test" - assertTrue(CreateFolderRemoteOperation("/label/", true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation("/label/", true).execute(nextcloudClient).isSuccess) // share folder via public link val createOperationResult = @@ -161,7 +161,7 @@ class UpdateShareRemoteOperationIT : AbstractIT() { @Suppress("MaxLineLength") fun invalidPassword() { val folder = "/invalidPassword/" - assertTrue(CreateFolderRemoteOperation(folder, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(folder, true).execute(nextcloudClient).isSuccess) // share folder via public link val createOperationResult = @@ -213,7 +213,7 @@ class UpdateShareRemoteOperationIT : AbstractIT() { @Test fun validPassword() { val folder = "/validPassword/" - assertTrue(CreateFolderRemoteOperation(folder, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(folder, true).execute(nextcloudClient).isSuccess) // share folder via public link val createOperationResult = diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperationIT.kt index ce3d15789..2df5a5137 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperationIT.kt @@ -28,7 +28,7 @@ class DeleteTagRemoteOperationIT : AbstractIT() { // create a folder val folder = "/deleteTagFolder/" - assertTrue(CreateFolderRemoteOperation(folder, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(folder, true).execute(nextcloudClient).isSuccess) val folderMetadata = ReadFileRemoteOperation(folder).execute(nextcloudClient) val fileId = folderMetadata.resultData.localId diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/GetTagsRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/GetTagsRemoteOperationIT.kt index e30d7f371..1ab5d5e34 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/GetTagsRemoteOperationIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/GetTagsRemoteOperationIT.kt @@ -106,7 +106,7 @@ class GetTagsRemoteOperationIT : AbstractIT() { // add colored tag to file val tagFolder = "/coloredFolder/" - assertTrue(CreateFolderRemoteOperation(tagFolder, true).execute(client).isSuccess) + assertTrue(CreateFolderRemoteOperation(tagFolder, true).execute(nextcloudClient).isSuccess) val folderMetadata = ReadFileRemoteOperation(tagFolder).execute(nextcloudClient) assertTrue( PutTagRemoteOperation( diff --git a/library/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/library/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index bf3824e76..bb95118c0 100644 --- a/library/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/library/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -57,6 +57,7 @@ import javax.net.ssl.SSLException; +import at.bitfire.dav4jvm.exception.ConflictException; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import okhttp3.Headers; @@ -315,6 +316,11 @@ public RemoteOperationResult(Exception e) { } else { mCode = ResultCode.CANNOT_CREATE_FILE; } + } else if (e instanceof ConflictException) { + mCode = RemoteOperationResult.ResultCode.CONFLICT; + } else if (e instanceof at.bitfire.dav4jvm.exception.HttpException && + HttpStatus.SC_METHOD_NOT_ALLOWED == ((at.bitfire.dav4jvm.exception.HttpException) e).getCode()) { + mCode = ResultCode.FOLDER_ALREADY_EXISTS; } else { mCode = ResultCode.UNKNOWN_ERROR; } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.java b/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.java deleted file mode 100644 index 820c09931..000000000 --- a/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Nextcloud Android Library - * - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-License-Identifier: MIT - */ -package com.owncloud.android.lib.resources.files; - -import android.text.TextUtils; - -import com.nextcloud.common.SessionTimeOut; -import com.nextcloud.common.SessionTimeOutKt; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; - -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.jackrabbit.webdav.client.methods.MkColMethod; - - -/** - * Remote operation performing the creation of a new folder in the ownCloud server. - * - * @author David A. Velasco - * @author masensio - */ -public class CreateFolderRemoteOperation extends RemoteOperation { - - private static final String TAG = CreateFolderRemoteOperation.class.getSimpleName(); - - - private final boolean createFullPath; - private final String remotePath; - private final String token; - private final SessionTimeOut sessionTimeOut; - - /** - * Constructor - * - * @param remotePath Full path to the new directory to create in the remote server. - * @param createFullPath 'True' means that all the ancestor folders should be created - * if don't exist yet. - */ - public CreateFolderRemoteOperation(String remotePath, boolean createFullPath) { - this(remotePath, createFullPath, SessionTimeOutKt.getDefaultSessionTimeOut()); - } - - public CreateFolderRemoteOperation(String remotePath, boolean createFullPath, String token) { - this(remotePath, createFullPath, token, SessionTimeOutKt.getDefaultSessionTimeOut()); - } - - public CreateFolderRemoteOperation(String remotePath, boolean createFullPath, SessionTimeOut sessionTimeOut) { - this(remotePath, createFullPath, "", sessionTimeOut); - } - - public CreateFolderRemoteOperation(String remotePath, boolean createFullPath, String token, SessionTimeOut sessionTimeOut) { - this.remotePath = remotePath; - this.createFullPath = createFullPath; - this.token = token; - this.sessionTimeOut = sessionTimeOut; - } - - /** - * Performs the operation - * - * @param client Client object to communicate with the remote ownCloud server. - */ - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - RemoteOperationResult result; - - result = createFolder(client); - if (!result.isSuccess() && createFullPath && - RemoteOperationResult.ResultCode.CONFLICT == result.getCode() && - !"/".equals(remotePath)) { // this must already exists - result = createParentFolder(FileUtils.getParentPath(remotePath), client); - if (result.isSuccess()) { - result = createFolder(client); // second (and last) try - } - } - - return result; - } - - - private RemoteOperationResult createFolder(OwnCloudClient client) { - RemoteOperationResult result; - MkColMethod mkCol = null; - try { - mkCol = new MkColMethod(client.getFilesDavUri(remotePath)); - - if (!TextUtils.isEmpty(token)) { - mkCol.addRequestHeader(E2E_TOKEN, token); - } - - client.executeMethod(mkCol, sessionTimeOut.getReadTimeOut(), sessionTimeOut.getConnectionTimeOut()); - - if (HttpStatus.SC_METHOD_NOT_ALLOWED == mkCol.getStatusCode()) { - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.FOLDER_ALREADY_EXISTS); - } else { - result = new RemoteOperationResult<>(mkCol.succeeded(), mkCol); - Header fileIdHeader = mkCol.getResponseHeader("OC-FileId"); - - if (fileIdHeader != null) { - String fileId = fileIdHeader.getValue(); - - result.setResultData(fileId); - } else { - result.setResultData(null); - } - } - - Log_OC.d(TAG, "Create directory " + remotePath + ": " + result.getLogMessage()); - client.exhaustResponse(mkCol.getResponseBodyAsStream()); - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Create directory " + remotePath + ": " + result.getLogMessage(), e); - - } finally { - if (mkCol != null) - mkCol.releaseConnection(); - } - return result; - } - - private RemoteOperationResult createParentFolder(String parentPath, OwnCloudClient client) { - RemoteOperation operation = new CreateFolderRemoteOperation(parentPath, createFullPath); - return operation.execute(client); - } -} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.kt new file mode 100644 index 000000000..112307c5e --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/files/CreateFolderRemoteOperation.kt @@ -0,0 +1,200 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2026 Your Name + * SPDX-License-Identifier: MIT + */ +package com.owncloud.android.lib.resources.files + +import android.text.TextUtils +import at.bitfire.dav4jvm.DavCollection +import com.nextcloud.common.NextcloudClient +import com.nextcloud.common.SessionTimeOut +import com.nextcloud.common.defaultSessionTimeOut +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import okhttp3.HttpUrl.Companion.toHttpUrl +import org.apache.commons.httpclient.HttpStatus +import org.apache.jackrabbit.webdav.client.methods.MkColMethod + +/** + * Remote operation performing the creation of a new folder in the ownCloud server. + * + * @author David A. Velasco + * @author masensio + */ +class CreateFolderRemoteOperation + @JvmOverloads + constructor( + private val remotePath: String, + private val createFullPath: Boolean, + private val token: String?, + private val sessionTimeOut: SessionTimeOut = defaultSessionTimeOut + ) : RemoteOperation() { + /** + * Constructor + * + * @param remotePath Full path to the new directory to create in the remote server. + * @param createFullPath 'True' means that all the ancestor folders should be created + * if don't exist yet. + */ + @JvmOverloads + constructor( + remotePath: String, + createFullPath: Boolean, + sessionTimeOut: SessionTimeOut = defaultSessionTimeOut + ) : this(remotePath, createFullPath, "", sessionTimeOut) + + /** + * Performs the operation + * + * @param client Client object to communicate with the remote ownCloud server. + */ + override fun run(client: OwnCloudClient): RemoteOperationResult { + var result: RemoteOperationResult + + result = createFolder(client) + if (!result.isSuccess && createFullPath && RemoteOperationResult.ResultCode.CONFLICT == result.code && + ("/" != remotePath) + ) { // this must already exists + result = createParentFolder(FileUtils.getParentPath(remotePath), client) + if (result.isSuccess) { + result = createFolder(client) // second (and last) try + } + } + + return result + } + + override fun run(client: NextcloudClient): RemoteOperationResult { + var result: RemoteOperationResult + + result = createFolder(client) + if (!result.isSuccess && createFullPath && RemoteOperationResult.ResultCode.CONFLICT == result.code && + ("/" != remotePath) + ) { // this must already exists + result = createParentFolder(FileUtils.getParentPath(remotePath), client) + if (result.isSuccess) { + result = createFolder(client) // second (and last) try + } + } + + return result + } + + private fun createFolder(client: OwnCloudClient): RemoteOperationResult { + var result: RemoteOperationResult + var mkCol: MkColMethod? = null + try { + mkCol = MkColMethod(client.getFilesDavUri(remotePath)) + + if (!TextUtils.isEmpty(token)) { + mkCol.addRequestHeader(E2E_TOKEN, token) + } + + client.executeMethod( + mkCol, + sessionTimeOut.readTimeOut, + sessionTimeOut.connectionTimeOut + ) + + if (HttpStatus.SC_METHOD_NOT_ALLOWED == mkCol.statusCode) { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.FOLDER_ALREADY_EXISTS) + } else { + result = RemoteOperationResult(mkCol.succeeded(), mkCol) + val fileIdHeader = mkCol.getResponseHeader("OC-FileId") + + if (fileIdHeader != null) { + val fileId = fileIdHeader.value + + result.resultData = fileId + } else { + result.resultData = null + } + } + + Log_OC.d(TAG, "Create directory " + remotePath + ": " + result.getLogMessage()) + client.exhaustResponse(mkCol.getResponseBodyAsStream()) + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Create directory " + remotePath + ": " + result.getLogMessage(), e) + } finally { + mkCol?.releaseConnection() + } + return result + } + + private fun createFolder(client: NextcloudClient): RemoteOperationResult { + var result: RemoteOperationResult = + RemoteOperationResult(RemoteOperationResult.ResultCode.UNKNOWN_ERROR) + try { + val location = client.getFilesDavUri(remotePath).toHttpUrl() + + val c = + if (TextUtils.isEmpty(token)) { + client.disabledRedirectClient() + } else { + client + .disabledRedirectClient() + .newBuilder() + .addNetworkInterceptor { chain -> + chain.proceed( + chain + .request() + .newBuilder() + .header(E2E_TOKEN, token!!) + .build() + ) + }.build() + } + + val davCollection = DavCollection(c, location) + + davCollection.mkCol(null) { response -> + if (response.isSuccessful) { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.OK) + val fileIdHeader = response.header("OC-FileId", "") + + if (fileIdHeader != "") { + result.resultData = fileIdHeader + } else { + result.resultData = null + } + } else if (response.code == HttpStatus.SC_METHOD_NOT_ALLOWED) { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.FOLDER_ALREADY_EXISTS) + } else { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.UNKNOWN_ERROR) + } + + Log_OC.d(TAG, "Create directory " + remotePath + ": " + result.getLogMessage()) + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Create directory " + remotePath + ": " + result.getLogMessage(), e) + } + + return result + } + + private fun createParentFolder( + parentPath: String, + client: OwnCloudClient + ): RemoteOperationResult { + val operation: RemoteOperation = CreateFolderRemoteOperation(parentPath, createFullPath) + return operation.execute(client) + } + + private fun createParentFolder( + parentPath: String, + client: NextcloudClient + ): RemoteOperationResult { + val operation: RemoteOperation = CreateFolderRemoteOperation(parentPath, createFullPath) + return operation.execute(client) + } + + companion object { + private val TAG: String = CreateFolderRemoteOperation::class.java.getSimpleName() + } + } diff --git a/library/src/test/java/com/nextcloud/common/NextcloudClientTest.kt b/library/src/test/java/com/nextcloud/common/NextcloudClientTest.kt index 3acb691cc..1de00c2e6 100644 --- a/library/src/test/java/com/nextcloud/common/NextcloudClientTest.kt +++ b/library/src/test/java/com/nextcloud/common/NextcloudClientTest.kt @@ -55,7 +55,7 @@ class NextcloudClientTest { val exception = RuntimeException("test exception") val operation = object : RemoteOperation() { - override suspend fun run(client: NextcloudClient?): RemoteOperationResult = throw exception + override fun run(client: NextcloudClient?): RemoteOperationResult = throw exception } // WHEN