Skip to content

Commit 52af70a

Browse files
committed
Add UI test on MediaDetailsBottomSheet
1 parent 5c41de6 commit 52af70a

File tree

3 files changed

+185
-1
lines changed

3 files changed

+185
-1
lines changed

libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ import io.element.android.libraries.mediaviewer.api.anImageMediaInfo
1212

1313
fun aMediaDetailsBottomSheetState(
1414
dateSentFull: String = "December 6, 2024 at 12:59",
15+
canDelete: Boolean = true,
1516
): MediaBottomSheetState.MediaDetailsBottomSheetState {
1617
return MediaBottomSheetState.MediaDetailsBottomSheetState(
1718
eventId = EventId("\$eventId"),
18-
canDelete = true,
19+
canDelete = canDelete,
1920
mediaInfo = anImageMediaInfo(
2021
senderName = "Alice",
2122
dateSentFull = dateSentFull,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.mediaviewer.impl.details
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.compose.ui.test.onNodeWithText
14+
import androidx.test.ext.junit.runners.AndroidJUnit4
15+
import io.element.android.libraries.matrix.api.core.EventId
16+
import io.element.android.libraries.ui.strings.CommonStrings
17+
import io.element.android.tests.testutils.EnsureNeverCalled
18+
import io.element.android.tests.testutils.EnsureNeverCalledWithParam
19+
import io.element.android.tests.testutils.clickOn
20+
import io.element.android.tests.testutils.ensureCalledOnce
21+
import io.element.android.tests.testutils.ensureCalledOnceWithParam
22+
import org.junit.Rule
23+
import org.junit.Test
24+
import org.junit.rules.TestRule
25+
import org.junit.runner.RunWith
26+
27+
@RunWith(AndroidJUnit4::class)
28+
class MediaDeleteConfirmationBottomSheetTest {
29+
@get:Rule
30+
val rule = createAndroidComposeRule<ComponentActivity>()
31+
32+
@Test
33+
fun `clicking on Cancel invokes expected callback`() {
34+
val state = aMediaDeleteConfirmationState()
35+
ensureCalledOnce { callback ->
36+
rule.setMediaDeleteConfirmationBottomSheet(
37+
state = state,
38+
onDismiss = callback,
39+
)
40+
rule.clickOn(CommonStrings.action_cancel)
41+
}
42+
}
43+
44+
@Test
45+
fun `clicking on Remove invokes expected callback`() {
46+
val state = aMediaDeleteConfirmationState()
47+
ensureCalledOnceWithParam(state.eventId) { callback ->
48+
rule.setMediaDeleteConfirmationBottomSheet(
49+
state = state,
50+
onDelete = callback,
51+
)
52+
rule.onNodeWithText(rule.activity.getString(CommonStrings.action_remove)).assertExists()
53+
rule.clickOn(CommonStrings.action_remove)
54+
}
55+
}
56+
}
57+
58+
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setMediaDeleteConfirmationBottomSheet(
59+
state: MediaBottomSheetState.MediaDeleteConfirmationState,
60+
onDelete: (EventId) -> Unit = EnsureNeverCalledWithParam(),
61+
onDismiss: () -> Unit = EnsureNeverCalled(),
62+
) {
63+
setContent {
64+
MediaDeleteConfirmationBottomSheet(
65+
state = state,
66+
onDelete = onDelete,
67+
onDismiss = onDismiss,
68+
)
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.mediaviewer.impl.details
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.compose.ui.test.onNodeWithText
14+
import androidx.test.ext.junit.runners.AndroidJUnit4
15+
import io.element.android.libraries.matrix.api.core.EventId
16+
import io.element.android.libraries.ui.strings.CommonStrings
17+
import io.element.android.tests.testutils.EnsureNeverCalled
18+
import io.element.android.tests.testutils.EnsureNeverCalledWithParam
19+
import io.element.android.tests.testutils.clickOn
20+
import io.element.android.tests.testutils.ensureCalledOnceWithParam
21+
import org.junit.Rule
22+
import org.junit.Test
23+
import org.junit.rules.TestRule
24+
import org.junit.runner.RunWith
25+
import org.robolectric.annotation.Config
26+
27+
@RunWith(AndroidJUnit4::class)
28+
class MediaDetailsBottomSheetTest {
29+
@get:Rule
30+
val rule = createAndroidComposeRule<ComponentActivity>()
31+
32+
@Test
33+
fun `clicking on View in timeline invokes expected callback`() {
34+
val state = aMediaDetailsBottomSheetState()
35+
ensureCalledOnceWithParam(state.eventId) { callback ->
36+
rule.setMediaDetailsBottomSheet(
37+
state = state,
38+
onViewInTimeline = callback,
39+
)
40+
rule.clickOn(CommonStrings.action_view_in_timeline)
41+
}
42+
}
43+
44+
@Test
45+
fun `clicking on Share invokes expected callback`() {
46+
val state = aMediaDetailsBottomSheetState()
47+
ensureCalledOnceWithParam(state.eventId) { callback ->
48+
rule.setMediaDetailsBottomSheet(
49+
state = state,
50+
onShare = callback,
51+
)
52+
rule.clickOn(CommonStrings.action_share)
53+
}
54+
}
55+
56+
@Test
57+
fun `clicking on Save invokes expected callback`() {
58+
val state = aMediaDetailsBottomSheetState()
59+
ensureCalledOnceWithParam(state.eventId) { callback ->
60+
rule.setMediaDetailsBottomSheet(
61+
state = state,
62+
onDownload = callback,
63+
)
64+
rule.clickOn(CommonStrings.action_save)
65+
}
66+
}
67+
68+
@Config(qualifiers = "h1024dp")
69+
@Test
70+
fun `clicking on Remove invokes expected callback`() {
71+
val state = aMediaDetailsBottomSheetState()
72+
ensureCalledOnceWithParam(state.eventId) { callback ->
73+
rule.setMediaDetailsBottomSheet(
74+
state = state,
75+
onDelete = callback,
76+
)
77+
rule.onNodeWithText(rule.activity.getString(CommonStrings.action_remove)).assertExists()
78+
rule.clickOn(CommonStrings.action_remove)
79+
}
80+
}
81+
82+
@Config(qualifiers = "h1024dp")
83+
@Test
84+
fun `Remove is not present if canDelete is false`() {
85+
val state = aMediaDetailsBottomSheetState(
86+
canDelete = false,
87+
)
88+
rule.setMediaDetailsBottomSheet(
89+
state = state,
90+
)
91+
rule.onNodeWithText(rule.activity.getString(CommonStrings.action_remove)).assertDoesNotExist()
92+
}
93+
}
94+
95+
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setMediaDetailsBottomSheet(
96+
state: MediaBottomSheetState.MediaDetailsBottomSheetState,
97+
onViewInTimeline: (EventId) -> Unit = EnsureNeverCalledWithParam(),
98+
onShare: (EventId) -> Unit = EnsureNeverCalledWithParam(),
99+
onDownload: (EventId) -> Unit = EnsureNeverCalledWithParam(),
100+
onDelete: (EventId) -> Unit = EnsureNeverCalledWithParam(),
101+
onDismiss: () -> Unit = EnsureNeverCalled(),
102+
) {
103+
setContent {
104+
MediaDetailsBottomSheet(
105+
state = state,
106+
onViewInTimeline = onViewInTimeline,
107+
onShare = onShare,
108+
onDownload = onDownload,
109+
onDelete = onDelete,
110+
onDismiss = onDismiss,
111+
)
112+
}
113+
}

0 commit comments

Comments
 (0)