Add ContributionViewHolder Unit Tests (#4612)

This commit is contained in:
Madhur Gupta 2021-09-07 12:31:08 +05:30 committed by GitHub
parent 7eab53afa8
commit 4d2487dcc9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -0,0 +1,327 @@
package fr.free.nrw.commons.contributions
import android.net.Uri
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageButton
import android.widget.ProgressBar
import android.widget.RelativeLayout
import android.widget.TextView
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.drawee.view.SimpleDraweeView
import com.facebook.soloader.SoLoader
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.media.MediaClient
import fr.free.nrw.commons.profile.ProfileActivity
import io.reactivex.disposables.CompositeDisposable
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.Shadows
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode
import java.lang.reflect.Method
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [21], application = TestCommonsApplication::class)
@LooperMode(LooperMode.Mode.PAUSED)
class ContributionViewHolderUnitTests {
private lateinit var contributionViewHolder: ContributionViewHolder
private lateinit var activity: ProfileActivity
private lateinit var parent: View
private lateinit var pauseResumeButton: ImageButton
private lateinit var addToWikipediaButton: ImageButton
private lateinit var cancelButton: ImageButton
private lateinit var retryButton: ImageButton
private lateinit var imageOptions: RelativeLayout
private lateinit var imageView: SimpleDraweeView
private lateinit var titleView: TextView
private lateinit var authorView: TextView
private lateinit var stateView: TextView
private lateinit var seqNumView: TextView
private lateinit var progressView: ProgressBar
@Mock
private lateinit var callback: ContributionsListAdapter.Callback
@Mock
private lateinit var mediaClient: MediaClient
@Mock
private lateinit var uri: Uri
@Mock
private lateinit var contribution: Contribution
@Mock
private lateinit var compositeDisposable: CompositeDisposable
@Mock
private lateinit var media: Media
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
SoLoader.setInTestMode()
Fresco.initialize(RuntimeEnvironment.application.applicationContext)
activity = Robolectric.buildActivity(ProfileActivity::class.java).create().get()
parent = LayoutInflater.from(activity).inflate(R.layout.layout_contribution, null)
contributionViewHolder = ContributionViewHolder(parent, callback, mediaClient)
pauseResumeButton = parent.findViewById(R.id.pauseResumeButton)
Whitebox.setInternalState(contributionViewHolder, "pauseResumeButton", pauseResumeButton)
addToWikipediaButton = parent.findViewById(R.id.wikipediaButton)
Whitebox.setInternalState(
contributionViewHolder,
"addToWikipediaButton",
addToWikipediaButton
)
cancelButton = parent.findViewById(R.id.cancelButton)
Whitebox.setInternalState(contributionViewHolder, "cancelButton", cancelButton)
retryButton = parent.findViewById(R.id.retryButton)
Whitebox.setInternalState(contributionViewHolder, "retryButton", retryButton)
imageOptions = parent.findViewById(R.id.image_options)
Whitebox.setInternalState(contributionViewHolder, "imageOptions", imageOptions)
imageView = parent.findViewById(R.id.contributionImage)
Whitebox.setInternalState(contributionViewHolder, "imageView", imageView)
titleView = parent.findViewById(R.id.contributionTitle)
Whitebox.setInternalState(contributionViewHolder, "titleView", titleView)
authorView = parent.findViewById(R.id.authorView)
Whitebox.setInternalState(contributionViewHolder, "authorView", authorView)
stateView = parent.findViewById(R.id.contributionState)
Whitebox.setInternalState(contributionViewHolder, "stateView", stateView)
seqNumView = parent.findViewById(R.id.contributionSequenceNumber)
Whitebox.setInternalState(contributionViewHolder, "seqNumView", seqNumView)
progressView = parent.findViewById(R.id.contributionProgress)
Whitebox.setInternalState(contributionViewHolder, "progressView", progressView)
Whitebox.setInternalState(
contributionViewHolder,
"compositeDisposable",
compositeDisposable
)
}
@Test
@Throws(Exception::class)
fun checkNotNull() {
Assert.assertNotNull(contributionViewHolder)
}
@Test
@Throws(Exception::class)
fun testSetResume() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
val method: Method = ContributionViewHolder::class.java.getDeclaredMethod(
"setResume"
)
method.isAccessible = true
method.invoke(contributionViewHolder)
}
@Test
@Throws(Exception::class)
fun testSetPaused() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
val method: Method = ContributionViewHolder::class.java.getDeclaredMethod(
"setPaused"
)
method.isAccessible = true
method.invoke(contributionViewHolder)
}
@Test
@Throws(Exception::class)
fun testPause() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
val method: Method = ContributionViewHolder::class.java.getDeclaredMethod(
"pause"
)
method.isAccessible = true
method.invoke(contributionViewHolder)
}
@Test
@Throws(Exception::class)
fun testResume() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
val method: Method = ContributionViewHolder::class.java.getDeclaredMethod(
"resume"
)
method.isAccessible = true
method.invoke(contributionViewHolder)
}
@Test
@Throws(Exception::class)
fun testOnPauseResumeButtonClickedCaseTrue() {
contributionViewHolder.onPauseResumeButtonClicked()
}
@Test
@Throws(Exception::class)
fun testOnPauseResumeButtonClickedCaseFalse() {
pauseResumeButton.tag = ""
contributionViewHolder.onPauseResumeButtonClicked()
}
@Test
@Throws(Exception::class)
fun testWikipediaButtonClicked() {
contributionViewHolder.wikipediaButtonClicked()
}
@Test
@Throws(Exception::class)
fun testImageClicked() {
contributionViewHolder.imageClicked()
}
@Test
@Throws(Exception::class)
fun testDeleteUpload() {
contributionViewHolder.deleteUpload()
}
@Test
@Throws(Exception::class)
fun testRetryUpload() {
contributionViewHolder.retryUpload()
}
@Test
@Throws(Exception::class)
fun testChooseImageSource() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
val method: Method = ContributionViewHolder::class.java.getDeclaredMethod(
"chooseImageSource",
String::class.java,
Uri::class.java
)
method.isAccessible = true
method.invoke(contributionViewHolder, "", uri)
}
@Test
@Throws(Exception::class)
fun testDisplayWikipediaButton() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
val method: Method = ContributionViewHolder::class.java.getDeclaredMethod(
"displayWikipediaButton",
Boolean::class.javaObjectType
)
method.isAccessible = true
method.invoke(contributionViewHolder, false)
}
@Test
@Throws(Exception::class)
fun testCheckIfMediaExistsOnWikipediaPageCaseNull() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(contribution.wikidataPlace).thenReturn(null)
val method: Method = ContributionViewHolder::class.java.getDeclaredMethod(
"checkIfMediaExistsOnWikipediaPage",
Contribution::class.java
)
method.isAccessible = true
method.invoke(contributionViewHolder, contribution)
}
@Test
@Throws(Exception::class)
fun testInitCaseNull() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
contributionViewHolder.init(0, null)
}
@Test
@Throws(Exception::class)
fun testInitCaseNonNull_STATE_COMPLETED() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(contribution.state).thenReturn(Contribution.STATE_COMPLETED)
`when`(contribution.media).thenReturn(media)
`when`(media.mostRelevantCaption).thenReturn("")
`when`(media.author).thenReturn("")
contributionViewHolder.init(0, contribution)
}
@Test
@Throws(Exception::class)
fun testInitCaseNonNull_STATE_QUEUED() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(contribution.state).thenReturn(Contribution.STATE_QUEUED)
`when`(contribution.media).thenReturn(media)
`when`(media.mostRelevantCaption).thenReturn("")
`when`(media.author).thenReturn("")
contributionViewHolder.init(0, contribution)
}
@Test
@Throws(Exception::class)
fun testInitCaseNonNull_STATE_QUEUED_LIMITED_CONNECTION_MODE() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(contribution.state).thenReturn(Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE)
`when`(contribution.media).thenReturn(media)
`when`(media.mostRelevantCaption).thenReturn("")
`when`(media.author).thenReturn("")
contributionViewHolder.init(0, contribution)
}
@Test
@Throws(Exception::class)
fun testInitCaseNonNull_STATE_IN_PROGRESS() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(contribution.state).thenReturn(Contribution.STATE_IN_PROGRESS)
`when`(contribution.media).thenReturn(media)
`when`(media.mostRelevantCaption).thenReturn("")
`when`(media.author).thenReturn("")
contributionViewHolder.init(0, contribution)
}
@Test
@Throws(Exception::class)
fun testInitCaseNonNull_STATE_PAUSED() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(contribution.state).thenReturn(Contribution.STATE_PAUSED)
`when`(contribution.media).thenReturn(media)
`when`(media.mostRelevantCaption).thenReturn("")
`when`(media.author).thenReturn("")
contributionViewHolder.init(0, contribution)
}
@Test
@Throws(Exception::class)
fun testInitCaseNonNull_STATE_FAILED() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(contribution.state).thenReturn(Contribution.STATE_FAILED)
`when`(contribution.media).thenReturn(media)
`when`(media.mostRelevantCaption).thenReturn("")
`when`(media.author).thenReturn("")
contributionViewHolder.init(0, contribution)
}
}