Skip to content

Commit

Permalink
Adding unit tests for ViewModel
Browse files Browse the repository at this point in the history
  • Loading branch information
mnaturel committed Jan 4, 2023
1 parent 71b7edc commit bc985aa
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package im.vector.app.features.roomprofile.polls

import androidx.annotation.VisibleForTesting
import com.airbnb.mvrx.MavericksViewModelFactory
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
Expand All @@ -39,9 +40,9 @@ class RoomPollsViewModel @AssistedInject constructor(

companion object : MavericksViewModelFactory<RoomPollsViewModel, RoomPollsViewState> by hiltMavericksViewModelFactory()

private var pollsCollectionJob: Job? = null
@VisibleForTesting
var pollsCollectionJob: Job? = null

// TODO add unit tests
override fun handle(action: RoomPollsAction) {
when (action) {
is RoomPollsAction.SetFilter -> handleSetFilter(action.filter)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package im.vector.app.features.roomprofile.polls

import com.airbnb.mvrx.test.MavericksTestRule
import im.vector.app.test.test
import im.vector.app.test.testDispatcher
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.flow.flowOf
import org.amshove.kluent.shouldNotBeNull
import org.junit.Rule
import org.junit.Test

private const val ROOM_ID = "room-id"

class RoomPollsViewModelTest {

@get:Rule
val mavericksTestRule = MavericksTestRule(testDispatcher = testDispatcher)

private val fakeGetPollsUseCase = mockk<GetPollsUseCase>()
private val initialState = RoomPollsViewState(ROOM_ID)

private fun createViewModel(): RoomPollsViewModel {
return RoomPollsViewModel(
initialState = initialState,
getPollsUseCase = fakeGetPollsUseCase,
)
}

@Test
fun `given SetFilter action when handle then useCase is called with given filter and viewState is updated`() {
// Given
val filter = RoomPollsFilter.ACTIVE
val action = RoomPollsAction.SetFilter(filter = filter)
val polls = listOf(givenAPollSummary())
every { fakeGetPollsUseCase.execute(any()) } returns flowOf(polls)
val viewModel = createViewModel()
val expectedViewState = initialState.copy(polls = polls)

// When
val viewModelTest = viewModel.test()
viewModel.pollsCollectionJob = null
viewModel.handle(action)

// Then
viewModelTest
.assertLatestState(expectedViewState)
.finish()
viewModel.pollsCollectionJob.shouldNotBeNull()
verify {
viewModel.pollsCollectionJob?.cancel()
fakeGetPollsUseCase.execute(filter)
}
}

private fun givenAPollSummary(): PollSummary {
return mockk()
}
}

0 comments on commit bc985aa

Please sign in to comment.