7
7
8
8
package io.element.android.features.createroom.impl.root
9
9
10
+ import androidx.compose.runtime.MutableState
10
11
import app.cash.molecule.RecompositionMode
11
12
import app.cash.molecule.moleculeFlow
12
13
import app.cash.turbine.test
13
14
import com.google.common.truth.Truth.assertThat
15
+ import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser
14
16
import io.element.android.features.createroom.api.StartDMAction
15
17
import io.element.android.features.createroom.impl.userlist.FakeUserListPresenter
16
18
import io.element.android.features.createroom.impl.userlist.FakeUserListPresenterFactory
17
19
import io.element.android.features.createroom.impl.userlist.UserListDataStore
18
20
import io.element.android.features.createroom.test.FakeStartDMAction
19
21
import io.element.android.libraries.architecture.AsyncAction
22
+ import io.element.android.libraries.matrix.api.core.RoomId
20
23
import io.element.android.libraries.matrix.api.core.UserId
21
24
import io.element.android.libraries.matrix.api.user.MatrixUser
22
25
import io.element.android.libraries.matrix.test.A_ROOM_ID
23
26
import io.element.android.libraries.matrix.test.A_THROWABLE
24
27
import io.element.android.libraries.matrix.test.core.aBuildMeta
25
28
import io.element.android.libraries.usersearch.test.FakeUserRepository
26
29
import io.element.android.tests.testutils.WarmUpRule
30
+ import io.element.android.tests.testutils.lambda.any
31
+ import io.element.android.tests.testutils.lambda.lambdaRecorder
32
+ import io.element.android.tests.testutils.lambda.value
27
33
import kotlinx.coroutines.test.runTest
28
34
import org.junit.Rule
29
35
import org.junit.Test
@@ -33,46 +39,130 @@ class CreateRoomRootPresenterTest {
33
39
val warmUpRule = WarmUpRule ()
34
40
35
41
@Test
36
- fun `present - start DM action complete scenario` () = runTest {
37
- val startDMAction = FakeStartDMAction ()
42
+ fun `present - start DM action failure scenario` () = runTest {
43
+ val startDMFailureResult = AsyncAction .Failure (A_THROWABLE )
44
+ val executeResult = lambdaRecorder<MatrixUser , Boolean , MutableState <AsyncAction <RoomId >>, Unit > { _, _, actionState ->
45
+ actionState.value = startDMFailureResult
46
+ }
47
+ val startDMAction = FakeStartDMAction (executeResult = executeResult)
38
48
val presenter = createCreateRoomRootPresenter(startDMAction)
39
49
moleculeFlow(RecompositionMode .Immediate ) {
40
50
presenter.present()
41
51
}.test {
42
52
val initialState = awaitItem()
43
-
44
53
assertThat(initialState.startDmAction).isInstanceOf(AsyncAction .Uninitialized ::class .java)
45
54
assertThat(initialState.applicationName).isEqualTo(aBuildMeta().applicationName)
46
55
assertThat(initialState.userListState.selectedUsers).isEmpty()
47
56
assertThat(initialState.userListState.isSearchActive).isFalse()
48
57
assertThat(initialState.userListState.isMultiSelectionEnabled).isFalse()
49
-
50
58
val matrixUser = MatrixUser (UserId (" @name:domain" ))
51
- val startDMSuccessResult = AsyncAction .Success (A_ROOM_ID )
52
- val startDMFailureResult = AsyncAction .Failure (A_THROWABLE )
53
-
54
- // Failure
55
- startDMAction.givenExecuteResult(startDMFailureResult)
56
59
initialState.eventSink(CreateRoomRootEvents .StartDM (matrixUser))
57
- assertThat(awaitItem().startDmAction).isInstanceOf(AsyncAction .Loading ::class .java)
58
60
awaitItem().also { state ->
59
61
assertThat(state.startDmAction).isEqualTo(startDMFailureResult)
62
+ executeResult.assertions().isCalledOnce().with (
63
+ value(matrixUser),
64
+ value(false ),
65
+ any(),
66
+ )
60
67
state.eventSink(CreateRoomRootEvents .CancelStartDM )
61
68
}
62
-
63
- // Success
64
- startDMAction.givenExecuteResult(startDMSuccessResult)
65
69
awaitItem().also { state ->
66
- assertThat(state.startDmAction).isEqualTo(AsyncAction .Uninitialized )
67
- state.eventSink(CreateRoomRootEvents .StartDM (matrixUser))
70
+ assertThat(state.startDmAction.isUninitialized()).isTrue()
68
71
}
69
- assertThat(awaitItem().startDmAction).isInstanceOf(AsyncAction .Loading ::class .java)
72
+ }
73
+ }
74
+
75
+ @Test
76
+ fun `present - start DM action success scenario` () = runTest {
77
+ val startDMSuccessResult = AsyncAction .Success (A_ROOM_ID )
78
+ val executeResult = lambdaRecorder<MatrixUser , Boolean , MutableState <AsyncAction <RoomId >>, Unit > { _, _, actionState ->
79
+ actionState.value = startDMSuccessResult
80
+ }
81
+ val startDMAction = FakeStartDMAction (executeResult = executeResult)
82
+ val presenter = createCreateRoomRootPresenter(startDMAction)
83
+ moleculeFlow(RecompositionMode .Immediate ) {
84
+ presenter.present()
85
+ }.test {
86
+ val initialState = awaitItem()
87
+ assertThat(initialState.startDmAction).isInstanceOf(AsyncAction .Uninitialized ::class .java)
88
+ assertThat(initialState.applicationName).isEqualTo(aBuildMeta().applicationName)
89
+ assertThat(initialState.userListState.selectedUsers).isEmpty()
90
+ assertThat(initialState.userListState.isSearchActive).isFalse()
91
+ assertThat(initialState.userListState.isMultiSelectionEnabled).isFalse()
92
+ val matrixUser = MatrixUser (UserId (" @name:domain" ))
93
+ initialState.eventSink(CreateRoomRootEvents .StartDM (matrixUser))
70
94
awaitItem().also { state ->
71
95
assertThat(state.startDmAction).isEqualTo(startDMSuccessResult)
96
+ executeResult.assertions().isCalledOnce().with (
97
+ value(matrixUser),
98
+ value(false ),
99
+ any(),
100
+ )
72
101
}
73
102
}
74
103
}
75
104
105
+ @Test
106
+ fun `present - start DM action confirmation scenario - cancel` () = runTest {
107
+ val matrixUser = MatrixUser (UserId (" @name:domain" ))
108
+ val startDMConfirmationResult = ConfirmingStartDmWithMatrixUser (matrixUser)
109
+ val executeResult = lambdaRecorder<MatrixUser , Boolean , MutableState <AsyncAction <RoomId >>, Unit > { _, _, actionState ->
110
+ actionState.value = startDMConfirmationResult
111
+ }
112
+ val startDMAction = FakeStartDMAction (executeResult = executeResult)
113
+ val presenter = createCreateRoomRootPresenter(startDMAction)
114
+ moleculeFlow(RecompositionMode .Immediate ) {
115
+ presenter.present()
116
+ }.test {
117
+ val initialState = awaitItem()
118
+ assertThat(initialState.startDmAction).isInstanceOf(AsyncAction .Uninitialized ::class .java)
119
+ initialState.eventSink(CreateRoomRootEvents .StartDM (matrixUser))
120
+ val confirmingState = awaitItem()
121
+ assertThat(confirmingState.startDmAction).isEqualTo(startDMConfirmationResult)
122
+ executeResult.assertions().isCalledOnce().with (
123
+ value(matrixUser),
124
+ value(false ),
125
+ any(),
126
+ )
127
+ // Cancelling should not create the DM
128
+ confirmingState.eventSink(CreateRoomRootEvents .CancelStartDM )
129
+ val finalState = awaitItem()
130
+ assertThat(finalState.startDmAction.isUninitialized()).isTrue()
131
+ executeResult.assertions().isCalledExactly(1 )
132
+ }
133
+ }
134
+
135
+ @Test
136
+ fun `present - start DM action confirmation scenario - confirm` () = runTest {
137
+ val matrixUser = MatrixUser (UserId (" @name:domain" ))
138
+ val startDMConfirmationResult = ConfirmingStartDmWithMatrixUser (matrixUser)
139
+ val executeResult = lambdaRecorder<MatrixUser , Boolean , MutableState <AsyncAction <RoomId >>, Unit > { _, _, actionState ->
140
+ actionState.value = startDMConfirmationResult
141
+ }
142
+ val startDMAction = FakeStartDMAction (executeResult = executeResult)
143
+ val presenter = createCreateRoomRootPresenter(startDMAction)
144
+ moleculeFlow(RecompositionMode .Immediate ) {
145
+ presenter.present()
146
+ }.test {
147
+ val initialState = awaitItem()
148
+ assertThat(initialState.startDmAction).isInstanceOf(AsyncAction .Uninitialized ::class .java)
149
+ initialState.eventSink(CreateRoomRootEvents .StartDM (matrixUser))
150
+ val confirmingState = awaitItem()
151
+ assertThat(confirmingState.startDmAction).isEqualTo(startDMConfirmationResult)
152
+ executeResult.assertions().isCalledOnce().with (
153
+ value(matrixUser),
154
+ value(false ),
155
+ any(),
156
+ )
157
+ // Start DM again should invoke the action with createIfDmDoesNotExist = true
158
+ confirmingState.eventSink(CreateRoomRootEvents .StartDM (matrixUser))
159
+ executeResult.assertions().isCalledExactly(2 ).withSequence(
160
+ listOf (value(matrixUser), value(false ), any()),
161
+ listOf (value(matrixUser), value(true ), any()),
162
+ )
163
+ }
164
+ }
165
+
76
166
private fun createCreateRoomRootPresenter (
77
167
startDMAction : StartDMAction = FakeStartDMAction (),
78
168
): CreateRoomRootPresenter {
0 commit comments