Merge branch 'develop' into feature/bma/removeExternalCallSupport

This commit is contained in:
Benoit Marty 2026-04-30 16:58:11 +02:00
commit e21276f323
122 changed files with 2266 additions and 2352 deletions

View file

@ -6,14 +6,17 @@
* Please see LICENSE files in the repository root for full details.
*/
@file:OptIn(ExperimentalTestApi::class)
package io.element.android.features.roomdetails.impl
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.AndroidComposeUiTest
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.v2.runAndroidComposeUiTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.features.roomdetails.impl.members.aRoomMember
import io.element.android.features.userprofile.shared.aUserProfileState
@ -32,98 +35,94 @@ import io.element.android.tests.testutils.clickOn
import io.element.android.tests.testutils.ensureCalledOnce
import io.element.android.tests.testutils.ensureCalledOnceWithParam
import io.element.android.tests.testutils.pressBack
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
class RoomDetailsViewTest {
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
@Test
fun `click on back invokes expected callback`() {
fun `click on back invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
goBack = callback,
)
rule.pressBack()
pressBack()
}
}
@Test
fun `click on share invokes expected callback`() {
fun `click on share invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
onShareRoom = callback,
)
rule.clickOn(CommonStrings.action_share)
clickOn(CommonStrings.action_share)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on room members invokes expected callback`() {
fun `click on room members invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
openRoomMemberList = callback,
)
rule.clickOn(CommonStrings.common_people)
clickOn(CommonStrings.common_people)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on polls invokes expected callback`() {
fun `click on polls invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
openPollHistory = callback,
)
rule.clickOn(R.string.screen_polls_history_title)
clickOn(R.string.screen_polls_history_title)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on media gallery invokes expected callback`() {
fun `click on media gallery invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
openMediaGallery = callback,
)
rule.clickOn(R.string.screen_room_details_media_gallery_title)
clickOn(R.string.screen_room_details_media_gallery_title)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on notification invokes expected callback`() {
fun `click on notification invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
openRoomNotificationSettings = callback,
)
rule.clickOn(R.string.screen_room_details_notification_title)
clickOn(R.string.screen_room_details_notification_title)
}
}
@Test
fun `click on invite invokes expected callback`() {
fun `click on invite invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
canInvite = true,
),
invitePeople = callback,
)
rule.clickOn(CommonStrings.action_invite)
clickOn(CommonStrings.action_invite)
}
}
@Test
fun `click on call invokes expected callback`() {
fun `click on call invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnceWithParam(CallIntent.AUDIO) { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
canInvite = true,
@ -134,103 +133,103 @@ class RoomDetailsViewTest {
),
onJoinCallClick = callback,
)
rule.clickOn(CommonStrings.action_call)
clickOn(CommonStrings.action_call)
}
}
@Test
fun `click on video call invokes expected callback`() {
fun `click on video call invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnceWithParam(CallIntent.VIDEO) { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
canInvite = true,
),
onJoinCallClick = callback,
)
rule.clickOn(CommonStrings.common_video)
clickOn(CommonStrings.common_video)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on pinned messages invokes expected callback`() {
fun `click on pinned messages invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
canInvite = true,
),
onPinnedMessagesClick = callback,
)
rule.clickOn(R.string.screen_room_details_pinned_events_row_title)
clickOn(R.string.screen_room_details_pinned_events_row_title)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on security and privacy invokes expected callback`() {
fun `click on security and privacy invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
canShowSecurityAndPrivacy = true,
),
onSecurityAndPrivacyClick = callback,
)
rule.clickOn(R.string.screen_room_details_security_and_privacy_title)
clickOn(R.string.screen_room_details_security_and_privacy_title)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on add topic emit expected event`() {
fun `click on add topic emit expected event`() = runAndroidComposeUiTest {
ensureCalledOnceWithParam<RoomDetailsAction>(RoomDetailsAction.AddTopic) { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
roomTopic = RoomTopicState.CanAddTopic,
),
onActionClick = callback,
)
rule.clickOn(R.string.screen_room_details_add_topic_title)
clickOn(R.string.screen_room_details_add_topic_title)
}
}
@Test
fun `click on menu edit emit expected event`() {
fun `click on menu edit emit expected event`() = runAndroidComposeUiTest {
ensureCalledOnceWithParam<RoomDetailsAction>(RoomDetailsAction.Edit) { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
canEdit = true,
),
onActionClick = callback,
)
val menuContentDescription = rule.activity.getString(CommonStrings.a11y_user_menu)
rule.onNodeWithContentDescription(menuContentDescription).performClick()
rule.clickOn(CommonStrings.action_edit)
val menuContentDescription = activity!!.getString(CommonStrings.a11y_user_menu)
onNodeWithContentDescription(menuContentDescription).performClick()
clickOn(CommonStrings.action_edit)
}
}
@Test
fun `click on avatar test`() {
fun `click on avatar test`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomDetailsEvent>(expectEvents = false)
val state = aRoomDetailsState(
eventSink = eventsRecorder,
roomAvatarUrl = "an_avatar_url",
)
val callback = EnsureCalledOnceWithTwoParams(state.roomName, "an_avatar_url")
rule.setRoomDetailView(
setRoomDetailView(
state = state,
openAvatarPreview = callback,
)
rule.onNodeWithTag(TestTags.roomDetailAvatar.value).performClick()
onNodeWithTag(TestTags.roomDetailAvatar.value).performClick()
callback.assertSuccess()
}
@Test
fun `click on avatar test on DM`() {
fun `click on avatar test on DM`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomDetailsEvent>(expectEvents = false)
val state = aRoomDetailsState(
roomType = RoomDetailsType.Dm(
@ -241,114 +240,114 @@ class RoomDetailsViewTest {
eventSink = eventsRecorder,
)
val callback = EnsureCalledOnceWithTwoParams("Daniel", "an_avatar_url")
rule.setRoomDetailView(
setRoomDetailView(
state = state,
openAvatarPreview = callback,
)
rule.onNodeWithTag(TestTags.memberDetailAvatar.value).performClick()
onNodeWithTag(TestTags.memberDetailAvatar.value).performClick()
callback.assertSuccess()
}
@Test
fun `click on mute emit expected event`() {
fun `click on mute emit expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomDetailsEvent>()
val state = aRoomDetailsState(
eventSink = eventsRecorder,
roomNotificationSettings = aRoomNotificationSettings(mode = RoomNotificationMode.ALL_MESSAGES),
)
rule.setRoomDetailView(
setRoomDetailView(
state = state,
)
rule.clickOn(CommonStrings.common_mute)
clickOn(CommonStrings.common_mute)
eventsRecorder.assertSingle(RoomDetailsEvent.MuteNotification)
}
@Test
fun `click on unmute emit expected event`() {
fun `click on unmute emit expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomDetailsEvent>()
val state = aRoomDetailsState(
eventSink = eventsRecorder,
roomNotificationSettings = aRoomNotificationSettings(mode = RoomNotificationMode.MUTE),
)
rule.setRoomDetailView(
setRoomDetailView(
state = state,
)
rule.clickOn(CommonStrings.common_unmute)
clickOn(CommonStrings.common_unmute)
eventsRecorder.assertSingle(RoomDetailsEvent.UnmuteNotification)
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on favorite emit expected Event`() {
fun `click on favorite emit expected Event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomDetailsEvent>()
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.common_favourite)
clickOn(CommonStrings.common_favourite)
eventsRecorder.assertSingle(RoomDetailsEvent.SetFavorite(true))
}
@Config(qualifiers = "h1500dp")
@Test
fun `click on leave emit expected Event`() {
fun `click on leave emit expected Event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomDetailsEvent>()
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = eventsRecorder,
),
)
rule.clickOn(R.string.screen_room_details_leave_room_title)
clickOn(R.string.screen_room_details_leave_room_title)
eventsRecorder.assertSingle(RoomDetailsEvent.LeaveRoom(needsConfirmation = true))
}
@Config(qualifiers = "h1500dp")
@Test
fun `click on report room invokes expected callback`() {
fun `click on report room invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
),
onReportRoomClick = callback,
)
rule.clickOn(CommonStrings.action_report_room)
clickOn(CommonStrings.action_report_room)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on knock requests invokes expected callback`() {
fun `click on knock requests invokes expected callback`() = runAndroidComposeUiTest {
ensureCalledOnce { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
canShowKnockRequests = true,
),
onKnockRequestsClick = callback,
)
rule.clickOn(R.string.screen_room_details_requests_to_join_title)
clickOn(R.string.screen_room_details_requests_to_join_title)
}
}
@Config(qualifiers = "h1024dp")
@Test
fun `click on profile invokes the expected callback`() {
fun `click on profile invokes the expected callback`() = runAndroidComposeUiTest {
ensureCalledOnceWithParam(A_USER_ID) { callback ->
rule.setRoomDetailView(
setRoomDetailView(
state = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
roomMemberDetailsState = aUserProfileState(userId = A_USER_ID),
),
onProfileClick = callback,
)
rule.clickOn(R.string.screen_room_details_profile_row_title)
clickOn(R.string.screen_room_details_profile_row_title)
}
}
}
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRoomDetailView(
private fun AndroidComposeUiTest<ComponentActivity>.setRoomDetailView(
state: RoomDetailsState = aRoomDetailsState(
eventSink = EventsRecorder(expectEvents = false),
),