-
Notifications
You must be signed in to change notification settings - Fork 587
/
RequestPermissionTest.kt
124 lines (110 loc) · 4.46 KB
/
RequestPermissionTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.accompanist.permissions
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.test.filters.FlakyTest
import androidx.test.filters.SdkSuppress
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@Ignore
@OptIn(ExperimentalPermissionsApi::class)
@SdkSuppress(minSdkVersion = 23)
class RequestPermissionTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
@Before
fun setup() {
composeTestRule.setContent { ComposableUnderTest() }
}
@Test
fun permissionTest_grantPermission() {
composeTestRule.onNodeWithText("No permission").assertIsDisplayed()
composeTestRule.onNodeWithText("Request").performClick()
grantPermissionInDialog()
composeTestRule.onNodeWithText("Granted").assertIsDisplayed()
}
@Test
fun permissionTest_denyPermission() {
composeTestRule.onNodeWithText("No permission").assertIsDisplayed()
composeTestRule.onNodeWithText("Request").performClick()
denyPermissionInDialog()
composeTestRule.onNodeWithText("ShowRationale").assertIsDisplayed()
composeTestRule.onNodeWithText("Request").performClick()
grantPermissionInDialog()
composeTestRule.onNodeWithText("Granted").assertIsDisplayed()
}
@Test
fun permissionTest_doNotAskAgainPermission() {
composeTestRule.onNodeWithText("No permission").assertIsDisplayed()
composeTestRule.onNodeWithText("Request").performClick()
denyPermissionInDialog()
composeTestRule.onNodeWithText("ShowRationale").assertIsDisplayed()
composeTestRule.onNodeWithText("Request").performClick()
doNotAskAgainPermissionInDialog()
composeTestRule.onNodeWithText("No permission").assertIsDisplayed()
}
@FlakyTest
@Test
fun permissionTest_grantInTheBackground() {
composeTestRule.onNodeWithText("No permission").assertIsDisplayed()
composeTestRule.onNodeWithText("Request").performClick()
denyPermissionInDialog()
composeTestRule.onNodeWithText("ShowRationale").assertIsDisplayed()
composeTestRule.onNodeWithText("Request").performClick()
doNotAskAgainPermissionInDialog()
composeTestRule.onNodeWithText("No permission").assertIsDisplayed()
// This simulates the user going to the Settings screen and granting the permission
grantPermissionProgrammatically("android.permission.CAMERA")
simulateAppComingFromTheBackground(composeTestRule)
composeTestRule.activityRule.scenario.onActivity {
it.setContent { ComposableUnderTest() }
}
composeTestRule.onNodeWithText("Granted").assertIsDisplayed()
}
@Composable
private fun ComposableUnderTest() {
val state = rememberPermissionState(android.Manifest.permission.CAMERA)
when (state.status) {
PermissionStatus.Granted -> {
Text("Granted")
}
is PermissionStatus.Denied -> {
Column {
val textToShow = if (state.status.shouldShowRationale) {
"ShowRationale"
} else {
"No permission"
}
Text(textToShow)
Button(onClick = { state.launchPermissionRequest() }) {
Text("Request")
}
}
}
}
}
}