Adding unit tests for ViewModel

This commit is contained in:
Maxime NATUREL 2022-12-30 14:19:50 +01:00
parent 71b7edc6f2
commit bc985aa1ef
2 changed files with 79 additions and 2 deletions

View file

@ -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
@ -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)

View file

@ -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()
}
}