From ea29a726a179f87bba10ec54e5ba6fb23f7a2429 Mon Sep 17 00:00:00 2001 From: Aditya-Srivastav <54016427+4D17Y4@users.noreply.github.com> Date: Tue, 10 Aug 2021 07:31:15 +0530 Subject: [PATCH] Tests updated (#4538) --- .../ui/adapter/FolderAdapter.kt | 2 +- .../customselector/ui/adapter/ImageAdapter.kt | 2 +- .../ui/selector/ImageFragment.kt | 3 +- .../ui/adapter/FolderAdapterTest.kt | 22 +++++++++++-- .../ui/adapter/ImageAdapterTest.kt | 28 ++++++++++++++-- .../ui/selector/CustomSelectorActivityTest.kt | 25 +++++++++++++- .../ui/selector/FolderFragmentTest.kt | 11 +++++++ .../ui/selector/ImageFragmentTest.kt | 33 ++++++++++++++++++- 8 files changed, 116 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapter.kt index 93759bdf4..03790a7d8 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapter.kt @@ -69,7 +69,7 @@ class FolderAdapter( } } else { val previewImage = folder.images[0] - Glide.with(context).load(previewImage.uri).into(holder.image) + Glide.with(holder.image).load(previewImage.uri).into(holder.image) holder.name.text = folder.name holder.count.text = count.toString() holder.itemView.setOnClickListener { diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index 8225ab2dc..2dd97f3e3 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -85,7 +85,7 @@ class ImageAdapter( } else { holder.itemUnselected(); } - Glide.with(context).load(image.uri).thumbnail(0.3f).into(holder.image) + Glide.with(holder.image).load(image.uri).thumbnail(0.3f).into(holder.image) imageLoader.queryAndSetView(holder, image) holder.itemView.setOnClickListener { selectOrRemoveImage(holder, position) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt index b575e015b..ef49f27e7 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt @@ -48,6 +48,7 @@ class ImageFragment: CommonsDaggerSupportFragment() { */ private var selectorRV: RecyclerView? = null private var loader: ProgressBar? = null + lateinit var filteredImages: ArrayList; /** * View model Factory. @@ -130,8 +131,6 @@ class ImageFragment: CommonsDaggerSupportFragment() { return root } - lateinit var filteredImages: ArrayList; - /** * Handle view model result. */ diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapterTest.kt index 6a6271b96..1c2a663f3 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapterTest.kt @@ -1,11 +1,14 @@ package fr.free.nrw.commons.customselector.ui.adapter +import android.content.ContentResolver import fr.free.nrw.commons.R import android.content.Context import android.net.Uri import android.view.LayoutInflater import android.view.View import android.widget.GridLayout +import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.whenever import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.customselector.listeners.FolderClickListener import fr.free.nrw.commons.customselector.model.Folder @@ -15,7 +18,10 @@ import org.junit.Before import org.junit.Test import org.junit.jupiter.api.Assertions.assertEquals import org.junit.runner.RunWith +import org.mockito.Mock import org.mockito.Mockito +import org.mockito.MockitoAnnotations +import org.powermock.reflect.Whitebox import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -34,13 +40,21 @@ class FolderAdapterTest { private lateinit var folder: Folder private lateinit var folderList: ArrayList + @Mock + private lateinit var context: Context + + @Mock + private lateinit var mockContentResolver: ContentResolver + @Before @Throws(Exception::class) fun setUp() { + MockitoAnnotations.initMocks(this) + activity = Robolectric.buildActivity(CustomSelectorActivity::class.java).get() image = Image(1, "image", uri, "abc/abc", 1, "bucket1") folder = Folder(1, "bucket1", ArrayList(listOf(image))) - folderList = ArrayList(listOf(folder)) + folderList = ArrayList(listOf(folder, folder, folder)) folderAdapter = FolderAdapter(activity, activity as FolderClickListener) } @@ -57,9 +71,13 @@ class FolderAdapterTest { */ @Test fun onBindViewHolder() { - folderAdapter.init(folderList) val inflater = activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val listItemView: View = inflater.inflate(R.layout.item_custom_selector_folder, null, false) + + whenever(context.contentResolver).thenReturn(mockContentResolver) + whenever(mockContentResolver.getType(any())).thenReturn("jpg") + Whitebox.setInternalState(folderAdapter, "context", context) + folderAdapter.init(folderList) folderAdapter.onBindViewHolder(FolderAdapter.FolderViewHolder(listItemView), 0) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapterTest.kt index 8de08a2d3..fac24cb32 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapterTest.kt @@ -1,9 +1,12 @@ package fr.free.nrw.commons.customselector.ui.adapter +import android.content.ContentResolver import android.content.Context +import android.net.Uri import android.view.LayoutInflater import android.view.View import android.widget.GridLayout +import com.nhaarman.mockitokotlin2.whenever import fr.free.nrw.commons.R import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.customselector.listeners.ImageSelectListener @@ -15,6 +18,7 @@ import org.junit.Test import org.junit.jupiter.api.Assertions import org.junit.runner.RunWith import org.mockito.* +import org.powermock.reflect.Whitebox import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -26,18 +30,23 @@ import java.lang.reflect.Field @RunWith(RobolectricTestRunner::class) @Config(sdk = [21], application = TestCommonsApplication::class) class ImageAdapterTest { - @Mock - private lateinit var image: Image @Mock private lateinit var imageLoader: ImageLoader @Mock private lateinit var imageSelectListener: ImageSelectListener + @Mock + private lateinit var context: Context + @Mock + private lateinit var mockContentResolver: ContentResolver private lateinit var activity: CustomSelectorActivity private lateinit var imageAdapter: ImageAdapter private lateinit var images : ArrayList private lateinit var holder: ImageAdapter.ImageViewHolder private lateinit var selectedImageField: Field + private var uri: Uri = Mockito.mock(Uri::class.java) + private lateinit var image: Image + /** * Set up variables. @@ -48,6 +57,7 @@ class ImageAdapterTest { MockitoAnnotations.initMocks(this) activity = Robolectric.buildActivity(CustomSelectorActivity::class.java).get() imageAdapter = ImageAdapter(activity, imageSelectListener, imageLoader) + image = Image(1, "image", uri, "abc/abc", 1, "bucket1") images = ArrayList() val inflater = activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater @@ -71,6 +81,11 @@ class ImageAdapterTest { */ @Test fun onBindViewHolder() { + + whenever(context.contentResolver).thenReturn(mockContentResolver) + whenever(mockContentResolver.getType(uri)).thenReturn("jpg") + Whitebox.setInternalState(imageAdapter, "context", context) + // Parameters. images.add(image) imageAdapter.init(images) @@ -118,4 +133,13 @@ class ImageAdapterTest { fun getItemCount() { Assertions.assertEquals(0, imageAdapter.itemCount) } + + /** + * Test getImageId + */ + @Test + fun getImageIdAt() { + imageAdapter.init(listOf(image)) + Assertions.assertEquals(1, imageAdapter.getImageIdAt(0)) + } } \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt index 6d55a49e2..21007daeb 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt @@ -2,7 +2,11 @@ package fr.free.nrw.commons.customselector.ui.selector import android.net.Uri import android.os.Bundle +import android.os.Looper +import android.os.Looper.getMainLooper +import fr.free.nrw.commons.TestAppAdapter import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.contributions.MainActivity import fr.free.nrw.commons.customselector.model.Folder import fr.free.nrw.commons.customselector.model.Image import org.junit.Before @@ -12,7 +16,11 @@ import org.junit.runner.RunWith import org.mockito.MockitoAnnotations import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner +import org.robolectric.Shadows +import org.robolectric.Shadows.shadowOf import org.robolectric.annotation.Config +import org.wikipedia.AppAdapter +import java.lang.reflect.Method /** * Custom Selector Activity Test @@ -29,6 +37,8 @@ class CustomSelectorActivityTest { @Before fun setUp() { MockitoAnnotations.initMocks(this) + AppAdapter.set(TestAppAdapter()) + activity = Robolectric.buildActivity(CustomSelectorActivity::class.java) .get() val onCreate = activity.javaClass.getDeclaredMethod("onCreate", Bundle::class.java) @@ -62,7 +72,7 @@ class CustomSelectorActivityTest { @Test @Throws(Exception::class) fun testOnFolderClick() { - activity.onFolderClick(Folder(1, "test", arrayListOf())); + activity.onFolderClick(1, "test", 0); } /** @@ -93,4 +103,17 @@ class CustomSelectorActivityTest { fun testOnBackPressed() { activity.onBackPressed() } + + /** + * Test onDestroy Function. + */ + @Test + @Throws(Exception::class) + fun testOnDestroy() { + val method: Method = CustomSelectorActivity::class.java.getDeclaredMethod( + "onDestroy" + ) + method.isAccessible = true + method.invoke(activity) + } } \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/FolderFragmentTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/FolderFragmentTest.kt index 53094d6f7..c77f24342 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/FolderFragmentTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/FolderFragmentTest.kt @@ -127,4 +127,15 @@ class FolderFragmentTest { func.isAccessible = true func.invoke(fragment, Result(CallbackStatus.SUCCESS, arrayListOf())) } + + /** + * Test onResume. + */ + @Test + fun testOnResume() { + val func = fragment.javaClass.getDeclaredMethod("onResume") + func.isAccessible = true + func.invoke(fragment) + } + } \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageFragmentTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageFragmentTest.kt index 9794003c8..10ebcc4e8 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageFragmentTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageFragmentTest.kt @@ -3,14 +3,17 @@ package fr.free.nrw.commons.customselector.ui.selector import android.content.Context import android.os.Bundle import android.os.Looper +import android.os.Looper.getMainLooper import android.view.LayoutInflater import android.view.View import android.widget.ProgressBar import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.soloader.SoLoader +import com.nhaarman.mockitokotlin2.whenever import fr.free.nrw.commons.R import fr.free.nrw.commons.TestAppAdapter import fr.free.nrw.commons.TestCommonsApplication @@ -29,6 +32,7 @@ import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment import org.robolectric.Shadows +import org.robolectric.Shadows.shadowOf import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import org.wikipedia.AppAdapter @@ -50,6 +54,9 @@ class ImageFragmentTest { private lateinit var context: Context private lateinit var viewModelField: Field + @Mock + private lateinit var layoutManager: GridLayoutManager + @Mock private lateinit var image: Image @@ -71,7 +78,7 @@ class ImageFragmentTest { Fresco.initialize(context) val activity = Robolectric.buildActivity(CustomSelectorActivity::class.java).create().get() - fragment = ImageFragment.newInstance(1) + fragment = ImageFragment.newInstance(1,0) val fragmentManager: FragmentManager = activity.supportFragmentManager val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction() fragmentTransaction.add(fragment, null) @@ -132,4 +139,28 @@ class ImageFragmentTest { assertEquals(3, func.invoke(fragment)) } + + /** + * Test onResume. + */ + @Test + fun testOnResume() { + val func = fragment.javaClass.getDeclaredMethod("onResume") + func.isAccessible = true + func.invoke(fragment) + } + + /** + * Test onDestroy. + */ + @Test + fun testOnDestroy() { + shadowOf(getMainLooper()).idle() + selectorRV.layoutManager = layoutManager + whenever(layoutManager.findFirstVisibleItemPosition()).thenReturn(1) + val func = fragment.javaClass.getDeclaredMethod("onDestroy") + func.isAccessible = true + func.invoke(fragment) + } + } \ No newline at end of file