blob: 7e94161d4a4064b548d0758cab000f612adcbc6b [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:image_picker_macos/image_picker_macos.dart';
import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'image_picker_macos_test.mocks.dart';
@GenerateMocks(<Type>[FileSelectorPlatform])
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
// Returns the captured type groups from a mock call result, assuming that
// exactly one call was made and only the type groups were captured.
List<XTypeGroup> capturedTypeGroups(VerificationResult result) {
return result.captured.single as List<XTypeGroup>;
}
late ImagePickerMacOS plugin;
late MockFileSelectorPlatform mockFileSelectorPlatform;
setUp(() {
plugin = ImagePickerMacOS();
mockFileSelectorPlatform = MockFileSelectorPlatform();
when(mockFileSelectorPlatform.openFile(
acceptedTypeGroups: anyNamed('acceptedTypeGroups')))
.thenAnswer((_) async => null);
when(mockFileSelectorPlatform.openFiles(
acceptedTypeGroups: anyNamed('acceptedTypeGroups')))
.thenAnswer((_) async => List<XFile>.empty());
ImagePickerMacOS.fileSelector = mockFileSelectorPlatform;
});
test('registered instance', () {
ImagePickerMacOS.registerWith();
expect(ImagePickerPlatform.instance, isA<ImagePickerMacOS>());
});
group('images', () {
test('pickImage passes the accepted type groups correctly', () async {
await plugin.pickImage(source: ImageSource.gallery);
final VerificationResult result = verify(mockFileSelectorPlatform
.openFile(acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
expect(capturedTypeGroups(result)[0].uniformTypeIdentifiers,
<String>['public.image']);
});
test('getImage passes the accepted type groups correctly', () async {
await plugin.getImage(source: ImageSource.gallery);
final VerificationResult result = verify(mockFileSelectorPlatform
.openFile(acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
expect(capturedTypeGroups(result)[0].uniformTypeIdentifiers,
<String>['public.image']);
});
test('getImageFromSource passes the accepted type groups correctly',
() async {
await plugin.getImageFromSource(source: ImageSource.gallery);
final VerificationResult result = verify(mockFileSelectorPlatform
.openFile(acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
expect(capturedTypeGroups(result)[0].uniformTypeIdentifiers,
<String>['public.image']);
});
test('getImageFromSource calls delegate when source is camera', () async {
const String fakePath = '/tmp/foo';
plugin.cameraDelegate = FakeCameraDelegate(result: XFile(fakePath));
expect(
(await plugin.getImageFromSource(source: ImageSource.camera))!.path,
fakePath);
});
test(
'getImageFromSource throws StateError when source is camera with no delegate',
() async {
await expectLater(plugin.getImageFromSource(source: ImageSource.camera),
throwsStateError);
});
test('getMultiImage passes the accepted type groups correctly', () async {
await plugin.getMultiImage();
final VerificationResult result = verify(
mockFileSelectorPlatform.openFiles(
acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
expect(capturedTypeGroups(result)[0].uniformTypeIdentifiers,
<String>['public.image']);
});
});
group('videos', () {
test('pickVideo passes the accepted type groups correctly', () async {
await plugin.pickVideo(source: ImageSource.gallery);
final VerificationResult result = verify(mockFileSelectorPlatform
.openFile(acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
expect(capturedTypeGroups(result)[0].uniformTypeIdentifiers,
<String>['public.movie']);
});
test('getVideo passes the accepted type groups correctly', () async {
await plugin.getVideo(source: ImageSource.gallery);
final VerificationResult result = verify(mockFileSelectorPlatform
.openFile(acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
expect(capturedTypeGroups(result)[0].uniformTypeIdentifiers,
<String>['public.movie']);
});
test('getVideo calls delegate when source is camera', () async {
const String fakePath = '/tmp/foo';
plugin.cameraDelegate = FakeCameraDelegate(result: XFile(fakePath));
expect(
(await plugin.getVideo(source: ImageSource.camera))!.path, fakePath);
});
test('getVideo throws StateError when source is camera with no delegate',
() async {
await expectLater(
plugin.getVideo(source: ImageSource.camera), throwsStateError);
});
});
group('media', () {
test('getMedia passes the accepted type groups correctly', () async {
await plugin.getMedia(options: const MediaOptions(allowMultiple: true));
final VerificationResult result = verify(
mockFileSelectorPlatform.openFiles(
acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
expect(capturedTypeGroups(result)[0].extensions,
<String>['public.image', 'public.movie']);
});
test('multiple media handles an empty path response gracefully', () async {
expect(
await plugin.getMedia(
options: const MediaOptions(
allowMultiple: true,
),
),
<String>[]);
});
test('single media handles an empty path response gracefully', () async {
expect(
await plugin.getMedia(
options: const MediaOptions(
allowMultiple: false,
),
),
<String>[]);
});
});
}
class FakeCameraDelegate extends ImagePickerCameraDelegate {
FakeCameraDelegate({this.result});
XFile? result;
@override
Future<XFile?> takePhoto(
{ImagePickerCameraDelegateOptions options =
const ImagePickerCameraDelegateOptions()}) async {
return result;
}
@override
Future<XFile?> takeVideo(
{ImagePickerCameraDelegateOptions options =
const ImagePickerCameraDelegateOptions()}) async {
return result;
}
}