Skip to content
Merged
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
Expand Up @@ -6,7 +6,7 @@
*/

package com.nextcloud.extensions
import com.nextcloud.utils.extensions.isNotBlankAndEquals
import com.nextcloud.utils.extensions.eTagChanged
import junit.framework.TestCase.assertFalse
import junit.framework.TestCase.assertTrue
import org.junit.Test
Expand All @@ -17,160 +17,160 @@ class StringExtensionTests {
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreNull() {
val str1: String? = null
val str2: String? = null
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenFirstStringIsNull() {
val str1: String? = null
val str2 = "hello"
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenSecondStringIsNull() {
val str1 = "hello"
val str2: String? = null
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreEmpty() {
val str1 = ""
val str2 = ""
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenFirstStringIsEmpty() {
val str1 = ""
val str2 = "hello"
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenSecondStringIsEmpty() {
val str1 = "hello"
val str2 = ""
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreWhitespaceOnly() {
val str1 = " "
val str2 = " \t "
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenFirstStringIsWhitespaceOnly() {
val str1 = " "
val str2 = "hello"
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenSecondStringIsWhitespaceOnly() {
val str1 = "hello"
val str2 = " "
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenStringsAreDifferentButBothValid() {
val str1 = "hello"
val str2 = "world"
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenStringsHaveDifferentCase() {
val str1 = "Hello"
val str2 = "hello"
assertTrue(str1.isNotBlankAndEquals(str2))
assertFalse(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenMixedCaseStrings() {
val str1 = "HeLLo WoRLd"
val str2 = "hello world"
assertTrue(str1.isNotBlankAndEquals(str2))
assertFalse(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenUppercaseStrings() {
val str1 = "HELLO"
val str2 = "hello"
assertTrue(str1.isNotBlankAndEquals(str2))
assertFalse(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreIdenticalAndValid() {
val str1 = "hello"
val str2 = "hello"
assertTrue(str1.isNotBlankAndEquals(str2))
assertFalse(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreIdenticalWithSpaces() {
val str1 = "hello world"
val str2 = "hello world"
assertTrue(str1.isNotBlankAndEquals(str2))
assertFalse(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreIdenticalSingleCharacter() {
val str1 = "a"
val str2 = "A"
assertTrue(str1.isNotBlankAndEquals(str2))
assertFalse(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreIdenticalWithSpecialCharacters() {
val str1 = "hello@world!123"
val str2 = "HELLO@WORLD!123"
assertTrue(str1.isNotBlankAndEquals(str2))
assertFalse(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenOneHasLeadingWhitespaceAndOtherDoesNot() {
val str1 = " hello"
val str2 = "HELLO"
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenOneHasTrailingWhitespaceAndOtherDoesNot() {
val str1 = "hello"
val str2 = "HELLO "
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenBothHaveIdenticalWhitespacePaddingDifferentCase() {
val str1 = " hello "
val str2 = " HELLO "
assertTrue(str1.isNotBlankAndEquals(str2))
assertFalse(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenMixedWhitespaceCharacters() {
val str1 = "\t"
val str2 = "\n"
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenOneIsNullAndOtherIsEmpty() {
val str1: String? = null
val str2 = ""
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}

@Test
fun testIsNotBlankAndEqualsWhenGivenOneIsNullAndOtherIsWhitespace() {
val str1: String? = null
val str2 = " "
assertFalse(str1.isNotBlankAndEquals(str2))
assertTrue(str1.eTagChanged(str2))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,15 @@ fun String.removeFileExtension(): String {
}
}

/**
* Checks if two nullable strings are both valid (non-null, non-empty, non-blank) and equal.
*
* It returns `true` only when both strings meet all the following criteria:
* - Neither string is null
* - Neither string is empty ("")
* - Neither string contains only whitespace characters (spaces, tabs, newlines, etc.)
* - Both strings are equal ignoring case differences
*
* @param other The other nullable string to compare with this string
* @return `true` if both strings are valid and equal ignoring case differences, `false` otherwise
*/
fun String?.isNotBlankAndEquals(other: String?): Boolean = this != null &&
other != null &&
this.isNotBlank() &&
other.isNotBlank() &&
this.equals(other, ignoreCase = true)
@Suppress("ComplexCondition")
fun String?.eTagChanged(eTagOnServer: String?): Boolean {
if (this == null || this.isEmpty() || eTagOnServer == null || eTagOnServer.isEmpty()) {
// provided eTags are empty or null can't compare treat as eTag changed
return true
}

return !this.equals(eTagOnServer, ignoreCase = true)
}

fun String.truncateWithEllipsis(limit: Int) = take(limit) + if (length > limit) StringConstants.THREE_DOT else ""

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -796,7 +796,7 @@ public String getEtagOnServer() {
}

public boolean isEtagChanged() {
return !StringExtensionsKt.isNotBlankAndEquals(getEtag(), getEtagOnServer());
return StringExtensionsKt.eTagChanged(getEtag(), getEtagOnServer());
}

public boolean isSharedViaLink() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ private RemoteOperationResult checkForChanges(OwnCloudClient client) {
String remoteFolderETag = remoteFile.getEtag();
if (remoteFolderETag != null) {
String localFolderEtag = mLocalFolder.getEtag();
mRemoteFolderChanged = !StringExtensionsKt.isNotBlankAndEquals(remoteFolderETag, localFolderEtag);
mRemoteFolderChanged = StringExtensionsKt.eTagChanged(remoteFolderETag, localFolderEtag);
Log_OC.d(
TAG,
"📂 eTag check\n" +
Expand Down
Loading