Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[stable-3.30] Nmc/1901 Conflict dialog #291

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
/*
*
* Nextcloud Android client application
*
* @author Tobias Kaminsky
* Copyright (C) 2020 Tobias Kaminsky
* Copyright (C) 2020 Nextcloud GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.nmc.android.ui.conflict

import android.content.Intent
import androidx.test.espresso.Espresso
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.intent.rule.IntentsTestRule
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.platform.app.InstrumentationRegistry
import com.nextcloud.client.account.UserAccountManagerImpl
import com.nmc.android.ui.conflict.ConflictsResolveConsentDialog.Companion.newInstance
import com.owncloud.android.AbstractIT
import com.owncloud.android.R
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.db.OCUpload
import com.owncloud.android.ui.activity.ConflictsResolveActivity
import com.owncloud.android.ui.activity.FileActivity
import com.owncloud.android.ui.dialog.ConflictsResolveDialog.Decision
import com.owncloud.android.ui.dialog.ConflictsResolveDialog.OnConflictDecisionMadeListener
import com.owncloud.android.utils.FileStorageUtils
import junit.framework.TestCase
import org.junit.After
import org.junit.Assert
import org.junit.Rule
import org.junit.Test

class ConflictsResolveConsentDialogIT : AbstractIT() {
@get:Rule
val activityRule = IntentsTestRule(ConflictsResolveActivity::class.java, true, false)

private var returnCode = false

@Test
fun replaceWithNewFile() {
returnCode = false

val newUpload = OCUpload(
FileStorageUtils.getSavePath(user.accountName) + "/nonEmpty.txt",
"/newFile.txt",
user.accountName
)

val existingFile = OCFile("/newFile.txt")
existingFile.fileLength = 1024000
existingFile.modificationTimestamp = 1582019340
existingFile.remoteId = "00000123abc"

val newFile = OCFile("/newFile.txt")
newFile.fileLength = 56000
newFile.modificationTimestamp = 1522019340
newFile.storagePath = FileStorageUtils.getSavePath(user.accountName) + "/nonEmpty.txt"

val storageManager = FileDataStorageManager(user, targetContext.contentResolver)
storageManager.saveNewFile(existingFile)

val intent = Intent(targetContext, ConflictsResolveActivity::class.java)
intent.putExtra(FileActivity.EXTRA_FILE, newFile)
intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile)
intent.putExtra(ConflictsResolveActivity.EXTRA_CONFLICT_UPLOAD_ID, newUpload.uploadId)
intent.putExtra(ConflictsResolveActivity.EXTRA_LAUNCHED_FROM_TEST, true)

val sut = activityRule.launchActivity(intent)

val dialog = newInstance(
existingFile,
newFile,
UserAccountManagerImpl
.fromContext(targetContext)
.user
)
dialog.showDialog(sut)

sut.listener = OnConflictDecisionMadeListener { decision: Decision? ->
Assert.assertEquals(decision, Decision.KEEP_LOCAL)
returnCode = true
}

InstrumentationRegistry.getInstrumentation().waitForIdleSync()

Espresso.onView(ViewMatchers.withId(R.id.replace_btn)).perform(ViewActions.click())

TestCase.assertTrue(returnCode)
}

@Test
fun keepBothFiles() {
returnCode = false

val newUpload = OCUpload(
FileStorageUtils.getSavePath(user.accountName) + "/nonEmpty.txt",
"/newFile.txt",
user.accountName
)

val existingFile = OCFile("/newFile.txt")
existingFile.fileLength = 1024000
existingFile.modificationTimestamp = 1582019340

val newFile = OCFile("/newFile.txt")
newFile.fileLength = 56000
newFile.modificationTimestamp = 1522019340
newFile.storagePath = FileStorageUtils.getSavePath(user.accountName) + "/nonEmpty.txt"

val storageManager = FileDataStorageManager(user, targetContext.contentResolver)
storageManager.saveNewFile(existingFile)

val intent = Intent(targetContext, ConflictsResolveActivity::class.java)
intent.putExtra(FileActivity.EXTRA_FILE, newFile)
intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile)
intent.putExtra(FileActivity.EXTRA_USER, user)
intent.putExtra(ConflictsResolveActivity.EXTRA_CONFLICT_UPLOAD_ID, newUpload.uploadId)
intent.putExtra(ConflictsResolveActivity.EXTRA_LAUNCHED_FROM_TEST, true)

val sut = activityRule.launchActivity(intent)

val dialog = newInstance(
existingFile,
newFile,
UserAccountManagerImpl
.fromContext(targetContext)
.user
)
dialog.showDialog(sut)

sut.listener = OnConflictDecisionMadeListener { decision: Decision? ->
Assert.assertEquals(decision, Decision.KEEP_BOTH)
returnCode = true
}

InstrumentationRegistry.getInstrumentation().waitForIdleSync()

Espresso.onView(ViewMatchers.withId(R.id.keep_both_btn)).perform(ViewActions.click())

TestCase.assertTrue(returnCode)
}

@Test
fun keepExistingFile() {
returnCode = false

val newUpload = OCUpload(
FileStorageUtils.getSavePath(user.accountName) + "/nonEmpty.txt",
"/newFile.txt",
user.accountName
)

val existingFile = OCFile("/newFile.txt")
existingFile.fileLength = 1024000
existingFile.modificationTimestamp = 1582019340

val newFile = OCFile("/newFile.txt")
newFile.fileLength = 56000
newFile.modificationTimestamp = 1522019340
newFile.storagePath = FileStorageUtils.getSavePath(user.accountName) + "/nonEmpty.txt"

val storageManager = FileDataStorageManager(user, targetContext.contentResolver)
storageManager.saveNewFile(existingFile)

val intent = Intent(targetContext, ConflictsResolveActivity::class.java)
intent.putExtra(FileActivity.EXTRA_FILE, newFile)
intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile)
intent.putExtra(FileActivity.EXTRA_USER, user)
intent.putExtra(ConflictsResolveActivity.EXTRA_CONFLICT_UPLOAD_ID, newUpload.uploadId)
intent.putExtra(ConflictsResolveActivity.EXTRA_LAUNCHED_FROM_TEST, true)

val sut = activityRule.launchActivity(intent)

val dialog = newInstance(
existingFile,
newFile,
UserAccountManagerImpl
.fromContext(targetContext)
.user
)
dialog.showDialog(sut)

sut.listener = OnConflictDecisionMadeListener { decision: Decision? ->
Assert.assertEquals(decision, Decision.KEEP_SERVER)
returnCode = true
}

InstrumentationRegistry.getInstrumentation().waitForIdleSync()

Espresso.onView(ViewMatchers.withId(R.id.cancel_keep_existing_btn)).perform(ViewActions.click())

TestCase.assertTrue(returnCode)
}

@After
override fun after() {
storageManager.deleteAllFiles()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.nextcloud.ui.SetStatusDialogFragment;
import com.nextcloud.ui.composeActivity.ComposeActivity;
import com.nextcloud.ui.fileactions.FileActionsBottomSheet;
import com.nmc.android.ui.conflict.ConflictsResolveConsentDialog;
import com.nmc.android.ui.LauncherActivity;
import com.owncloud.android.MainApp;
import com.owncloud.android.authentication.AuthenticatorActivity;
Expand Down Expand Up @@ -367,6 +368,9 @@ abstract class ComponentsModule {
@ContributesAndroidInjector
abstract ConflictsResolveDialog conflictsResolveDialog();

@ContributesAndroidInjector
abstract ConflictsResolveConsentDialog conflictsResolveConsentDialog();

@ContributesAndroidInjector
abstract CreateFolderDialogFragment createFolderDialogFragment();

Expand Down
Loading