diff --git a/vector/src/test/java/im/vector/app/features/poll/create/CreatePollViewModelTest.kt b/vector/src/test/java/im/vector/app/features/poll/create/CreatePollViewModelTest.kt index fa24d9c4a6..f73175faa3 100644 --- a/vector/src/test/java/im/vector/app/features/poll/create/CreatePollViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/poll/create/CreatePollViewModelTest.kt @@ -18,42 +18,38 @@ package im.vector.app.features.poll.create import com.airbnb.mvrx.test.MvRxTestRule import im.vector.app.features.poll.PollMode -import im.vector.app.features.poll.create.CreatePollViewStates.createPollArgs -import im.vector.app.features.poll.create.CreatePollViewStates.editPollArgs -import im.vector.app.features.poll.create.CreatePollViewStates.fakeOptions -import im.vector.app.features.poll.create.CreatePollViewStates.fakeQuestion -import im.vector.app.features.poll.create.CreatePollViewStates.fakeRoomId -import im.vector.app.features.poll.create.CreatePollViewStates.initialCreatePollViewState -import im.vector.app.features.poll.create.CreatePollViewStates.pollViewStateWithOnlyQuestion -import im.vector.app.features.poll.create.CreatePollViewStates.pollViewStateWithQuestionAndEnoughOptions -import im.vector.app.features.poll.create.CreatePollViewStates.pollViewStateWithQuestionAndMaxOptions -import im.vector.app.features.poll.create.CreatePollViewStates.pollViewStateWithQuestionAndNotEnoughOptions -import im.vector.app.features.poll.create.CreatePollViewStates.pollViewStateWithoutQuestionAndEnoughOptions +import im.vector.app.features.poll.create.FakeCreatePollViewStates.A_FAKE_OPTIONS +import im.vector.app.features.poll.create.FakeCreatePollViewStates.A_FAKE_QUESTION +import im.vector.app.features.poll.create.FakeCreatePollViewStates.A_FAKE_ROOM_ID +import im.vector.app.features.poll.create.FakeCreatePollViewStates.A_POLL_START_TIMELINE_EVENT +import im.vector.app.features.poll.create.FakeCreatePollViewStates.createPollArgs +import im.vector.app.features.poll.create.FakeCreatePollViewStates.editPollArgs +import im.vector.app.features.poll.create.FakeCreatePollViewStates.editedPollViewState +import im.vector.app.features.poll.create.FakeCreatePollViewStates.initialCreatePollViewState +import im.vector.app.features.poll.create.FakeCreatePollViewStates.pollViewStateWithOnlyQuestion +import im.vector.app.features.poll.create.FakeCreatePollViewStates.pollViewStateWithQuestionAndEnoughOptions +import im.vector.app.features.poll.create.FakeCreatePollViewStates.pollViewStateWithQuestionAndMaxOptions +import im.vector.app.features.poll.create.FakeCreatePollViewStates.pollViewStateWithQuestionAndNotEnoughOptions +import im.vector.app.features.poll.create.FakeCreatePollViewStates.pollViewStateWithoutQuestionAndEnoughOptions +import im.vector.app.test.fakes.FakeSession import im.vector.app.test.test -import io.mockk.every -import io.mockk.mockk +import io.mockk.unmockkAll import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest import org.amshove.kluent.shouldBe +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test -import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.getRoom -import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.api.session.room.model.message.PollType -import org.matrix.android.sdk.api.session.room.send.SendService -import org.matrix.android.sdk.api.util.Cancelable class CreatePollViewModelTest { @get:Rule val mvrxTestRule = MvRxTestRule() - private val fakeSession = mockk() - private val fakeRoom = mockk() - private val fakeSendService = mockk() - private val fakeCancellable = mockk() + private val fakeSession = FakeSession() private fun createPollViewModel(pollMode: PollMode): CreatePollViewModel { return if (pollMode == PollMode.EDIT) { @@ -65,9 +61,16 @@ class CreatePollViewModelTest { @Before fun setup() { - every { fakeSession.getRoom(fakeRoomId) } returns fakeRoom - every { fakeRoom.sendService() } returns fakeSendService - every { fakeSendService.sendPoll(any(), fakeQuestion, any()) } returns fakeCancellable + fakeSession + .roomService() + .getRoom(A_FAKE_ROOM_ID) + .timelineService() + .givenTimelineEvent(A_POLL_START_TIMELINE_EVENT) + } + + @After + fun tearDown() { + unmockkAll() } @Test @@ -82,7 +85,7 @@ class CreatePollViewModelTest { @Test fun `given there is not any options when the question is added then poll cannot be created and more options can be added`() = runTest { val createPollViewModel = createPollViewModel(PollMode.CREATE) - createPollViewModel.handle(CreatePollAction.OnQuestionChanged(fakeQuestion)) + createPollViewModel.handle(CreatePollAction.OnQuestionChanged(A_FAKE_QUESTION)) // We need to wait for createPollViewModel.onChange is triggered delay(10) @@ -95,9 +98,9 @@ class CreatePollViewModelTest { @Test fun `given there is not enough options when the question is added then poll cannot be created and more options can be added`() = runTest { val createPollViewModel = createPollViewModel(PollMode.CREATE) - createPollViewModel.handle(CreatePollAction.OnQuestionChanged(fakeQuestion)) + createPollViewModel.handle(CreatePollAction.OnQuestionChanged(A_FAKE_QUESTION)) repeat(CreatePollViewModel.MIN_OPTIONS_COUNT - 1) { - createPollViewModel.handle(CreatePollAction.OnOptionChanged(it, fakeOptions[it])) + createPollViewModel.handle(CreatePollAction.OnOptionChanged(it, A_FAKE_OPTIONS[it])) } delay(10) @@ -111,7 +114,7 @@ class CreatePollViewModelTest { fun `given there is not a question when enough options are added then poll cannot be created and more options can be added`() = runTest { val createPollViewModel = createPollViewModel(PollMode.CREATE) repeat(CreatePollViewModel.MIN_OPTIONS_COUNT) { - createPollViewModel.handle(CreatePollAction.OnOptionChanged(it, fakeOptions[it])) + createPollViewModel.handle(CreatePollAction.OnOptionChanged(it, A_FAKE_OPTIONS[it])) } delay(10) @@ -124,9 +127,9 @@ class CreatePollViewModelTest { @Test fun `given there is a question when enough options are added then poll can be created and more options can be added`() = runTest { val createPollViewModel = createPollViewModel(PollMode.CREATE) - createPollViewModel.handle(CreatePollAction.OnQuestionChanged(fakeQuestion)) + createPollViewModel.handle(CreatePollAction.OnQuestionChanged(A_FAKE_QUESTION)) repeat(CreatePollViewModel.MIN_OPTIONS_COUNT) { - createPollViewModel.handle(CreatePollAction.OnOptionChanged(it, fakeOptions[it])) + createPollViewModel.handle(CreatePollAction.OnOptionChanged(it, A_FAKE_OPTIONS[it])) } delay(10) @@ -139,12 +142,12 @@ class CreatePollViewModelTest { @Test fun `given there is a question when max number of options are added then poll can be created and more options cannot be added`() = runTest { val createPollViewModel = createPollViewModel(PollMode.CREATE) - createPollViewModel.handle(CreatePollAction.OnQuestionChanged(fakeQuestion)) + createPollViewModel.handle(CreatePollAction.OnQuestionChanged(A_FAKE_QUESTION)) repeat(CreatePollViewModel.MAX_OPTIONS_COUNT) { if (it >= CreatePollViewModel.MIN_OPTIONS_COUNT) { createPollViewModel.handle(CreatePollAction.OnAddOption) } - createPollViewModel.handle(CreatePollAction.OnOptionChanged(it, fakeOptions[it])) + createPollViewModel.handle(CreatePollAction.OnOptionChanged(it, A_FAKE_OPTIONS[it])) } delay(10) @@ -170,10 +173,10 @@ class CreatePollViewModelTest { createPollViewModel.handle(CreatePollAction.OnCreatePoll) - createPollViewModel.handle(CreatePollAction.OnQuestionChanged(fakeQuestion)) + createPollViewModel.handle(CreatePollAction.OnQuestionChanged(A_FAKE_QUESTION)) createPollViewModel.handle(CreatePollAction.OnCreatePoll) - createPollViewModel.handle(CreatePollAction.OnOptionChanged(0, fakeOptions[0])) + createPollViewModel.handle(CreatePollAction.OnOptionChanged(0, A_FAKE_OPTIONS[0])) createPollViewModel.handle(CreatePollAction.OnCreatePoll) test @@ -189,9 +192,30 @@ class CreatePollViewModelTest { val createPollViewModel = createPollViewModel(PollMode.CREATE) val test = createPollViewModel.test() - createPollViewModel.handle(CreatePollAction.OnQuestionChanged(fakeQuestion)) - createPollViewModel.handle(CreatePollAction.OnOptionChanged(0, fakeOptions[0])) - createPollViewModel.handle(CreatePollAction.OnOptionChanged(1, fakeOptions[1])) + createPollViewModel.handle(CreatePollAction.OnQuestionChanged(A_FAKE_QUESTION)) + createPollViewModel.handle(CreatePollAction.OnOptionChanged(0, A_FAKE_OPTIONS[0])) + createPollViewModel.handle(CreatePollAction.OnOptionChanged(1, A_FAKE_OPTIONS[1])) + createPollViewModel.handle(CreatePollAction.OnCreatePoll) + + test + .assertEvents( + CreatePollViewEvents.Success + ) + } + + @Test + fun `given an edited poll event when question and options are changed then view state is updated accordingly`() = runTest { + val createPollViewModel = createPollViewModel(PollMode.EDIT) + + delay(10) + createPollViewModel.test().assertState(editedPollViewState) + } + + @Test + fun `given an edited poll event then able to be edited`() = runTest { + val createPollViewModel = createPollViewModel(PollMode.EDIT) + val test = createPollViewModel.test() + createPollViewModel.handle(CreatePollAction.OnCreatePoll) test