Convert upload to kotlin (part 3) (#6104)

* Convert UploadCategoriesFragment to kotlin

* Convert UploadBaseFragment to kotlin

* Convert UploadItem to kotlin

* Convert UploadModel to kotlin

* Convert UploadMediaDetailAdapter to kotlin

* Convert UploadActivity to kotlin

* Convert UploadMediaPresenter to kotlin

* Convert UploadMediaDetailFragment to kotlin

* Fix NPE that broke uploads
This commit is contained in:
Paul Hawke 2025-01-13 08:04:09 -06:00 committed by GitHub
parent 6d64357d45
commit 0e735512bb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
37 changed files with 3236 additions and 3564 deletions

View file

@ -13,8 +13,8 @@ import com.nhaarman.mockitokotlin2.verify
import fr.free.nrw.commons.CameraPosition
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_LOCATION
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Companion.LAST_LOCATION
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Companion.LAST_ZOOM
import io.reactivex.android.plugins.RxAndroidPlugins
import io.reactivex.schedulers.Schedulers
import org.junit.Assert

View file

@ -223,7 +223,7 @@ class SettingsFragmentUnitTests {
RecentLanguagesAdapter(
context,
listOf(Language("English", "en")),
hashMapOf<String, String>(),
mutableMapOf(),
),
)
val method: Method =

View file

@ -30,7 +30,7 @@ class LanguagesAdapterTest {
private lateinit var context: Context
@Mock
private lateinit var selectedLanguages: HashMap<Integer, String>
private lateinit var selectedLanguages: MutableMap<Int, String>
@Mock
private lateinit var parent: ViewGroup
@ -41,7 +41,7 @@ class LanguagesAdapterTest {
private lateinit var languagesAdapter: LanguagesAdapter
private lateinit var convertView: View
private var selectLanguages: HashMap<Integer, String> = HashMap()
private var selectLanguages: MutableMap<Int, String> = mutableMapOf()
@Before
@Throws(Exception::class)
@ -94,8 +94,8 @@ class LanguagesAdapterTest {
@Test
fun testSelectLanguageNotEmpty() {
selectLanguages[Integer(0)] = "es"
selectLanguages[Integer(1)] = "de"
selectLanguages[0] = "es"
selectLanguages[1] = "de"
languagesAdapter = LanguagesAdapter(context, selectLanguages)
Assertions.assertEquals(false, languagesAdapter.isEnabled(languagesAdapter.getIndexOfLanguageCode("es")))

View file

@ -246,7 +246,7 @@ class UploadMediaDetailAdapterUnitTest {
RecentLanguagesAdapter(
context,
listOf(Language("English", "en")),
hashMapOf<String, String>(),
mutableMapOf(),
),
)
val method: Method =

View file

@ -1,10 +1,12 @@
package fr.free.nrw.commons.upload
import android.net.Uri
import com.nhaarman.mockitokotlin2.argumentCaptor
import com.nhaarman.mockitokotlin2.isA
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.R
import fr.free.nrw.commons.filepicker.UploadableFile
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.location.LatLng
import fr.free.nrw.commons.nearby.Place
import fr.free.nrw.commons.repository.UploadRepository
@ -24,6 +26,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.MockedStatic
import org.mockito.Mockito
@ -55,7 +58,7 @@ class UploadMediaPresenterTest {
private lateinit var place: Place
@Mock
private var location: LatLng? = null
private lateinit var location: LatLng
@Mock
private lateinit var uploadItem: UploadItem
@ -63,18 +66,12 @@ class UploadMediaPresenterTest {
@Mock
private lateinit var imageCoordinates: ImageCoordinates
@Mock
private lateinit var uploadMediaDetails: List<UploadMediaDetail>
private lateinit var testObservableUploadItem: Observable<UploadItem>
private lateinit var testSingleImageResult: Single<Int>
private lateinit var testScheduler: TestScheduler
private lateinit var mockedCountry: MockedStatic<Coordinates2Country>
@Mock
private lateinit var jsonKvStore: JsonKvStore
@Mock
lateinit var mockActivity: UploadActivity
@ -91,7 +88,6 @@ class UploadMediaPresenterTest {
uploadMediaPresenter =
UploadMediaPresenter(
repository,
jsonKvStore,
testScheduler,
testScheduler,
)
@ -120,10 +116,7 @@ class UploadMediaPresenterTest {
uploadMediaPresenter.receiveImage(uploadableFile, place, location)
verify(view).showProgress(true)
testScheduler.triggerActions()
verify(view).onImageProcessed(
ArgumentMatchers.any(UploadItem::class.java),
ArgumentMatchers.any(Place::class.java),
)
verify(view).onImageProcessed(isA())
}
/**
@ -167,7 +160,7 @@ class UploadMediaPresenterTest {
@Test
fun emptyFileNameTest() {
uploadMediaPresenter.handleCaptionResult(EMPTY_CAPTION, uploadItem)
verify(view).showMessage(ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt())
verify(view).showMessage(R.string.add_caption_toast, R.color.color_error)
}
/**
@ -226,12 +219,11 @@ class UploadMediaPresenterTest {
@Test
fun fetchImageAndTitleTest() {
whenever(repository.getUploads()).thenReturn(listOf(uploadItem))
whenever(repository.getUploadItem(ArgumentMatchers.anyInt()))
.thenReturn(uploadItem)
whenever(repository.getUploadItem(ArgumentMatchers.anyInt())).thenReturn(uploadItem)
whenever(uploadItem.uploadMediaDetails).thenReturn(mutableListOf())
uploadMediaPresenter.fetchTitleAndDescription(0)
verify(view).updateMediaDetails(ArgumentMatchers.any())
verify(view).updateMediaDetails(isA())
}
/**
@ -273,12 +265,9 @@ class UploadMediaPresenterTest {
verify(view).showProgress(true)
testScheduler.triggerActions()
val captor: ArgumentCaptor<UploadItem> = ArgumentCaptor.forClass(UploadItem::class.java)
verify(view).onImageProcessed(
captor.capture(),
ArgumentMatchers.any(Place::class.java),
)
val captor = argumentCaptor<UploadItem>()
verify(view).onImageProcessed(captor.capture())
assertEquals("Exptected contry code", "de", captor.value.countryCode)
assertEquals("Exptected contry code", "de", captor.firstValue.countryCode)
}
}

View file

@ -140,6 +140,6 @@ class UploadModelUnitTest {
@Ignore
@Test
fun testSetSelectedExistingDepictions() {
uploadModel.selectedExistingDepictions = listOf("")
uploadModel.selectedExistingDepictions = mutableListOf("")
}
}

View file

@ -1,7 +1,9 @@
package fr.free.nrw.commons.upload
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.category.CategoriesModel
import fr.free.nrw.commons.category.CategoryItem
@ -17,6 +19,7 @@ import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
import io.reactivex.Completable
import io.reactivex.Observable
import io.reactivex.Single
import org.junit.Assert.assertSame
import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
@ -118,7 +121,9 @@ class UploadRepositoryUnitTest {
@Test
fun testGetUploads() {
assertEquals(repository.getUploads(), uploadModel.uploads)
val result = listOf(uploadItem)
whenever(uploadModel.uploads).thenReturn(result)
assertSame(result, repository.getUploads())
}
@Test
@ -136,10 +141,10 @@ class UploadRepositoryUnitTest {
@Test
fun testSearchAll() {
assertEquals(
repository.searchAll("", listOf(), listOf()),
categoriesModel.searchAll("", listOf(), listOf()),
)
val empty = Observable.empty<List<CategoryItem>>()
whenever(categoriesModel.searchAll(any(), any(), any())).thenReturn(empty)
assertSame(empty, repository.searchAll("", listOf(), listOf()))
}
@Test
@ -164,7 +169,9 @@ class UploadRepositoryUnitTest {
@Test
fun testGetLicenses() {
assertEquals(repository.getLicenses(), uploadModel.licenses)
whenever(uploadModel.licenses).thenReturn(listOf())
repository.getLicenses()
verify(uploadModel).licenses
}
@Test
@ -208,10 +215,10 @@ class UploadRepositoryUnitTest {
@Test
fun testGetUploadItemCaseNonNull() {
`when`(uploadModel.items).thenReturn(listOf(uploadItem))
`when`(uploadModel.items).thenReturn(mutableListOf(uploadItem))
assertEquals(
repository.getUploadItem(0),
uploadModel.items[0],
uploadItem,
)
}
@ -220,19 +227,6 @@ class UploadRepositoryUnitTest {
assertEquals(repository.getUploadItem(-1), null)
}
@Test
fun testSetSelectedLicense() {
assertEquals(repository.setSelectedLicense(""), uploadModel.setSelectedLicense(""))
}
@Test
fun testSetSelectedExistingDepictions() {
assertEquals(
repository.setSelectedExistingDepictions(listOf("")),
uploadModel.setSelectedExistingDepictions(listOf("")),
)
}
@Test
fun testOnDepictItemClicked() {
assertEquals(
@ -243,12 +237,14 @@ class UploadRepositoryUnitTest {
@Test
fun testGetSelectedDepictions() {
assertEquals(repository.getSelectedDepictions(), uploadModel.selectedDepictions)
repository.getSelectedDepictions()
verify(uploadModel).selectedDepictions
}
@Test
fun testGetSelectedExistingDepictions() {
assertEquals(repository.getSelectedExistingDepictions(), uploadModel.selectedExistingDepictions)
repository.getSelectedExistingDepictions()
verify(uploadModel).selectedExistingDepictions
}
@Test
@ -324,8 +320,8 @@ class UploadRepositoryUnitTest {
@Test
fun testIsWMLSupportedForThisPlace() {
`when`(uploadModel.items).thenReturn(listOf(uploadItem))
`when`(uploadItem.isWLMUpload).thenReturn(true)
whenever(uploadModel.items).thenReturn(mutableListOf(uploadItem))
whenever(uploadItem.isWLMUpload).thenReturn(true)
assertEquals(
repository.isWMLSupportedForThisPlace(),
true,

View file

@ -34,7 +34,7 @@ import fr.free.nrw.commons.upload.ImageCoordinates
import fr.free.nrw.commons.upload.UploadActivity
import fr.free.nrw.commons.upload.UploadItem
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Companion.LAST_ZOOM
import org.junit.Assert
import org.junit.Before
import org.junit.Test
@ -100,7 +100,7 @@ class UploadMediaDetailFragmentUnitTest {
private lateinit var place: Place
@Mock
private var location: fr.free.nrw.commons.location.LatLng? = null
private lateinit var location: LatLng
@Mock
private lateinit var defaultKvStore: JsonKvStore
@ -153,12 +153,6 @@ class UploadMediaDetailFragmentUnitTest {
Assert.assertNotNull(fragment)
}
@Test
@Throws(Exception::class)
fun testSetCallback() {
fragment.setCallback(null)
}
@Test
@Throws(Exception::class)
fun testOnCreate() {
@ -194,7 +188,7 @@ class UploadMediaDetailFragmentUnitTest {
Whitebox.setInternalState(fragment, "presenter", presenter)
val method: Method =
UploadMediaDetailFragment::class.java.getDeclaredMethod(
"init",
"initializeFragment",
)
method.isAccessible = true
method.invoke(fragment)
@ -209,7 +203,7 @@ class UploadMediaDetailFragmentUnitTest {
`when`(callback.totalNumberOfSteps).thenReturn(5)
val method: Method =
UploadMediaDetailFragment::class.java.getDeclaredMethod(
"init",
"initializeFragment",
)
method.isAccessible = true
method.invoke(fragment)
@ -229,22 +223,6 @@ class UploadMediaDetailFragmentUnitTest {
method.invoke(fragment, R.string.media_detail_step_title, R.string.media_details_tooltip)
}
@Test
@Throws(Exception::class)
fun testOnNextButtonClicked() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
Whitebox.setInternalState(fragment, "presenter", presenter)
fragment.onNextButtonClicked()
}
@Test
@Throws(Exception::class)
fun testOnPreviousButtonClicked() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
Whitebox.setInternalState(fragment, "presenter", presenter)
fragment.onPreviousButtonClicked()
}
@Test
@Throws(Exception::class)
fun testShowSimilarImageFragment() {
@ -258,7 +236,7 @@ class UploadMediaDetailFragmentUnitTest {
fun testOnImageProcessed() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(uploadItem.mediaUri).thenReturn(mediaUri)
fragment.onImageProcessed(uploadItem, place)
fragment.onImageProcessed(uploadItem)
}
@Test
@ -366,7 +344,10 @@ class UploadMediaDetailFragmentUnitTest {
`when`(uploadItem.gpsCoords).thenReturn(imageCoordinates)
val activityResult = ActivityResult(Activity.RESULT_OK, intent)
val handleResultMethod = UploadMediaDetailFragment::class.java.getDeclaredMethod("onCameraPosition", ActivityResult::class.java)
val handleResultMethod = UploadMediaDetailFragment::class.java.getDeclaredMethod(
"onCameraPosition",
ActivityResult::class.java
)
handleResultMethod.isAccessible = true
handleResultMethod.invoke(fragment, activityResult)
@ -382,7 +363,7 @@ class UploadMediaDetailFragmentUnitTest {
val cameraPosition = Mockito.mock(CameraPosition::class.java)
val latLng = Mockito.mock(LatLng::class.java)
Whitebox.setInternalState(fragment, "callback", callback)
Whitebox.setInternalState(fragment, "fragmentCallback", callback)
Whitebox.setInternalState(cameraPosition, "latitude", latLng.latitude)
Whitebox.setInternalState(cameraPosition, "longitude", latLng.longitude)
Whitebox.setInternalState(fragment, "editableUploadItem", uploadItem)
@ -394,9 +375,12 @@ class UploadMediaDetailFragmentUnitTest {
`when`(latLng.longitude).thenReturn(0.0)
`when`(uploadItem.gpsCoords).thenReturn(imageCoordinates)
val activityResult = ActivityResult(Activity.RESULT_OK,intent)
val activityResult = ActivityResult(Activity.RESULT_OK, intent)
val handleResultMethod = UploadMediaDetailFragment::class.java.getDeclaredMethod("onCameraPosition", ActivityResult::class.java)
val handleResultMethod = UploadMediaDetailFragment::class.java.getDeclaredMethod(
"onCameraPosition",
ActivityResult::class.java
)
handleResultMethod.isAccessible = true
handleResultMethod.invoke(fragment, activityResult)
@ -407,7 +391,7 @@ class UploadMediaDetailFragmentUnitTest {
@Throws(Exception::class)
fun testUpdateMediaDetails() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
fragment.updateMediaDetails(null)
fragment.updateMediaDetails(mock())
}
@Test
@ -417,21 +401,6 @@ class UploadMediaDetailFragmentUnitTest {
fragment.onDestroyView()
}
@Test
@Throws(Exception::class)
fun testOnLlContainerTitleClicked() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
fragment.onLlContainerTitleClicked()
}
@Test
@Throws(Exception::class)
fun testOnIbMapClicked() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
Whitebox.setInternalState(fragment, "presenter", presenter)
fragment.onIbMapClicked()
}
@Test
@Throws(Exception::class)
fun testOnPrimaryCaptionTextChange() {