Files
reelbox/test/download_android_permission_test.dart

61 lines
2.0 KiB
Dart

// Exercise the pinned Android protocol without constructing connectivity/jobs.
// ignore: implementation_imports
import 'package:background_downloader/src/permissions.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
const channel = MethodChannel('com.bbflight.background_downloader');
final messenger =
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger;
tearDown(() => messenger.setMockMethodCallHandler(channel, null));
test(
'failed permission dispatch releases slot for the next request',
() async {
final service = AndroidPermissionsService();
var calls = 0;
messenger.setMockMethodCallHandler(channel, (call) async {
if (++calls == 1) {
throw PlatformException(
code: 'activity_detached',
message: 'No activity',
);
}
service.onPermissionRequestResult(PermissionStatus.granted);
return true;
});
await expectLater(
service.request(PermissionType.notifications),
throwsA(isA<PlatformException>()),
);
expect(
await service.request(PermissionType.notifications),
PermissionStatus.granted,
);
expect(calls, 2);
},
);
test(
'notification result preceding native request reply completes request',
() async {
final service = AndroidPermissionsService();
messenger.setMockMethodCallHandler(channel, (call) async {
expect(call.method, 'requestPermission');
expect(call.arguments, PermissionType.notifications.index);
// Android may deliver its activity callback before the method reply.
service.onPermissionRequestResult(PermissionStatus.denied);
return true;
});
expect(
await service.request(PermissionType.notifications),
PermissionStatus.denied,
);
expect(service.permissionStatusCompleter, isNull);
},
);
}