diff --git a/app/src/test/kotlin/fr/free/nrw/commons/filepicker/FilePickerTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/filepicker/FilePickerTest.kt index ae841cd1c..9b84f2582 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/filepicker/FilePickerTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/filepicker/FilePickerTest.kt @@ -2,35 +2,57 @@ package fr.free.nrw.commons.filepicker import android.app.Activity import android.app.Application +import android.content.Context +import android.content.Intent import android.content.SharedPreferences +import android.net.Uri import androidx.preference.PreferenceManager import com.nhaarman.mockitokotlin2.verify -import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions +import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.filepicker.Constants.RequestCodes -import fr.free.nrw.commons.filepicker.FilePicker.handleActivityResult import junit.framework.Assert.assertEquals import org.junit.Before import org.junit.Test +import org.junit.runner.RunWith import org.mockito.* import org.mockito.Mockito.`when` import org.mockito.Mockito.mock +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import java.lang.reflect.Method +@RunWith(RobolectricTestRunner::class) +@Config( + sdk = [21], + application = TestCommonsApplication::class, + shadows = [ShadowFileProvider::class] +) +@LooperMode(LooperMode.Mode.PAUSED) class FilePickerTest { + @Mock internal lateinit var activity: Activity + @Mock internal lateinit var sharedPref: SharedPreferences + @Mock var sharedPreferencesEditor: SharedPreferences.Editor? = null + @Mock var unit: Unit? = null @Captor var requestCodeCaptor: ArgumentCaptor? = null + private lateinit var context: Context + @Before fun setup() { MockitoAnnotations.initMocks(this) + context = RuntimeEnvironment.application.applicationContext } @Test @@ -39,7 +61,10 @@ class FilePickerTest { `when`(sharedPref.edit()).thenReturn(sharedPreferencesEditor) `when`(sharedPref.edit().putInt("type", 0)).thenReturn(sharedPreferencesEditor) FilePicker.openGallery(activity, 0) - verify(activity).startActivityForResult(ArgumentMatchers.anyObject(), requestCodeCaptor?.capture()?.toInt()!!) + verify(activity).startActivityForResult( + ArgumentMatchers.anyObject(), + requestCodeCaptor?.capture()?.toInt()!! + ) assertEquals(requestCodeCaptor?.value, RequestCodes.PICK_PICTURE_FROM_GALLERY) } @@ -51,10 +76,150 @@ class FilePickerTest { val mockApplication = mock(Application::class.java) `when`(activity.applicationContext).thenReturn(mockApplication) FilePicker.openCameraForImage(activity, 0) - verify(activity).startActivityForResult(ArgumentMatchers.anyObject(), requestCodeCaptor?.capture()?.toInt()!!) + verify(activity).startActivityForResult( + ArgumentMatchers.anyObject(), + requestCodeCaptor?.capture()?.toInt()!! + ) assertEquals(requestCodeCaptor?.value, RequestCodes.TAKE_PICTURE) } + @Test + fun testCreateCameraPictureFile() { + val mockFilePicker = mock(FilePicker::class.java) + val method: Method = FilePicker::class.java.getDeclaredMethod( + "createCameraPictureFile", + Context::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, context) + } + + @Test + fun testCreateCameraForImageIntent() { + val mockFilePicker = mock(FilePicker::class.java) + val method: Method = FilePicker::class.java.getDeclaredMethod( + "createCameraForImageIntent", + Context::class.java, + Int::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, context, 0) + } + + @Test + fun testRevokeWritePermission() { + val mockFilePicker = mock(FilePicker::class.java) + val mockUri = mock(Uri::class.java) + val mockContext = mock(Context::class.java) + val method: Method = FilePicker::class.java.getDeclaredMethod( + "revokeWritePermission", + Context::class.java, + Uri::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, mockContext, mockUri) + } + + @Test + fun testRestoreType() { + val mockFilePicker = mock(FilePicker::class.java) + val method: Method = FilePicker::class.java.getDeclaredMethod( + "restoreType", + Context::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, context) + } + + @Test + fun testTakenCameraPicture() { + val mockFilePicker = mock(FilePicker::class.java) + val method: Method = FilePicker::class.java.getDeclaredMethod( + "takenCameraPicture", + Context::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, context) + } + + @Test + fun testTakenCameraPictureCaseTrue() { + val mockFilePicker = mock(FilePicker::class.java) + `when`(PreferenceManager.getDefaultSharedPreferences(activity)).thenReturn(sharedPref) + `when`(sharedPref.getString("last_photo", null)).thenReturn("") + val method: Method = FilePicker::class.java.getDeclaredMethod( + "takenCameraPicture", + Context::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, activity) + } + + @Test + fun testTakenCameraVideo() { + val mockFilePicker = mock(FilePicker::class.java) + val method: Method = FilePicker::class.java.getDeclaredMethod( + "takenCameraVideo", + Context::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, context) + } + + @Test + fun testTakenCameraVideoCaseTrue() { + val mockFilePicker = mock(FilePicker::class.java) + `when`(PreferenceManager.getDefaultSharedPreferences(activity)).thenReturn(sharedPref) + `when`(sharedPref.getString("last_video", null)).thenReturn("") + val method: Method = FilePicker::class.java.getDeclaredMethod( + "takenCameraVideo", + Context::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, activity) + } + + @Test + fun testIsPhoto() { + val mockFilePicker = mock(FilePicker::class.java) + val mockIntent = mock(Intent::class.java) + val method: Method = FilePicker::class.java.getDeclaredMethod( + "isPhoto", + Intent::class.java + ) + method.isAccessible = true + method.invoke(mockFilePicker, mockIntent) + } + + @Test + fun testHandleActivityResultCaseOne() { + val mockIntent = mock(Intent::class.java) + FilePicker.handleActivityResult( + RequestCodes.FILE_PICKER_IMAGE_IDENTIFICATOR, + Activity.RESULT_OK, + mockIntent, + activity, + object : DefaultCallback() { + override fun onCanceled(source: FilePicker.ImageSource, type: Int) { + super.onCanceled(source, type) + } + + override fun onImagePickerError( + e: Exception, + source: FilePicker.ImageSource, + type: Int + ) { + } + + override fun onImagesPicked( + imagesFiles: List, + source: FilePicker.ImageSource, + type: Int + ) { + } + }) + } + @Test fun testOpenCustomSelectorRequestCode() { `when`(PreferenceManager.getDefaultSharedPreferences(activity)).thenReturn(sharedPref) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/filepicker/ShadowFileProvider.java b/app/src/test/kotlin/fr/free/nrw/commons/filepicker/ShadowFileProvider.java new file mode 100644 index 000000000..4da9e2690 --- /dev/null +++ b/app/src/test/kotlin/fr/free/nrw/commons/filepicker/ShadowFileProvider.java @@ -0,0 +1,32 @@ +package fr.free.nrw.commons.filepicker; + +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; +import android.provider.OpenableColumns; +import androidx.core.content.FileProvider; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; + +@Implements(FileProvider.class) +public class ShadowFileProvider { + + @Implementation + public Cursor query(final Uri uri, final String[] projection, final String selection, + final String[] selectionArgs, + final String sortOrder) { + + if (uri == null) { + return null; + } + + final String[] columns = {OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE}; + final Object[] values = {"dummy", 500}; + final MatrixCursor cursor = new MatrixCursor(columns, 1); + + if (!uri.equals(Uri.EMPTY)) { + cursor.addRow(values); + } + return cursor; + } +} diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt index c7817f5d3..8620822f3 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt @@ -65,6 +65,9 @@ class UploadCategoriesFragmentUnitTests { @Mock private lateinit var tvTitle: TextView + @Mock + private lateinit var tvSubTitle: TextView + @Mock private lateinit var tooltip: ImageView @@ -104,6 +107,7 @@ class UploadCategoriesFragmentUnitTests { Whitebox.setInternalState(fragment, "rvCategories", rvCategories) Whitebox.setInternalState(fragment, "tvTitle", tvTitle) Whitebox.setInternalState(fragment, "tooltip", tooltip) + Whitebox.setInternalState(fragment, "tvSubTitle", tvSubTitle) } @Test