Convert a batch of tests from mockito -> mockk.

Resolves #13832
This commit is contained in:
Jameson Williams 2024-12-10 01:15:01 -06:00 committed by Greyson Parrelli
parent 8ddbc57c7c
commit 57eeed33f0
8 changed files with 137 additions and 199 deletions

View file

@ -1,14 +1,12 @@
package org.thoughtcrime.securesms.sms
import android.app.Application
import io.mockk.every
import io.mockk.mockk
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.attachments.Attachment
@ -36,18 +34,15 @@ import java.util.concurrent.atomic.AtomicLong
@RunWith(RobolectricTestRunner::class)
@Config(application = Application::class)
class UploadDependencyGraphTest {
private val jobManager: JobManager = mock()
private var uniqueLong = AtomicLong(0)
@Before
fun setUp() {
whenever(jobManager.startChain(any<Job>())).then {
JobManager.Chain(jobManager, listOf(it.getArgument(0)))
private val jobManager = mockk<JobManager> {
every { startChain(any<Job>()) } answers {
val job = args.first() as Job
JobManager.Chain(this@mockk, listOf(job))
}
}
private var uniqueLong = AtomicLong(0)
@Test
fun `Given a list of Uri attachments and a list of Messages, when I get the dependencyMap, then I expect a times m results`() {
// GIVEN

View file

@ -1,20 +1,17 @@
package org.thoughtcrime.securesms.stories
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.runs
import io.mockk.slot
import io.mockk.verify
import io.reactivex.rxjava3.plugins.RxJavaPlugins
import io.reactivex.rxjava3.schedulers.TestScheduler
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.Mock
import org.mockito.MockedStatic
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.mockito.kotlin.any
import org.mockito.kotlin.isA
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.thoughtcrime.securesms.attachments.AttachmentId
import org.thoughtcrime.securesms.database.AttachmentTable
import org.thoughtcrime.securesms.database.FakeMessageRecords
@ -24,37 +21,24 @@ import org.thoughtcrime.securesms.jobmanager.JobManager
import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob
class StoriesTest {
@Rule
@JvmField
val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock
private lateinit var mockAttachmentTable: AttachmentTable
@Mock
private lateinit var mockJobManager: JobManager
@Mock
private lateinit var mockApplicationDependenciesStatic: MockedStatic<AppDependencies>
@Mock
private lateinit var mockSignalDatabaseStatic: MockedStatic<SignalDatabase>
@Mock
private lateinit var mockSignalDatabase: SignalDatabase
private val testScheduler = TestScheduler()
private val mockJobManager = mockk<JobManager> {
every { add(any()) } just runs
}
private val mockAttachmentTable = mockk<AttachmentTable>()
private val mockSignalDatabase = mockk<SignalDatabase>()
@Before
fun setUp() {
mockkStatic(AppDependencies::class)
RxJavaPlugins.setInitIoSchedulerHandler { testScheduler }
RxJavaPlugins.setIoSchedulerHandler { testScheduler }
SignalDatabase.setSignalDatabaseInstanceForTesting(mockSignalDatabase)
whenever(SignalDatabase.attachments).thenReturn(mockAttachmentTable)
whenever(AppDependencies.jobManager).thenReturn(mockJobManager)
whenever(mockAttachmentTable.getAttachmentsForMessage(any())).thenReturn(emptyList())
every { SignalDatabase.attachments } returns mockAttachmentTable
every { AppDependencies.jobManager } returns mockJobManager
every { mockAttachmentTable.getAttachmentsForMessage(any()) } returns emptyList()
}
@After
@ -75,7 +59,7 @@ class StoriesTest {
// THEN
testObserver.assertComplete()
verify(mockJobManager, never()).add(any())
verify(exactly = 0) { mockJobManager.add(any()) }
}
@Test
@ -95,7 +79,8 @@ class StoriesTest {
// THEN
testObserver.assertComplete()
verify(mockJobManager).add(isA<AttachmentDownloadJob>())
val slot = slot<AttachmentDownloadJob>()
verify { mockJobManager.add(capture(slot)) }
}
@Test
@ -103,7 +88,7 @@ class StoriesTest {
// GIVEN
val attachment = FakeMessageRecords.buildDatabaseAttachment()
val messageRecord = FakeMessageRecords.buildMediaMmsMessageRecord()
whenever(mockAttachmentTable.getAttachmentsForMessage(any())).thenReturn(listOf(attachment))
every { mockAttachmentTable.getAttachmentsForMessage(any()) } returns listOf(attachment)
// WHEN
val testObserver = Stories.enqueueAttachmentsFromStoryForDownload(messageRecord, true).test()
@ -111,6 +96,7 @@ class StoriesTest {
// THEN
testObserver.assertComplete()
verify(mockJobManager).add(isA<AttachmentDownloadJob>())
val slot = slot<AttachmentDownloadJob>()
verify { mockJobManager.add(capture(slot)) }
}
}

View file

@ -6,57 +6,43 @@ import android.os.Looper.getMainLooper
import android.view.ContextThemeWrapper
import android.view.View
import android.widget.ImageView
import androidx.test.core.app.ApplicationProvider
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.RequestManager
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.verify
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockedStatic
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.robolectric.RobolectricTestRunner
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.blurhash.BlurHash
import org.thoughtcrime.securesms.util.visible
@RunWith(RobolectricTestRunner::class)
@Config(application = Application::class)
class StoryFirstTimeNavigationViewTest {
private val testSubject =
StoryFirstTimeNavigationView(ContextThemeWrapper(getApplicationContext(), R.style.Signal_DayNight))
@Rule
@JvmField
val mockitoRule: MockitoRule = MockitoJUnit.rule()
private lateinit var testSubject: StoryFirstTimeNavigationView
@Mock
private lateinit var glide: MockedStatic<Glide>
@Mock
private lateinit var requestManager: RequestManager
@Mock
private lateinit var requestBuilder: RequestBuilder<Drawable>
private val requestBuilder = mockk<RequestBuilder<Drawable>>(relaxed = true) {
every { addListener(any()) } returns this@mockk
}
private val requestManager = mockk<RequestManager>(relaxUnitFun = true) {
every { load(any<BlurHash>()) } returns requestBuilder
}
@Before
fun setUp() {
testSubject = StoryFirstTimeNavigationView(ContextThemeWrapper(ApplicationProvider.getApplicationContext(), org.thoughtcrime.securesms.R.style.Signal_DayNight))
whenever(Glide.with(any<View>())).thenReturn(requestManager)
whenever(requestManager.load(any<BlurHash>())).thenReturn(requestBuilder)
whenever(requestBuilder.addListener(any())).thenReturn(requestBuilder)
mockkStatic(Glide::class)
every { Glide.with(any<View>()) } returns requestManager
}
@Test
@ -64,8 +50,8 @@ class StoryFirstTimeNavigationViewTest {
fun `Given sdk 31, when I create testSubject, then I expect overlay visible and blur hash not visible`() {
shadowOf(getMainLooper()).idle()
assertTrue(testSubject.findViewById<View>(org.thoughtcrime.securesms.R.id.edu_overlay).visible)
assertFalse(testSubject.findViewById<View>(org.thoughtcrime.securesms.R.id.edu_blur_hash).visible)
assertTrue(testSubject.findViewById<View>(R.id.edu_overlay).visible)
assertFalse(testSubject.findViewById<View>(R.id.edu_blur_hash).visible)
}
@Test
@ -73,8 +59,8 @@ class StoryFirstTimeNavigationViewTest {
fun `Given sdk 30, when I create testSubject, then I expect overlay visible and blur hash visible`() {
shadowOf(getMainLooper()).idle()
assertTrue(testSubject.findViewById<View>(org.thoughtcrime.securesms.R.id.edu_overlay).visible)
assertTrue(testSubject.findViewById<View>(org.thoughtcrime.securesms.R.id.edu_blur_hash).visible)
assertTrue(testSubject.findViewById<View>(R.id.edu_overlay).visible)
assertTrue(testSubject.findViewById<View>(R.id.edu_blur_hash).visible)
}
@Test
@ -84,7 +70,7 @@ class StoryFirstTimeNavigationViewTest {
testSubject.setBlurHash(BlurHash.parseOrNull("0000")!!)
assertFalse(testSubject.findViewById<View>(org.thoughtcrime.securesms.R.id.edu_blur_hash).visible)
assertFalse(testSubject.findViewById<View>(R.id.edu_blur_hash).visible)
}
@Test
@ -94,8 +80,8 @@ class StoryFirstTimeNavigationViewTest {
testSubject.setBlurHash(BlurHash.parseOrNull("0000")!!)
val blurHashView = testSubject.findViewById<ImageView>(org.thoughtcrime.securesms.R.id.edu_blur_hash)
verify(requestBuilder).into(eq(blurHashView))
val blurHashView = testSubject.findViewById<ImageView>(R.id.edu_blur_hash)
verify { requestBuilder.into(blurHashView) }
}
@Test
@ -105,9 +91,9 @@ class StoryFirstTimeNavigationViewTest {
testSubject.setBlurHash(null)
val blurHashView = testSubject.findViewById<ImageView>(org.thoughtcrime.securesms.R.id.edu_blur_hash)
val blurHashView = testSubject.findViewById<ImageView>(R.id.edu_blur_hash)
assertFalse(blurHashView.visible)
verify(requestManager).clear(blurHashView)
verify { requestManager.clear(blurHashView) }
}
@Test
@ -122,8 +108,8 @@ class StoryFirstTimeNavigationViewTest {
testSubject.setBlurHash(BlurHash.parseOrNull("0000")!!)
val blurHashView = testSubject.findViewById<ImageView>(org.thoughtcrime.securesms.R.id.edu_blur_hash)
verify(requestBuilder, never()).into(eq(blurHashView))
val blurHashView = testSubject.findViewById<ImageView>(R.id.edu_blur_hash)
verify(exactly = 0) { requestBuilder.into(blurHashView) }
}
@Test

View file

@ -6,14 +6,14 @@ import android.content.Intent
import android.net.Uri
import androidx.fragment.app.Fragment
import androidx.test.core.app.ApplicationProvider
import io.mockk.every
import io.mockk.mockk
import io.mockk.slot
import io.mockk.verify
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.signal.core.util.Base64
@ -32,11 +32,10 @@ import java.util.Optional
@RunWith(RobolectricTestRunner::class)
@Config(application = Application::class)
class StoryContextMenuTest {
private val context: Context = ApplicationProvider.getApplicationContext()
private val intentCaptor = argumentCaptor<Intent>()
private val fragment: Fragment = mock {
on { requireContext() } doReturn context
private val intentSlot = slot<Intent>()
private val fragment = mockk<Fragment>(relaxUnitFun = true) {
every { requireContext() } returns this@StoryContextMenuTest.context
}
@Test
@ -60,9 +59,9 @@ class StoryContextMenuTest {
StoryContextMenu.share(fragment, storyRecord)
// THEN
verify(fragment).startActivity(intentCaptor.capture())
val chooserIntent: Intent = intentCaptor.firstValue
val targetIntent: Intent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!!
verify { fragment.startActivity(capture(intentSlot)) }
val chooserIntent = intentSlot.captured
val targetIntent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!!
assertEquals(PartAuthority.getAttachmentPublicUri(PartAuthority.getAttachmentDataUri(attachmentId)), targetIntent.getParcelableExtraCompat(Intent.EXTRA_STREAM, Uri::class.java))
assertEquals(MediaUtil.IMAGE_JPEG, targetIntent.type)
assertTrue(Intent.FLAG_GRANT_READ_URI_PERMISSION and chooserIntent.flags == Intent.FLAG_GRANT_READ_URI_PERMISSION)
@ -81,9 +80,9 @@ class StoryContextMenuTest {
StoryContextMenu.share(fragment, storyRecord)
// THEN
verify(fragment).startActivity(intentCaptor.capture())
val chooserIntent: Intent = intentCaptor.firstValue
val targetIntent: Intent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!!
verify { fragment.startActivity(capture(intentSlot)) }
val chooserIntent = intentSlot.captured
val targetIntent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!!
assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT))
}
@ -101,8 +100,8 @@ class StoryContextMenuTest {
StoryContextMenu.share(fragment, storyRecord)
// THEN
verify(fragment).startActivity(intentCaptor.capture())
val chooserIntent: Intent = intentCaptor.firstValue
verify { fragment.startActivity(capture(intentSlot)) }
val chooserIntent: Intent = intentSlot.captured
val targetIntent: Intent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!!
assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT))
}
@ -123,8 +122,8 @@ class StoryContextMenuTest {
StoryContextMenu.share(fragment, storyRecord)
// THEN
verify(fragment).startActivity(intentCaptor.capture())
val chooserIntent: Intent = intentCaptor.firstValue
verify { fragment.startActivity(capture(intentSlot)) }
val chooserIntent: Intent = intentSlot.captured
val targetIntent: Intent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!!
assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT))
}

View file

@ -1,49 +1,34 @@
package org.thoughtcrime.securesms.stories.viewer
import android.app.Application
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.plugins.RxJavaPlugins
import io.reactivex.rxjava3.schedulers.TestScheduler
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mockito.Mock
import org.mockito.MockedStatic
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.stories.Stories
import org.thoughtcrime.securesms.stories.StoryViewerArgs
@Ignore
@RunWith(RobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class)
class StoryViewerViewModelTest {
@Rule
@JvmField
val mockitoRule: MockitoRule = MockitoJUnit.rule()
private val testScheduler = TestScheduler()
@Mock
private lateinit var repository: StoryViewerRepository
@Mock
private lateinit var mockStoriesStatic: MockedStatic<Stories>
private val repository = mockk<StoryViewerRepository>()
@Before
fun setUp() {
RxJavaPlugins.setInitComputationSchedulerHandler { testScheduler }
RxJavaPlugins.setComputationSchedulerHandler { testScheduler }
whenever(repository.getFirstStory(any(), any())).doReturn(Single.just(mock()))
every { repository.getFirstStory(any(), any()) } returns Single.just(mockk())
}
@After
@ -69,7 +54,7 @@ class StoryViewerViewModelTest {
testScheduler.triggerActions()
// THEN
verify(repository, never()).getStories(any(), any())
verify(exactly = 0) { repository.getStories(any(), any()) }
assertEquals(injectedStories, testSubject.stateSnapshot.pages)
}
@ -78,7 +63,7 @@ class StoryViewerViewModelTest {
// GIVEN
val stories: List<RecipientId> = (1L..5L).map(RecipientId::from)
val startStory = RecipientId.from(2L)
whenever(repository.getStories(any(), any())).doReturn(Single.just(stories))
every { repository.getStories(any(), any()) } returns Single.just(stories)
// WHEN
val testSubject = StoryViewerViewModel(
@ -102,7 +87,7 @@ class StoryViewerViewModelTest {
// GIVEN
val stories: List<RecipientId> = (1L..5L).map(RecipientId::from)
val startStory = RecipientId.from(1L)
whenever(repository.getStories(any(), any())).doReturn(Single.just(stories))
every { repository.getStories(any(), any()) } returns Single.just(stories)
val testSubject = StoryViewerViewModel(
StoryViewerArgs(
recipientId = startStory,
@ -129,7 +114,7 @@ class StoryViewerViewModelTest {
// GIVEN
val stories: List<RecipientId> = (1L..5L).map(RecipientId::from)
val startStory = stories.last()
whenever(repository.getStories(any(), any())).doReturn(Single.just(stories))
every { repository.getStories(any(), any()) } returns Single.just(stories)
val testSubject = StoryViewerViewModel(
StoryViewerArgs(
recipientId = startStory,
@ -156,7 +141,7 @@ class StoryViewerViewModelTest {
// GIVEN
val stories: List<RecipientId> = (1L..5L).map(RecipientId::from)
val startStory = stories.last()
whenever(repository.getStories(any(), any())).doReturn(Single.just(stories))
every { repository.getStories(any(), any()) } returns Single.just(stories)
val testSubject = StoryViewerViewModel(
StoryViewerArgs(
recipientId = startStory,
@ -183,7 +168,7 @@ class StoryViewerViewModelTest {
// GIVEN
val stories: List<RecipientId> = (1L..5L).map(RecipientId::from)
val startStory = stories.first()
whenever(repository.getStories(any(), any())).doReturn(Single.just(stories))
every { repository.getStories(any(), any()) } returns Single.just(stories)
val testSubject = StoryViewerViewModel(
StoryViewerArgs(
recipientId = startStory,
@ -210,7 +195,7 @@ class StoryViewerViewModelTest {
// GIVEN
val stories: List<RecipientId> = (1L..5L).map(RecipientId::from)
val startStory = stories.first()
whenever(repository.getStories(any(), any())).doReturn(Single.just(stories))
every { repository.getStories(any(), any()) } returns Single.just(stories)
val testSubject = StoryViewerViewModel(
StoryViewerArgs(
recipientId = startStory,

View file

@ -1,6 +1,8 @@
package org.thoughtcrime.securesms.stories.viewer.page
import android.app.Application
import io.mockk.every
import io.mockk.mockk
import io.reactivex.rxjava3.android.plugins.RxAndroidPlugins
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Observable
@ -10,9 +12,6 @@ import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.database.FakeMessageRecords
@ -22,9 +21,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId
@RunWith(RobolectricTestRunner::class)
@Config(application = Application::class)
class StoryViewerPageViewModelTest {
private val repository: StoryViewerPageRepository = mock()
private val repository = mockk<StoryViewerPageRepository>(relaxed = true)
private val testScheduler = TestScheduler()
@Before
@ -37,7 +34,7 @@ class StoryViewerPageViewModelTest {
RxAndroidPlugins.setMainThreadSchedulerHandler { testScheduler }
whenever(repository.forceDownload(any())).thenReturn(Completable.complete())
every { repository.forceDownload(any()) } returns Completable.complete()
}
@After
@ -49,7 +46,7 @@ class StoryViewerPageViewModelTest {
fun `Given first page and first post, when I goToPreviousPost, then I expect storyIndex to be 0`() {
// GIVEN
val storyPosts = createStoryPosts(3) { true }
whenever(repository.getStoryPostsFor(any(), any())).thenReturn(Observable.just(storyPosts))
every { repository.getStoryPostsFor(any(), any()) } returns Observable.just(storyPosts)
val testSubject = createTestSubject()
testSubject.setIsFirstPage(true)
testScheduler.triggerActions()
@ -68,7 +65,7 @@ class StoryViewerPageViewModelTest {
fun `Given first page and second post, when I goToPreviousPost, then I expect storyIndex to be 0`() {
// GIVEN
val storyPosts = createStoryPosts(3) { true }
whenever(repository.getStoryPostsFor(any(), any())).thenReturn(Observable.just(storyPosts))
every { repository.getStoryPostsFor(any(), any()) } returns Observable.just(storyPosts)
val testSubject = createTestSubject()
testSubject.setIsFirstPage(true)
testScheduler.triggerActions()
@ -89,7 +86,7 @@ class StoryViewerPageViewModelTest {
fun `Given no initial story and 3 records all viewed, when I initialize, then I expect storyIndex to be 0`() {
// GIVEN
val storyPosts = createStoryPosts(3) { true }
whenever(repository.getStoryPostsFor(any(), any())).thenReturn(Observable.just(storyPosts))
every { repository.getStoryPostsFor(any(), any()) } returns Observable.just(storyPosts)
// WHEN
val testSubject = createTestSubject()
@ -105,7 +102,7 @@ class StoryViewerPageViewModelTest {
fun `Given no initial story and 3 records all not viewed, when I initialize, then I expect storyIndex to be 0`() {
// GIVEN
val storyPosts = createStoryPosts(3) { false }
whenever(repository.getStoryPostsFor(any(), any())).thenReturn(Observable.just(storyPosts))
every { repository.getStoryPostsFor(any(), any()) } returns Observable.just(storyPosts)
// WHEN
val testSubject = createTestSubject()
@ -121,7 +118,7 @@ class StoryViewerPageViewModelTest {
fun `Given no initial story and 3 records with 2nd is not viewed, when I initialize, then I expect storyIndex to be 1`() {
// GIVEN
val storyPosts = createStoryPosts(3) { it % 2 != 0 }
whenever(repository.getStoryPostsFor(any(), any())).thenReturn(Observable.just(storyPosts))
every { repository.getStoryPostsFor(any(), any()) } returns Observable.just(storyPosts)
// WHEN
val testSubject = createTestSubject()
@ -137,7 +134,7 @@ class StoryViewerPageViewModelTest {
fun `Given no initial story and 3 records with 1st and 3rd not viewed, when I goToNext, then I expect storyIndex to be 2`() {
// GIVEN
val storyPosts = createStoryPosts(3) { it % 2 == 0 }
whenever(repository.getStoryPostsFor(any(), any())).thenReturn(Observable.just(storyPosts))
every { repository.getStoryPostsFor(any(), any()) } returns Observable.just(storyPosts)
// WHEN
val testSubject = createTestSubject()
@ -155,7 +152,7 @@ class StoryViewerPageViewModelTest {
fun `Given no unread and jump to next unread enabled, when I goToNext, then I expect storyIndex to be size`() {
// GIVEN
val storyPosts = createStoryPosts(3) { true }
whenever(repository.getStoryPostsFor(any(), any())).thenReturn(Observable.just(storyPosts))
every { repository.getStoryPostsFor(any(), any()) } returns Observable.just(storyPosts)
// WHEN
val testSubject = createTestSubject(isJumpForwardToUnviewed = true)
@ -173,7 +170,7 @@ class StoryViewerPageViewModelTest {
fun `Given a single story, when I goToPrevious, then I expect storyIndex to be -1`() {
// GIVEN
val storyPosts = createStoryPosts(1)
whenever(repository.getStoryPostsFor(any(), any())).thenReturn(Observable.just(storyPosts))
every { repository.getStoryPostsFor(any(), any()) } returns Observable.just(storyPosts)
// WHEN
val testSubject = createTestSubject()
@ -198,7 +195,7 @@ class StoryViewerPageViewModelTest {
groupReplyStartPosition = -1
),
repository,
mock()
mockk()
)
}
@ -212,13 +209,13 @@ class StoryViewerPageViewModelTest {
viewCount = 0,
replyCount = 0,
dateInMilliseconds = it.toLong(),
content = StoryPost.Content.TextContent(mock(), it.toLong(), false, 0),
conversationMessage = mock(),
content = StoryPost.Content.TextContent(mockk(), it.toLong(), false, 0),
conversationMessage = mockk(),
allowsReplies = true,
hasSelfViewed = isViewed(it)
).apply {
val messageRecord = FakeMessageRecords.buildMediaMmsMessageRecord()
whenever(conversationMessage.messageRecord).thenReturn(messageRecord)
every { conversationMessage.messageRecord } returns messageRecord
}
}
}

View file

@ -1,18 +1,18 @@
package org.thoughtcrime.securesms.util
import androidx.documentfile.provider.DocumentFile
import io.mockk.every
import io.mockk.mockk
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.fail
import org.junit.Assert.assertThrows
import org.junit.BeforeClass
import org.junit.Test
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.testutil.EmptyLogger
import org.thoughtcrime.securesms.util.BackupUtil.BackupFileException
class BackupUtilTest {
companion object {
private const val TEST_NAME = "1920837192.backup"
@ -23,28 +23,24 @@ class BackupUtilTest {
}
}
private val documentFile = mock(DocumentFile::class.java)
private val documentFile = mockk<DocumentFile>(relaxed = true)
@Test
fun `Given a non-existent uri, when I getBackupInfoFromSingleDocumentFile, then I expect NOT_FOUND`() {
try {
val error = assertThrows("Expected a BackupFileException", BackupFileException::class.java) {
BackupUtil.getBackupInfoFromSingleDocumentFile(documentFile)
fail("Expected a BackupFileException")
} catch (e: BackupUtil.BackupFileException) {
assertEquals(BackupUtil.BackupFileState.NOT_FOUND, e.state)
}
assertEquals(BackupUtil.BackupFileState.NOT_FOUND, error.state)
}
@Test
fun `Given an existent but unreadable uri, when I getBackupInfoFromSingleDocumentFile, then I expect NOT_READABLE`() {
givenFileExists()
try {
val error = assertThrows("Expected a BackupFileException", BackupFileException::class.java) {
BackupUtil.getBackupInfoFromSingleDocumentFile(documentFile)
fail("Expected a BackupFileException")
} catch (e: BackupUtil.BackupFileException) {
assertEquals(BackupUtil.BackupFileState.NOT_READABLE, e.state)
}
assertEquals(BackupUtil.BackupFileState.NOT_READABLE, error.state)
}
@Test
@ -52,12 +48,10 @@ class BackupUtilTest {
givenFileExists()
givenFileIsReadable()
try {
val error = assertThrows("Expected a BackupFileException", BackupFileException::class.java) {
BackupUtil.getBackupInfoFromSingleDocumentFile(documentFile)
fail("Expected a BackupFileException")
} catch (e: BackupUtil.BackupFileException) {
assertEquals(BackupUtil.BackupFileState.UNSUPPORTED_FILE_EXTENSION, e.state)
}
assertEquals(BackupUtil.BackupFileState.UNSUPPORTED_FILE_EXTENSION, error.state)
}
@Test
@ -71,14 +65,14 @@ class BackupUtilTest {
}
private fun givenFileExists() {
doReturn(true).`when`(documentFile).exists()
every { documentFile.exists() } returns true
}
private fun givenFileIsReadable() {
doReturn(true).`when`(documentFile).canRead()
every { documentFile.canRead() } returns true
}
private fun givenFileHasCorrectExtension() {
doReturn(TEST_NAME).`when`(documentFile).name
every { documentFile.name } returns TEST_NAME
}
}

View file

@ -1,17 +1,13 @@
package org.thoughtcrime.securesms.video.exo
import androidx.media3.exoplayer.ExoPlayer
import io.mockk.mockk
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertThrows
import org.junit.Assert.assertTrue
import org.junit.Assert.fail
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.mockito.Mockito.mock
@RunWith(JUnit4::class)
class ExoPlayerPoolTest {
@Test
fun `Given an empty pool, when I require a player, then I expect a player`() {
// GIVEN
@ -24,16 +20,16 @@ class ExoPlayerPoolTest {
assertNotNull(player)
}
@Test(expected = IllegalStateException::class)
@Test
fun `Given a pool without available players, when I require a player, then I expect an exception`() {
// GIVEN
val testSubject = createTestSubject(1, 0)
// WHEN
testSubject.require("")
// THEN
fail("Expected an IllegalStateException")
assertThrows(IllegalStateException::class.java) {
// WHEN
testSubject.require("")
}
}
@Test
@ -63,17 +59,17 @@ class ExoPlayerPoolTest {
assertTrue(morePlayers.all { it != null })
}
@Test(expected = IllegalArgumentException::class)
@Test
fun `Given an ExoPlayer not in the pool, when I pool it, then I expect an IllegalArgumentException`() {
// GIVEN
val player = mock(ExoPlayer::class.java)
val player = mockk<ExoPlayer>()
val pool = createTestSubject(1, 10)
// WHEN
pool.pool(player)
// THEN
fail("Expected an IllegalArgumentException to be thrown")
assertThrows(IllegalArgumentException::class.java) {
// WHEN
pool.pool(player)
}
}
private fun createTestSubject(
@ -82,7 +78,7 @@ class ExoPlayerPoolTest {
): ExoPlayerPool<ExoPlayer> {
return object : ExoPlayerPool<ExoPlayer>(maximumReservedPlayers) {
override fun createPlayer(): ExoPlayer {
return mock(ExoPlayer::class.java)
return mockk<ExoPlayer>(relaxUnitFun = true)
}
override fun getMaxSimultaneousPlayback(): Int {