@@ -30,6 +30,8 @@ void main() {
30
30
.thenAnswer ((realInvocation) => Future .value (prefs));
31
31
when (testStub.request (Permission .location))
32
32
.thenAnswer ((realInvocation) => Future .value (PermissionStatus .granted));
33
+ when (testStub.status (Permission .location))
34
+ .thenAnswer ((realInvocation) => Future .value (PermissionStatus .granted));
33
35
34
36
final config = FlutterForcePermissionConfig (
35
37
title: 'Title' ,
@@ -228,6 +230,91 @@ void main() {
228
230
await resumed.close ();
229
231
});
230
232
233
+ // If permissions are permanently denied, permission request will not show.
234
+ testWidgets ('Required permission permanently denied' , (tester) async {
235
+ final testStub = MockTestStub ();
236
+ when (testStub.getSharedPreference ())
237
+ .thenAnswer ((realInvocation) => Future .value (prefs));
238
+ when (testStub.status (Permission .location))
239
+ .thenAnswer ((realInvocation) => Future .value (PermissionStatus .permanentlyDenied));
240
+ when (testStub.openAppSettings ())
241
+ .thenAnswer ((realInvocation) => Future .value ());
242
+
243
+ final config = FlutterForcePermissionConfig (
244
+ title: 'Title' ,
245
+ confirmText: 'Confirm' ,
246
+ permissionItemConfigs: [
247
+ PermissionItemConfig (
248
+ permissions: [
249
+ Permission .location,
250
+ ],
251
+ itemText: PermissionItemText (
252
+ header: 'Foreground location' ,
253
+ rationaleText: 'Rationale' ,
254
+ forcedPermissionDialogConfig: ForcedPermissionDialogConfig (
255
+ title: 'Location required' ,
256
+ text: 'Location needed for proper operation' ,
257
+ buttonText: 'Settings' ,
258
+ ),
259
+ ),
260
+ required : true ,
261
+ ),
262
+ ],
263
+ );
264
+ final status = < Permission , PermissionServiceStatus > {
265
+ Permission .location: PermissionServiceStatus (
266
+ status: PermissionStatus .denied,
267
+ requested: false ,
268
+ serviceStatus: ServiceStatus .enabled,
269
+ ),
270
+ };
271
+ final StreamController <bool > resumed = StreamController .broadcast ()
272
+ ..add (true );
273
+
274
+ await tester.pumpWidget (
275
+ MaterialApp (
276
+ home: DisclosurePage .stub (
277
+ permissionConfig: config,
278
+ permissionStatuses: status,
279
+ service: testStub,
280
+ resumed: resumed,
281
+ ),
282
+ ),
283
+ );
284
+
285
+ expect (find.text ('Title' ), findsOneWidget);
286
+ expect (find.text ('Foreground location' ), findsOneWidget);
287
+ expect (find.text ('Rationale' ), findsOneWidget);
288
+ expect (find.text ('Confirm' ), findsOneWidget);
289
+
290
+ await tester.tap (find.text ('Confirm' ));
291
+ await tester.pump ();
292
+
293
+ expect (find.text ('Location required' ), findsOneWidget);
294
+ expect (find.text ('Location needed for proper operation' ), findsOneWidget);
295
+ expect (find.text ('Settings' ), findsOneWidget);
296
+
297
+ await tester.tap (find.text ('Settings' ));
298
+ await tester.pump ();
299
+
300
+ verify (testStub.openAppSettings ());
301
+
302
+ resumed.add (true );
303
+ await tester.pump ();
304
+
305
+ expect (find.text ('Settings' ), findsOneWidget);
306
+ await tester.tap (find.text ('Settings' ));
307
+
308
+ when (testStub.status (Permission .location))
309
+ .thenAnswer ((realInvocation) => Future .value (PermissionStatus .granted));
310
+ resumed.add (true );
311
+ await tester.pump ();
312
+
313
+ expect (find.text ('Settings' ), findsNothing);
314
+
315
+ await resumed.close ();
316
+ });
317
+
231
318
testWidgets ('Required service permission' , (tester) async {
232
319
final testStub = MockTestStub ();
233
320
when (testStub.getSharedPreference ())
0 commit comments