Skip to content

Commit 705490d

Browse files
authored
Merge pull request #2659 from element-hq/feature/bma/moreTest
Remove some dead code and add tests on RetrySendMessageMenu
2 parents 476a54c + 20ebb5e commit 705490d

12 files changed

+130
-316
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/ExtraPadding.kt

Lines changed: 0 additions & 98 deletions
This file was deleted.

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/retrysendmenu/RetrySendMenuEvents.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import io.element.android.features.messages.impl.timeline.model.TimelineItem
2020

2121
sealed interface RetrySendMenuEvents {
2222
data class EventSelected(val event: TimelineItem.Event) : RetrySendMenuEvents
23-
data object RetrySend : RetrySendMenuEvents
24-
data object RemoveFailed : RetrySendMenuEvents
23+
data object Retry : RetrySendMenuEvents
24+
data object Remove : RetrySendMenuEvents
2525
data object Dismiss : RetrySendMenuEvents
2626
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/retrysendmenu/RetrySendMenuPresenter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ class RetrySendMenuPresenter @Inject constructor(
4141
is RetrySendMenuEvents.EventSelected -> {
4242
selectedEvent = event.event
4343
}
44-
RetrySendMenuEvents.RetrySend -> {
44+
RetrySendMenuEvents.Retry -> {
4545
coroutineScope.launch {
4646
selectedEvent?.transactionId?.let { transactionId ->
4747
room.retrySendMessage(transactionId)
4848
}
4949
selectedEvent = null
5050
}
5151
}
52-
RetrySendMenuEvents.RemoveFailed -> {
52+
RetrySendMenuEvents.Remove -> {
5353
coroutineScope.launch {
5454
selectedEvent?.transactionId?.let { transactionId ->
5555
room.cancelSend(transactionId)

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/retrysendmenu/RetrySendMessageMenu.kt

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package io.element.android.features.messages.impl.timeline.components.retrysendmenu
1818

1919
import androidx.compose.foundation.clickable
20-
import androidx.compose.foundation.layout.Column
2120
import androidx.compose.foundation.layout.ColumnScope
2221
import androidx.compose.foundation.layout.Spacer
2322
import androidx.compose.foundation.layout.height
@@ -54,18 +53,18 @@ internal fun RetrySendMessageMenu(
5453
}
5554

5655
fun onRetry() {
57-
state.eventSink(RetrySendMenuEvents.RetrySend)
56+
state.eventSink(RetrySendMenuEvents.Retry)
5857
}
5958

60-
fun onRemoveFailed() {
61-
state.eventSink(RetrySendMenuEvents.RemoveFailed)
59+
fun onRemove() {
60+
state.eventSink(RetrySendMenuEvents.Remove)
6261
}
6362

6463
RetrySendMessageMenuBottomSheet(
6564
modifier = modifier,
6665
isVisible = isVisible,
6766
onRetry = ::onRetry,
68-
onRemoveFailed = ::onRemoveFailed,
67+
onRemove = ::onRemove,
6968
onDismiss = ::onDismiss
7069
)
7170
}
@@ -75,7 +74,7 @@ internal fun RetrySendMessageMenu(
7574
private fun RetrySendMessageMenuBottomSheet(
7675
isVisible: Boolean,
7776
onRetry: () -> Unit,
78-
onRemoveFailed: () -> Unit,
77+
onRemove: () -> Unit,
7978
onDismiss: () -> Unit,
8079
modifier: Modifier = Modifier,
8180
) {
@@ -95,7 +94,10 @@ private fun RetrySendMessageMenuBottomSheet(
9594
}
9695
}
9796
) {
98-
RetrySendMenuContents(onRetry = onRetry, onRemoveFailed = onRemoveFailed)
97+
RetrySendMenuContents(
98+
onRetry = onRetry,
99+
onRemove = onRemove,
100+
)
99101
// FIXME remove after https://issuetracker.google.com/issues/275849044
100102
Spacer(modifier = Modifier.height(32.dp))
101103
}
@@ -106,7 +108,7 @@ private fun RetrySendMessageMenuBottomSheet(
106108
@Composable
107109
private fun ColumnScope.RetrySendMenuContents(
108110
onRetry: () -> Unit,
109-
onRemoveFailed: () -> Unit,
111+
onRemove: () -> Unit,
110112
sheetState: SheetState = rememberModalBottomSheetState(),
111113
) {
112114
val coroutineScope = rememberCoroutineScope()
@@ -142,22 +144,16 @@ private fun ColumnScope.RetrySendMenuContents(
142144
modifier = Modifier.clickable {
143145
coroutineScope.launch {
144146
sheetState.hide()
145-
onRemoveFailed()
147+
onRemove()
146148
}
147149
}
148150
)
149151
}
150152

151-
@Suppress("UNUSED_PARAMETER")
152-
@OptIn(ExperimentalMaterial3Api::class)
153153
@PreviewsDayNight
154154
@Composable
155155
internal fun RetrySendMessageMenuPreview(@PreviewParameter(RetrySendMenuStateProvider::class) state: RetrySendMenuState) = ElementPreview {
156-
// TODO restore RetrySendMessageMenuBottomSheet once the issue with bottom sheet not being previewable is fixed
157-
Column {
158-
RetrySendMenuContents(
159-
onRetry = {},
160-
onRemoveFailed = {},
161-
)
162-
}
156+
RetrySendMessageMenu(
157+
state = state,
158+
)
163159
}

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/retrysendmenu/RetrySendMenuPresenterTests.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ class RetrySendMenuPresenterTests {
4343
val initialState = awaitItem()
4444
val selectedEvent = aTimelineItemEvent()
4545
initialState.eventSink(RetrySendMenuEvents.EventSelected(selectedEvent))
46-
4746
assertThat(awaitItem().selectedEvent).isSameInstanceAs(selectedEvent)
4847
}
4948
}
@@ -57,8 +56,9 @@ class RetrySendMenuPresenterTests {
5756
val selectedEvent = aTimelineItemEvent()
5857
initialState.eventSink(RetrySendMenuEvents.EventSelected(selectedEvent))
5958
skipItems(1)
60-
6159
initialState.eventSink(RetrySendMenuEvents.Dismiss)
60+
assertThat(room.cancelSendCount).isEqualTo(0)
61+
assertThat(room.retrySendMessageCount).isEqualTo(0)
6262
assertThat(awaitItem().selectedEvent).isNull()
6363
}
6464
}
@@ -72,8 +72,8 @@ class RetrySendMenuPresenterTests {
7272
val selectedEvent = aTimelineItemEvent(transactionId = A_TRANSACTION_ID)
7373
initialState.eventSink(RetrySendMenuEvents.EventSelected(selectedEvent))
7474
skipItems(1)
75-
76-
initialState.eventSink(RetrySendMenuEvents.RetrySend)
75+
initialState.eventSink(RetrySendMenuEvents.Retry)
76+
assertThat(room.cancelSendCount).isEqualTo(0)
7777
assertThat(room.retrySendMessageCount).isEqualTo(1)
7878
assertThat(awaitItem().selectedEvent).isNull()
7979
}
@@ -88,8 +88,8 @@ class RetrySendMenuPresenterTests {
8888
val selectedEvent = aTimelineItemEvent(transactionId = null)
8989
initialState.eventSink(RetrySendMenuEvents.EventSelected(selectedEvent))
9090
skipItems(1)
91-
92-
initialState.eventSink(RetrySendMenuEvents.RetrySend)
91+
initialState.eventSink(RetrySendMenuEvents.Retry)
92+
assertThat(room.cancelSendCount).isEqualTo(0)
9393
assertThat(room.retrySendMessageCount).isEqualTo(0)
9494
assertThat(awaitItem().selectedEvent).isNull()
9595
}
@@ -105,8 +105,8 @@ class RetrySendMenuPresenterTests {
105105
val selectedEvent = aTimelineItemEvent(transactionId = A_TRANSACTION_ID)
106106
initialState.eventSink(RetrySendMenuEvents.EventSelected(selectedEvent))
107107
skipItems(1)
108-
109-
initialState.eventSink(RetrySendMenuEvents.RetrySend)
108+
initialState.eventSink(RetrySendMenuEvents.Retry)
109+
assertThat(room.cancelSendCount).isEqualTo(0)
110110
assertThat(room.retrySendMessageCount).isEqualTo(1)
111111
assertThat(awaitItem().selectedEvent).isNull()
112112
}
@@ -121,9 +121,9 @@ class RetrySendMenuPresenterTests {
121121
val selectedEvent = aTimelineItemEvent(transactionId = A_TRANSACTION_ID)
122122
initialState.eventSink(RetrySendMenuEvents.EventSelected(selectedEvent))
123123
skipItems(1)
124-
125-
initialState.eventSink(RetrySendMenuEvents.RemoveFailed)
124+
initialState.eventSink(RetrySendMenuEvents.Remove)
126125
assertThat(room.cancelSendCount).isEqualTo(1)
126+
assertThat(room.retrySendMessageCount).isEqualTo(0)
127127
assertThat(awaitItem().selectedEvent).isNull()
128128
}
129129
}
@@ -137,9 +137,9 @@ class RetrySendMenuPresenterTests {
137137
val selectedEvent = aTimelineItemEvent(transactionId = null)
138138
initialState.eventSink(RetrySendMenuEvents.EventSelected(selectedEvent))
139139
skipItems(1)
140-
141-
initialState.eventSink(RetrySendMenuEvents.RemoveFailed)
140+
initialState.eventSink(RetrySendMenuEvents.Remove)
142141
assertThat(room.cancelSendCount).isEqualTo(0)
142+
assertThat(room.retrySendMessageCount).isEqualTo(0)
143143
assertThat(awaitItem().selectedEvent).isNull()
144144
}
145145
}
@@ -154,9 +154,9 @@ class RetrySendMenuPresenterTests {
154154
val selectedEvent = aTimelineItemEvent(transactionId = A_TRANSACTION_ID)
155155
initialState.eventSink(RetrySendMenuEvents.EventSelected(selectedEvent))
156156
skipItems(1)
157-
158-
initialState.eventSink(RetrySendMenuEvents.RemoveFailed)
157+
initialState.eventSink(RetrySendMenuEvents.Remove)
159158
assertThat(room.cancelSendCount).isEqualTo(1)
159+
assertThat(room.retrySendMessageCount).isEqualTo(0)
160160
assertThat(awaitItem().selectedEvent).isNull()
161161
}
162162
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* Copyright (c) 2024 New Vector Ltd
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.element.android.features.messages.impl.timeline.components.retrysendmenu
18+
19+
import androidx.activity.ComponentActivity
20+
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
21+
import androidx.compose.ui.test.junit4.createAndroidComposeRule
22+
import androidx.test.ext.junit.runners.AndroidJUnit4
23+
import io.element.android.features.messages.impl.R
24+
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
25+
import io.element.android.libraries.ui.strings.CommonStrings
26+
import io.element.android.tests.testutils.EventsRecorder
27+
import io.element.android.tests.testutils.clickOn
28+
import io.element.android.tests.testutils.pressBackKey
29+
import org.junit.Rule
30+
import org.junit.Test
31+
import org.junit.rules.TestRule
32+
import org.junit.runner.RunWith
33+
import org.robolectric.annotation.Config
34+
35+
@RunWith(AndroidJUnit4::class)
36+
class RetrySendMessageMenuTest {
37+
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
38+
39+
@Test
40+
fun `dismiss the bottom sheet emits the expected event`() {
41+
val eventsRecorder = EventsRecorder<RetrySendMenuEvents>()
42+
rule.setRetrySendMessageMenu(
43+
aRetrySendMenuState(
44+
event = aTimelineItemEvent(),
45+
eventSink = eventsRecorder
46+
),
47+
)
48+
rule.pressBackKey()
49+
// Cannot test this for now.
50+
// eventsRecorder.assertSingle(RetrySendMenuEvents.Dismiss)
51+
}
52+
53+
@Config(qualifiers = "h1024dp")
54+
@Test
55+
fun `retry to send the event emits the expected event`() {
56+
val eventsRecorder = EventsRecorder<RetrySendMenuEvents>()
57+
rule.setRetrySendMessageMenu(
58+
aRetrySendMenuState(
59+
event = aTimelineItemEvent(),
60+
eventSink = eventsRecorder
61+
),
62+
)
63+
rule.clickOn(R.string.screen_room_retry_send_menu_send_again_action)
64+
eventsRecorder.assertSingle(RetrySendMenuEvents.Retry)
65+
}
66+
67+
@Config(qualifiers = "h1024dp")
68+
@Test
69+
fun `remove the event emits the expected event`() {
70+
val eventsRecorder = EventsRecorder<RetrySendMenuEvents>()
71+
rule.setRetrySendMessageMenu(
72+
aRetrySendMenuState(
73+
event = aTimelineItemEvent(),
74+
eventSink = eventsRecorder
75+
),
76+
)
77+
rule.clickOn(CommonStrings.action_remove)
78+
eventsRecorder.assertSingle(RetrySendMenuEvents.Remove)
79+
}
80+
}
81+
82+
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRetrySendMessageMenu(
83+
state: RetrySendMenuState,
84+
) {
85+
setContent {
86+
RetrySendMessageMenu(
87+
state = state,
88+
)
89+
}
90+
}

0 commit comments

Comments
 (0)