Skip to content

Commit 5eef211

Browse files
committed
change (member moderation) : add test on RoomMemberModerationView
1 parent 2e1eb90 commit 5eef211

File tree

1 file changed

+226
-0
lines changed

1 file changed

+226
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
package io.element.android.features.roommembermoderation.impl
9+
10+
import androidx.activity.ComponentActivity
11+
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
12+
import androidx.compose.ui.test.junit4.createAndroidComposeRule
13+
import androidx.test.ext.junit.runners.AndroidJUnit4
14+
import io.element.android.features.roommembermoderation.api.ModerationAction
15+
import io.element.android.features.roommembermoderation.api.ModerationActionState
16+
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents
17+
import io.element.android.libraries.architecture.AsyncAction
18+
import io.element.android.libraries.matrix.api.user.MatrixUser
19+
import io.element.android.libraries.testtags.TestTags
20+
import io.element.android.tests.testutils.EnsureNeverCalledWithTwoParams
21+
import io.element.android.tests.testutils.EventsRecorder
22+
import io.element.android.tests.testutils.clickOn
23+
import io.element.android.tests.testutils.ensureCalledOnceWithTwoParams
24+
import io.element.android.tests.testutils.pressTag
25+
import org.junit.Rule
26+
import org.junit.Test
27+
import org.junit.rules.TestRule
28+
import org.junit.runner.RunWith
29+
30+
@RunWith(AndroidJUnit4::class)
31+
class RoomMemberModerationViewTest {
32+
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
33+
34+
@Test
35+
fun `clicking on display profile action calls onSelectAction`() {
36+
val user = anAlice()
37+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
38+
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.DisplayProfile, user) { callback ->
39+
rule.setRoomMemberModerationView(
40+
aRoomMembersModerationState(
41+
selectedUser = user,
42+
actions = listOf(
43+
ModerationActionState(action = ModerationAction.DisplayProfile, isEnabled = true),
44+
),
45+
eventSink = eventsRecorder
46+
),
47+
onSelectAction = callback
48+
)
49+
rule.clickOn(R.string.screen_bottom_sheet_manage_room_member_member_user_info)
50+
}
51+
}
52+
53+
@Test
54+
fun `clicking on kick user action calls onSelectAction`() {
55+
val user = anAlice()
56+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
57+
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.KickUser, user) { callback ->
58+
rule.setRoomMemberModerationView(
59+
aRoomMembersModerationState(
60+
selectedUser = user,
61+
actions = listOf(
62+
ModerationActionState(action = ModerationAction.KickUser, isEnabled = true),
63+
),
64+
eventSink = eventsRecorder
65+
),
66+
onSelectAction = callback
67+
)
68+
rule.clickOn(R.string.screen_bottom_sheet_manage_room_member_remove)
69+
// Gives time for bottomsheet to hide
70+
rule.mainClock.advanceTimeBy(1_000)
71+
}
72+
}
73+
74+
@Test
75+
fun `clicking on ban user action calls onSelectAction`() {
76+
val user = anAlice()
77+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
78+
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.BanUser, user) { callback ->
79+
rule.setRoomMemberModerationView(
80+
aRoomMembersModerationState(
81+
selectedUser = user,
82+
actions = listOf(
83+
ModerationActionState(action = ModerationAction.BanUser, isEnabled = true),
84+
),
85+
eventSink = eventsRecorder
86+
),
87+
onSelectAction = callback
88+
)
89+
rule.clickOn(R.string.screen_bottom_sheet_manage_room_member_ban)
90+
// Gives time for bottomsheet to hide
91+
rule.mainClock.advanceTimeBy(1_000)
92+
}
93+
}
94+
95+
@Test
96+
fun `clicking on unban user action calls onSelectAction`() {
97+
val user = anAlice()
98+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
99+
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.UnbanUser, user) { callback ->
100+
rule.setRoomMemberModerationView(
101+
aRoomMembersModerationState(
102+
selectedUser = user,
103+
actions = listOf(
104+
ModerationActionState(action = ModerationAction.UnbanUser, isEnabled = true),
105+
),
106+
eventSink = eventsRecorder
107+
),
108+
onSelectAction = callback
109+
)
110+
rule.clickOn(R.string.screen_bottom_sheet_manage_room_member_unban)
111+
// Gives time for bottomsheet to hide
112+
rule.mainClock.advanceTimeBy(1_000)
113+
}
114+
}
115+
116+
@Test
117+
fun `clicking submit on kick confirmation dialog sends DoKickUser event`() {
118+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
119+
rule.setRoomMemberModerationView(
120+
aRoomMembersModerationState(
121+
selectedUser = anAlice(),
122+
kickUserAsyncAction = AsyncAction.ConfirmingNoParams,
123+
eventSink = eventsRecorder
124+
),
125+
)
126+
rule.pressTag(TestTags.dialogPositive.value)
127+
eventsRecorder.assertSingle(InternalRoomMemberModerationEvents.DoKickUser(reason = ""))
128+
}
129+
130+
@Test
131+
fun `clicking dismiss on kick confirmation dialog sends Reset event`() {
132+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
133+
rule.setRoomMemberModerationView(
134+
aRoomMembersModerationState(
135+
selectedUser = anAlice(),
136+
kickUserAsyncAction = AsyncAction.ConfirmingNoParams,
137+
eventSink = eventsRecorder
138+
),
139+
)
140+
rule.pressTag(TestTags.dialogNegative.value)
141+
eventsRecorder.assertSingle(InternalRoomMemberModerationEvents.Reset)
142+
}
143+
144+
@Test
145+
fun `clicking submit on ban confirmation dialog sends DoBanUser event`() {
146+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
147+
rule.setRoomMemberModerationView(
148+
aRoomMembersModerationState(
149+
selectedUser = anAlice(),
150+
banUserAsyncAction = AsyncAction.ConfirmingNoParams,
151+
eventSink = eventsRecorder
152+
),
153+
)
154+
rule.pressTag(TestTags.dialogPositive.value)
155+
eventsRecorder.assertSingle(InternalRoomMemberModerationEvents.DoBanUser(reason = ""))
156+
}
157+
158+
@Test
159+
fun `clicking dismiss on ban confirmation dialog sends Reset event`() {
160+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
161+
rule.setRoomMemberModerationView(
162+
aRoomMembersModerationState(
163+
selectedUser = anAlice(),
164+
banUserAsyncAction = AsyncAction.ConfirmingNoParams,
165+
eventSink = eventsRecorder
166+
),
167+
)
168+
rule.pressTag(TestTags.dialogNegative.value)
169+
eventsRecorder.assertSingle(InternalRoomMemberModerationEvents.Reset)
170+
}
171+
172+
@Test
173+
fun `clicking confirm on unban confirmation dialog sends DoUnbanUser event`() {
174+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
175+
rule.setRoomMemberModerationView(
176+
aRoomMembersModerationState(
177+
selectedUser = anAlice(),
178+
unbanUserAsyncAction = AsyncAction.ConfirmingNoParams,
179+
eventSink = eventsRecorder
180+
),
181+
)
182+
rule.pressTag(TestTags.dialogPositive.value)
183+
eventsRecorder.assertSingle(InternalRoomMemberModerationEvents.DoUnbanUser)
184+
}
185+
186+
@Test
187+
fun `clicking dismiss on unban confirmation dialog sends Reset event`() {
188+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
189+
rule.setRoomMemberModerationView(
190+
aRoomMembersModerationState(
191+
selectedUser = anAlice(),
192+
unbanUserAsyncAction = AsyncAction.ConfirmingNoParams,
193+
eventSink = eventsRecorder
194+
),
195+
)
196+
rule.pressTag(TestTags.dialogNegative.value)
197+
eventsRecorder.assertSingle(InternalRoomMemberModerationEvents.Reset)
198+
}
199+
200+
@Test
201+
fun `disabled actions are not clickable`() {
202+
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
203+
rule.setRoomMemberModerationView(
204+
aRoomMembersModerationState(
205+
selectedUser = anAlice(),
206+
actions = listOf(
207+
ModerationActionState(action = ModerationAction.KickUser, isEnabled = false),
208+
),
209+
eventSink = eventsRecorder
210+
),
211+
)
212+
rule.clickOn(R.string.screen_bottom_sheet_manage_room_member_remove)
213+
}
214+
}
215+
216+
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRoomMemberModerationView(
217+
state: InternalRoomMemberModerationState,
218+
onSelectAction: (ModerationAction, MatrixUser) -> Unit = EnsureNeverCalledWithTwoParams(),
219+
) {
220+
setContent {
221+
RoomMemberModerationView(
222+
state = state,
223+
onSelectAction = onSelectAction,
224+
)
225+
}
226+
}

0 commit comments

Comments
 (0)