@@ -3,8 +3,8 @@ package dev.aungkyawpaing.ccdroidx.feature.notification.prompt
3
3
import android.content.Context
4
4
import android.content.Intent
5
5
import android.provider.Settings
6
+ import androidx.compose.ui.test.ExperimentalTestApi
6
7
import androidx.compose.ui.test.assertIsDisplayed
7
- import androidx.compose.ui.test.junit4.createComposeRule
8
8
import androidx.compose.ui.test.onNodeWithContentDescription
9
9
import androidx.compose.ui.test.onNodeWithText
10
10
import androidx.compose.ui.test.performClick
@@ -13,93 +13,122 @@ import androidx.test.espresso.intent.Intents
13
13
import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction
14
14
import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra
15
15
import androidx.test.espresso.intent.matcher.IntentMatchers.hasFlag
16
+ import de.mannodermaus.junit5.compose.createComposeExtension
16
17
import dev.aungkyawpaing.ccdroidx.R
18
+ import io.mockk.every
17
19
import io.mockk.mockk
18
20
import io.mockk.verify
21
+ import kotlinx.coroutines.flow.flowOf
22
+ import kotlinx.coroutines.flow.stateIn
23
+ import kotlinx.coroutines.test.runTest
19
24
import org.hamcrest.CoreMatchers.allOf
20
- import org.junit.Rule
21
- import org.junit.Test
25
+ import org.junit.jupiter.api.BeforeEach
22
26
import org.junit.jupiter.api.DisplayName
27
+ import org.junit.jupiter.api.Nested
28
+ import org.junit.jupiter.api.Test
29
+ import org.junit.jupiter.api.extension.RegisterExtension
23
30
31
+ @ExperimentalTestApi
24
32
class NotificationPromptTest {
25
33
26
- @get:Rule
27
- val composeTestRule = createComposeRule()
34
+ @JvmField
35
+ @RegisterExtension
36
+ val extension = createComposeExtension()
37
+
38
+ val notificationPromptViewModel: NotificationPromptViewModel = mockk(relaxed = true )
28
39
29
40
private val notificationPromptText = ApplicationProvider .getApplicationContext<Context >()
30
41
.getString(R .string.notification_prompt_body)
31
42
32
43
@Test
33
44
@DisplayName(" does not render Notification Prompt Card when prompt should not be visible" )
34
- fun doesNotRenderNotificationPromptCardWhenPromptIsNotVisible () {
35
- composeTestRule.setContent {
36
- NotificationPrompt (
37
- false ,
38
- {}
39
- )
45
+ fun doesNotRenderNotificationPromptCardWhenPromptIsNotVisible () = runTest {
46
+ every {
47
+ notificationPromptViewModel.promptIsVisible
48
+ } returns flowOf(false ).stateIn(this )
49
+
50
+ extension.use {
51
+ setContent {
52
+ NotificationPrompt (
53
+ notificationPromptViewModel
54
+ )
55
+ }
56
+
57
+ onNodeWithText(notificationPromptText).assertDoesNotExist()
40
58
}
41
-
42
- composeTestRule.onNodeWithText(notificationPromptText).assertDoesNotExist()
43
59
}
44
60
45
- @Test
46
- @DisplayName(" render Notification Prompt Card when prompt should be visible" )
47
- fun renderNotificationCardWhenPromptIsVisible () {
48
- composeTestRule.setContent {
49
- NotificationPrompt (
50
- true ,
51
- {}
52
- )
53
- }
54
-
55
- composeTestRule.onNodeWithText(notificationPromptText).assertIsDisplayed()
56
- composeTestRule.onNodeWithText(" ENABLE NOTIFICATION" ).assertIsDisplayed()
57
- }
61
+ @Nested
62
+ @DisplayName(" When prompt should be visible" )
63
+ internal inner class WhenPromptIsVisible {
58
64
59
- @Test
60
- @DisplayName(" invoke onDismissClick on clicking dismiss" )
61
- fun invokeOnDismissClickOnClickingDismiss () {
62
- val onDismissPrompt = mockk< () -> Unit > (relaxed = true )
63
- composeTestRule.setContent {
64
- NotificationPrompt (
65
- true ,
66
- onDismissPrompt
67
- )
65
+ @BeforeEach
66
+ fun setUp () = runTest {
67
+ every {
68
+ notificationPromptViewModel.promptIsVisible
69
+ } returns flowOf(true ).stateIn(this )
68
70
}
69
71
70
- val contentDescription = ApplicationProvider .getApplicationContext<Context >()
71
- .getString(R .string.notification_prompt_close_content_description)
72
- composeTestRule.onNodeWithContentDescription(contentDescription).assertIsDisplayed()
73
- composeTestRule.onNodeWithContentDescription(contentDescription).performClick()
74
-
75
- verify(exactly = 1 ) {
76
- onDismissPrompt()
72
+ @Test
73
+ @DisplayName(" render Notification Prompt Card " )
74
+ fun renderNotificationCardWhenPromptIsVisible () {
75
+ extension.use {
76
+ setContent {
77
+ NotificationPrompt (
78
+ notificationPromptViewModel
79
+ )
80
+ }
81
+
82
+ onNodeWithText(notificationPromptText).assertIsDisplayed()
83
+ }
77
84
}
78
- }
79
85
80
- @Test
81
- @DisplayName(" invoke onEnableNotification on clicking enable notification" )
82
- fun invokeOnEnableNotificationOnClickingEnableNotification () {
83
- val context = ApplicationProvider .getApplicationContext<Context >()
84
- Intents .init ()
85
-
86
- composeTestRule.setContent {
87
- NotificationPrompt (
88
- true ,
89
- {}
90
- )
86
+ @Test
87
+ @DisplayName(" invoke onDismissClick on clicking dismiss" )
88
+ fun invokeOnDismissClickOnClickingDismiss () {
89
+ extension.use {
90
+ setContent {
91
+ NotificationPrompt (
92
+ notificationPromptViewModel
93
+ )
94
+ }
95
+
96
+ val contentDescription = ApplicationProvider .getApplicationContext<Context >()
97
+ .getString(R .string.notification_prompt_close_content_description)
98
+ onNodeWithContentDescription(contentDescription).assertIsDisplayed()
99
+ onNodeWithContentDescription(contentDescription).performClick()
100
+ }
101
+
102
+ verify(exactly = 1 ) {
103
+ notificationPromptViewModel.onDismissClick()
104
+ }
91
105
}
92
106
93
- composeTestRule.onNodeWithText(" ENABLE NOTIFICATION" ).performClick()
94
-
95
- Intents .intended(
96
- allOf(
97
- hasAction(Settings .ACTION_APP_NOTIFICATION_SETTINGS ),
98
- hasExtra(Settings .EXTRA_APP_PACKAGE , context.packageName),
99
- hasFlag(Intent .FLAG_ACTIVITY_NEW_TASK )
107
+ @Test
108
+ @DisplayName(" open notification settings on clicking enable notification" )
109
+ fun invokeOnEnableNotificationOnClickingEnableNotification () {
110
+ val context = ApplicationProvider .getApplicationContext<Context >()
111
+ Intents .init ()
112
+
113
+ extension.use {
114
+ setContent {
115
+ NotificationPrompt (
116
+ notificationPromptViewModel
117
+ )
118
+ }
119
+
120
+ onNodeWithText(" ENABLE NOTIFICATION" ).performClick()
121
+ }
122
+
123
+ Intents .intended(
124
+ allOf(
125
+ hasAction(Settings .ACTION_APP_NOTIFICATION_SETTINGS ),
126
+ hasExtra(Settings .EXTRA_APP_PACKAGE , context.packageName),
127
+ hasFlag(Intent .FLAG_ACTIVITY_NEW_TASK )
128
+ )
100
129
)
101
- )
102
130
103
- Intents .release()
131
+ Intents .release()
132
+ }
104
133
}
105
134
}
0 commit comments