Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 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,31 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2025 Philipp Hasper <vcs@hasper.info>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.nextcloud.test

import android.view.View
import android.widget.TextView
import org.hamcrest.Description
import org.hamcrest.Matcher
import org.hamcrest.TypeSafeMatcher

fun withSelectedText(expected: String): Matcher<View> = object : TypeSafeMatcher<View>() {
override fun describeTo(description: Description) {
description.appendText("with selected text \"$expected\"")
}

@Suppress("ReturnCount")
override fun matchesSafely(view: View): Boolean {
if (view !is TextView) return false
val text = view.text?.toString() ?: ""
val s = view.selectionStart
val e = view.selectionEnd
@Suppress("ComplexCondition")
if (s < 0 || e < 0 || s > e || e > text.length) return false
return text.substring(s, e) == expected
}
}
116 changes: 116 additions & 0 deletions app/src/androidTest/java/com/nextcloud/utils/FileExtensionTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.nextcloud.utils

import com.nextcloud.utils.fileNameValidator.FileNameValidator.isExtensionChanged
import junit.framework.TestCase.assertFalse
import junit.framework.TestCase.assertTrue
import org.junit.Test

class FileExtensionTest {

@Test
fun sameExtensionReturnsFalse() {
assertFalse(isExtensionChanged("file.txt", "other.txt"))
}

@Test
fun differentExtensionReturnsTrue() {
assertTrue(isExtensionChanged("file.txt", "file.pdf"))
}

@Test
fun caseDifferenceDoesNotTriggerChange() {
assertFalse(isExtensionChanged("file.JPG", "file.jpg"))
}

@Test
fun bothWithoutExtensionReturnsFalse() {
assertFalse(isExtensionChanged("README", "LICENSE"))
}

@Test
fun noExtensionToExtensionReturnsTrue() {
assertTrue(isExtensionChanged("README", "file.txt"))
}

@Test
fun extensionToNoExtensionReturnsTrue() {
assertTrue(isExtensionChanged("file.txt", "README"))
}

@Test
fun hiddenFilesWithoutExtensionReturnFalse() {
assertFalse(isExtensionChanged(".gitignore", ".env"))
}

@Test
fun hiddenFileToNormalExtensionReturnsTrue() {
assertTrue(isExtensionChanged(".gitignore", "file.txt"))
}

@Test
fun multipleDotsSameLastExtensionReturnsFalse() {
assertFalse(isExtensionChanged("archive.tar.gz", "backup.gz"))
}

@Test
fun multipleDotsDifferentLastExtensionReturnsTrue() {
assertTrue(isExtensionChanged("archive.tar.gz", "archive.tar.zip"))
}

@Test
fun trailingDotTreatedAsNoExtensionReturnsTrue() {
assertTrue(isExtensionChanged("file.", "file.txt"))
}

@Test
fun bothTrailingDotReturnFalse() {
assertFalse(isExtensionChanged("file.", "another."))
}

@Test
fun emptyStringsReturnFalse() {
assertFalse(isExtensionChanged("", ""))
}

@Test
fun emptyStringToExtensionReturnsTrue() {
assertTrue(isExtensionChanged("", "file.txt"))
}

@Test
fun bothNullReturnFalse() {
assertFalse(isExtensionChanged(null, null))
}

@Test
fun previousNullNewNotNullReturnsTrue() {
assertTrue(isExtensionChanged(null, "file.txt"))
}

@Test
fun previousNotNullNewNullReturnsTrue() {
assertTrue(isExtensionChanged("file.txt", null))
}

@Test
fun singleDotFilenameReturnsFalse() {
assertFalse(isExtensionChanged(".", "."))
}

@Test
fun dotToExtensionReturnsTrue() {
assertTrue(isExtensionChanged(".", "file.txt"))
}

@Test
fun filenamesEndingWithDotReturnFalse() {
assertFalse(isExtensionChanged("test.", "another."))
}
}
12 changes: 8 additions & 4 deletions app/src/androidTest/java/com/owncloud/android/AbstractIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,9 @@
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
Expand Down Expand Up @@ -233,17 +235,19 @@ protected Account[] getAllAccounts() {
return AccountManager.get(targetContext).getAccounts();
}

protected static void createDummyFiles() throws IOException {
protected static List<File> createDummyFiles() throws IOException {
File tempPath = new File(FileStorageUtils.getTemporalPath(account.name));
if (!tempPath.exists()) {
assertTrue(tempPath.mkdirs());
}

assertTrue(tempPath.exists());

createFile("empty.txt", 0);
createFile("nonEmpty.txt", 100);
createFile("chunkedFile.txt", 500000);
return Arrays.asList(
createFile("empty.txt", 0),
createFile("nonEmpty.txt", 100),
createFile("chunkedFile.txt", 500000)
);
}

protected static File getDummyFile(String name) throws IOException {
Expand Down
Loading
Loading