Skip to content
Open
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 @@ -73,7 +73,7 @@ class UploadWorker(
lateinit var uploadClient: UploadClient

@Inject
lateinit var mediaClient: MediaClient
internal lateinit var mediaClient: MediaClient

@Inject
lateinit var fileUtilsWrapper: FileUtilsWrapper
Expand Down Expand Up @@ -562,7 +562,7 @@ class UploadWorker(
}
}

private fun findUniqueFileName(fileName: String): String {
internal fun findUniqueFileName(fileName: String): String {
var sequenceFileName: String? = fileName
val random = Random()

Expand All @@ -575,22 +575,22 @@ class UploadWorker(
),
).blockingGet()) {

// Generate a random 5-character alphanumeric string
val randomHash = (random.nextInt(90000) + 10000).toString()
// Generate a random 3-character alphanumeric string
val randomHash = (random.nextInt(900) + 100).toString()

sequenceFileName =
if (fileName.indexOf('.') == -1) {
// Append the random hash in parentheses if no file extension is present
"$fileName ($randomHash)"
"$fileName #$randomHash"
} else {
val regex =
Pattern.compile("^(.*)(\\..+?)$")
val regexMatcher = regex.matcher(fileName)
// Append the random hash in parentheses before the file extension
if (regexMatcher.find()) {
"${regexMatcher.group(1)} ($randomHash)${regexMatcher.group(2)}"
"${regexMatcher.group(1)} #$randomHash${regexMatcher.group(2)}"
} else {
"$fileName ($randomHash)"
"$fileName #$randomHash"
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import com.nhaarman.mockitokotlin2.*
import fr.free.nrw.commons.media.MediaClient
import io.reactivex.Single
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import fr.free.nrw.commons.upload.worker.UploadWorker

class UploadWorkerTest {

@Mock
lateinit var mediaClient: MediaClient

@Mock
lateinit var context: android.content.Context

private lateinit var uploadWorker: UploadWorker

@Before
fun setUp() {
MockitoAnnotations.openMocks(this)
uploadWorker = mock<UploadWorker>()
uploadWorker.mediaClient = mediaClient
whenever(uploadWorker.mediaClient).thenReturn(mediaClient)
whenever(uploadWorker.findUniqueFileName(any())).thenCallRealMethod()
}

@Test
fun `findUniqueFileName returns original when file does not exist`() {
val fileName = "test_image.jpg"
whenever(mediaClient.checkPageExistsUsingTitle("File:$fileName"))
.thenReturn(Single.just(false))

val result = uploadWorker.findUniqueFileName(fileName)

assertEquals(fileName, result)
}

@Test
fun `findUniqueFileName appends hash when file exists`() {
val fileName = "test_image.jpg"
//mockking: first check exists, second check unique
whenever(mediaClient.checkPageExistsUsingTitle(any()))
.thenReturn(Single.just(true))
.thenReturn(Single.just(false))

val result = uploadWorker.findUniqueFileName(fileName)

//verify it follows the #XXX pattern
val regex = Regex("test_image #\\d{3}\\.jpg")
assert(result.matches(regex))
}

@Test
fun `findUniqueFileName handles files without extensions`() {
val fileName = "no_extension"
whenever(mediaClient.checkPageExistsUsingTitle(any()))
.thenReturn(Single.just(true))
.thenReturn(Single.just(false))

val result = uploadWorker.findUniqueFileName(fileName)

val regex = Regex("no_extension #\\d{3}")
assert(result.matches(regex))
}
}