Add LeaderboardFragment Unit Tests (#4635)

* Add LeaderboardFragment Unit Tests

* Add LeaderboardListAdapter Unit Tests
This commit is contained in:
Madhur Gupta 2021-09-20 12:31:54 +05:30 committed by GitHub
parent e212caf30e
commit 388e8286bc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 305 additions and 1 deletions

View file

@ -20,7 +20,7 @@ import fr.free.nrw.commons.Utils;
*/
public class LeaderboardListAdapter extends PagedListAdapter<LeaderboardList, LeaderboardListAdapter.ListViewHolder> {
protected LeaderboardListAdapter() {
public LeaderboardListAdapter() {
super(LeaderboardList.DIFF_CALLBACK);
}

View file

@ -0,0 +1,203 @@
package fr.free.nrw.commons.leaderboard
import android.accounts.Account
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
import android.widget.ProgressBar
import android.widget.Spinner
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.RecyclerView
import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestAppAdapter
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.auth.SessionManager
import fr.free.nrw.commons.profile.ProfileActivity
import fr.free.nrw.commons.profile.leaderboard.LeaderboardFragment
import fr.free.nrw.commons.profile.leaderboard.LeaderboardListAdapter
import fr.free.nrw.commons.profile.leaderboard.LeaderboardListViewModel
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import org.powermock.reflect.Whitebox
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode
import org.wikipedia.AppAdapter
import java.lang.reflect.Method
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [21], application = TestCommonsApplication::class)
@LooperMode(LooperMode.Mode.PAUSED)
class LeaderboardFragmentUnitTests {
private lateinit var fragment: LeaderboardFragment
private lateinit var fragmentManager: FragmentManager
private lateinit var context: Context
private lateinit var view: View
private lateinit var layoutInflater: LayoutInflater
@Mock
private lateinit var progressBar: ProgressBar
@Mock
private lateinit var spinner: Spinner
@Mock
private lateinit var viewModel: LeaderboardListViewModel
@Mock
private lateinit var recyclerView: RecyclerView
@Mock
private lateinit var adapter: LeaderboardListAdapter
@Mock
private lateinit var sessionManager: SessionManager
@Mock
private lateinit var account: Account
@Mock
private lateinit var button: Button
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
context = RuntimeEnvironment.application.applicationContext
AppAdapter.set(TestAppAdapter())
val activity = Robolectric.buildActivity(ProfileActivity::class.java).create().get()
fragment = LeaderboardFragment()
fragmentManager = activity.supportFragmentManager
val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(fragment, null)
fragmentTransaction.commitNowAllowingStateLoss()
layoutInflater = LayoutInflater.from(activity)
view = LayoutInflater.from(activity)
.inflate(R.layout.fragment_leaderboard, null) as View
Whitebox.setInternalState(fragment, "progressBar", progressBar)
Whitebox.setInternalState(fragment, "categorySpinner", spinner)
Whitebox.setInternalState(fragment, "durationSpinner", spinner)
Whitebox.setInternalState(fragment, "viewModel", viewModel)
Whitebox.setInternalState(fragment, "scrollButton", button)
Whitebox.setInternalState(fragment, "leaderboardListRecyclerView", recyclerView)
}
@Test
@Throws(Exception::class)
fun checkFragmentNotNull() {
Assert.assertNotNull(fragment)
}
@Test
@Throws(Exception::class)
fun testOnCreateView() {
fragment.onCreateView(layoutInflater, null, null)
}
@Test
@Throws(Exception::class)
fun testRefreshLeaderboard() {
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"refreshLeaderboard"
)
method.isAccessible = true
method.invoke(fragment)
}
@Test
@Throws(Exception::class)
fun testScrollToUserRank() {
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"scrollToUserRank"
)
method.isAccessible = true
method.invoke(fragment)
}
@Test
@Throws(Exception::class)
fun testScrollToUserRankCaseNonZeroTrue() {
Whitebox.setInternalState(fragment, "userRank", 1)
`when`(recyclerView.adapter).thenReturn(adapter)
`when`(adapter.itemCount).thenReturn(3)
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"scrollToUserRank"
)
method.isAccessible = true
method.invoke(fragment)
}
@Test
@Throws(Exception::class)
fun testScrollToUserRankCaseNonZeroFalse() {
Whitebox.setInternalState(fragment, "userRank", 1)
`when`(recyclerView.adapter).thenReturn(adapter)
`when`(adapter.itemCount).thenReturn(1)
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"scrollToUserRank"
)
method.isAccessible = true
method.invoke(fragment)
}
@Test
@Throws(Exception::class)
fun testSetLeaderboard() {
Whitebox.setInternalState(fragment, "sessionManager", sessionManager)
`when`(sessionManager.currentAccount).thenReturn(account)
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"setLeaderboard",
String::class.java,
String::class.java,
Int::class.java,
Int::class.java
)
method.isAccessible = true
method.invoke(fragment, "", "", 0, 0)
}
@Test
@Throws(Exception::class)
fun testHideProgressBar() {
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"hideProgressBar"
)
method.isAccessible = true
method.invoke(fragment)
}
@Test
@Throws(Exception::class)
fun testShowProgressBar() {
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"showProgressBar"
)
method.isAccessible = true
method.invoke(fragment)
}
@Test
@Throws(Exception::class)
fun testOnError() {
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"onError"
)
method.isAccessible = true
method.invoke(fragment)
}
}

View file

@ -0,0 +1,101 @@
package fr.free.nrw.commons.leaderboard
import android.content.Context
import android.widget.TextView
import androidx.paging.PagedList
import androidx.recyclerview.widget.RecyclerView
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.drawee.view.SimpleDraweeView
import com.facebook.soloader.SoLoader
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.profile.leaderboard.LeaderboardList
import fr.free.nrw.commons.profile.leaderboard.LeaderboardListAdapter
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode
import java.lang.reflect.Field
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [21], application = TestCommonsApplication::class)
@LooperMode(LooperMode.Mode.PAUSED)
class LeaderboardListAdapterUnitTests {
private lateinit var context: Context
private lateinit var adapter: LeaderboardListAdapter
@Mock
private lateinit var viewHolder: LeaderboardListAdapter.ListViewHolder
@Mock
private lateinit var textView: TextView
@Mock
private lateinit var simpleDraweeView: SimpleDraweeView
@Before
fun setUp() {
context = RuntimeEnvironment.application.applicationContext
MockitoAnnotations.initMocks(this)
SoLoader.setInTestMode()
Fresco.initialize(context)
adapter = LeaderboardListAdapter()
val rank: Field =
LeaderboardListAdapter.ListViewHolder::class.java.getDeclaredField("rank")
rank.isAccessible = true
rank.set(viewHolder, textView)
val avatar: Field =
LeaderboardListAdapter.ListViewHolder::class.java.getDeclaredField("avatar")
avatar.isAccessible = true
avatar.set(viewHolder, simpleDraweeView)
val username: Field =
LeaderboardListAdapter.ListViewHolder::class.java.getDeclaredField("username")
username.isAccessible = true
username.set(viewHolder, textView)
val count: Field =
LeaderboardListAdapter.ListViewHolder::class.java.getDeclaredField("count")
count.isAccessible = true
count.set(viewHolder, textView)
val itemView: Field =
RecyclerView.ViewHolder::class.java.getDeclaredField("itemView")
itemView.isAccessible = true
itemView.set(viewHolder, textView)
}
@Test
@Throws(Exception::class)
fun testOnBindViewHolder() {
val list = LeaderboardList()
list.rank = 1
list.avatar = ""
list.categoryCount = 1
list.username = ""
adapter.submitList(mockPagedList(listOf(list)))
adapter.onBindViewHolder(viewHolder, 0)
}
fun <T> mockPagedList(list: List<T>): PagedList<T> {
val pagedList = Mockito.mock(PagedList::class.java) as PagedList<T>
`when`(pagedList[ArgumentMatchers.anyInt()]).then { invocation ->
val index = invocation.arguments.first() as Int
list[index]
}
`when`(pagedList.size).thenReturn(list.size)
return pagedList
}
}