Skip to content

Commit dfa6086

Browse files
[file_selector] Remove use of Pigeon's Dart test generator (#10315)
Updates `file_selector_ios`, `_macos`, and `_windows` tests to use the same structure as `file_selector_linux` already uses: - Removes the use of Pigeon's Dart test generator in favor of DI'ing an implementation of the actual generated Dart API. - Removes the use of `mockito` in favor of a fake, since the fake is extremely simple to maintain and it makes the tests simpler. Part of flutter/flutter#159886 ## Pre-Review Checklist [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.
1 parent f9b6795 commit dfa6086

19 files changed

+241
-916
lines changed

packages/file_selector/file_selector_ios/lib/file_selector_ios.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
// found in the LICENSE file.
44

55
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';
6+
import 'package:flutter/foundation.dart' show visibleForTesting;
67

78
import 'src/messages.g.dart';
89

910
/// An implementation of [FileSelectorPlatform] for iOS.
1011
class FileSelectorIOS extends FileSelectorPlatform {
11-
final FileSelectorApi _hostApi = FileSelectorApi();
12+
/// Creates a new plugin implementation instance.
13+
FileSelectorIOS({@visibleForTesting FileSelectorApi? api})
14+
: _hostApi = api ?? FileSelectorApi();
15+
16+
final FileSelectorApi _hostApi;
1217

1318
/// Registers the iOS implementation.
1419
static void registerWith() {

packages/file_selector/file_selector_ios/pigeons/messages.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:pigeon/pigeon.dart';
77
@ConfigurePigeon(
88
PigeonOptions(
99
dartOut: 'lib/src/messages.g.dart',
10-
dartTestOut: 'test/test_api.g.dart',
1110
swiftOut:
1211
'ios/file_selector_ios/Sources/file_selector_ios/messages.g.swift',
1312
copyrightHeader: 'pigeons/copyright.txt',
@@ -22,7 +21,7 @@ class FileSelectorConfig {
2221
bool allowMultiSelection;
2322
}
2423

25-
@HostApi(dartHostTestHandler: 'TestFileSelectorApi')
24+
@HostApi()
2625
abstract class FileSelectorApi {
2726
@async
2827
@ObjCSelector('openFileSelectorWithConfig:')

packages/file_selector/file_selector_ios/pubspec.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@ dependencies:
2222
sdk: flutter
2323

2424
dev_dependencies:
25-
build_runner: ^2.3.0
2625
flutter_test:
2726
sdk: flutter
28-
mockito: ^5.4.4
2927
pigeon: ^25.5.0
3028

3129
topics:

packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart

Lines changed: 53 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,18 @@ import 'package:file_selector_ios/file_selector_ios.dart';
66
import 'package:file_selector_ios/src/messages.g.dart';
77
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';
88
import 'package:flutter/foundation.dart';
9+
import 'package:flutter/services.dart';
910
import 'package:flutter_test/flutter_test.dart';
10-
import 'package:mockito/annotations.dart';
11-
import 'package:mockito/mockito.dart';
1211

13-
import 'file_selector_ios_test.mocks.dart';
14-
import 'test_api.g.dart';
15-
16-
@GenerateMocks(<Type>[TestFileSelectorApi])
1712
void main() {
1813
TestWidgetsFlutterBinding.ensureInitialized();
1914

20-
final FileSelectorIOS plugin = FileSelectorIOS();
21-
late MockTestFileSelectorApi mockApi;
15+
late FakeFileSelectorApi api;
16+
late FileSelectorIOS plugin;
2217

2318
setUp(() {
24-
mockApi = MockTestFileSelectorApi();
25-
TestFileSelectorApi.setUp(mockApi);
19+
api = FakeFileSelectorApi();
20+
plugin = FileSelectorIOS(api: api);
2621
});
2722

2823
test('registered instance', () {
@@ -32,7 +27,7 @@ void main() {
3227

3328
group('openFile', () {
3429
setUp(() {
35-
when(mockApi.openFile(any)).thenAnswer((_) async => <String>['foo']);
30+
api.result = <String>['foo'];
3631
});
3732

3833
test('passes the accepted type groups correctly', () async {
@@ -53,16 +48,15 @@ void main() {
5348

5449
await plugin.openFile(acceptedTypeGroups: <XTypeGroup>[group, groupTwo]);
5550

56-
final VerificationResult result = verify(mockApi.openFile(captureAny));
57-
final FileSelectorConfig config =
58-
result.captured[0] as FileSelectorConfig;
59-
6051
// iOS only accepts uniformTypeIdentifiers.
6152
expect(
62-
listEquals(config.utis, <String>['public.text', 'public.image']),
53+
listEquals(api.passedConfig?.utis, <String>[
54+
'public.text',
55+
'public.image',
56+
]),
6357
isTrue,
6458
);
65-
expect(config.allowMultiSelection, isFalse);
59+
expect(api.passedConfig?.allowMultiSelection, isFalse);
6660
});
6761
test('throws for a type group that does not support iOS', () async {
6862
const XTypeGroup group = XTypeGroup(
@@ -78,10 +72,10 @@ void main() {
7872

7973
test('correctly handles no type groups', () async {
8074
await expectLater(plugin.openFile(), completes);
81-
final VerificationResult result = verify(mockApi.openFile(captureAny));
82-
final FileSelectorConfig config =
83-
result.captured[0] as FileSelectorConfig;
84-
expect(listEquals(config.utis, <String>['public.data']), isTrue);
75+
expect(
76+
listEquals(api.passedConfig?.utis, <String>['public.data']),
77+
isTrue,
78+
);
8579
});
8680

8781
test('correctly handles a wildcard group', () async {
@@ -91,16 +85,16 @@ void main() {
9185
plugin.openFile(acceptedTypeGroups: <XTypeGroup>[group]),
9286
completes,
9387
);
94-
final VerificationResult result = verify(mockApi.openFile(captureAny));
95-
final FileSelectorConfig config =
96-
result.captured[0] as FileSelectorConfig;
97-
expect(listEquals(config.utis, <String>['public.data']), isTrue);
88+
expect(
89+
listEquals(api.passedConfig?.utis, <String>['public.data']),
90+
isTrue,
91+
);
9892
});
9993
});
10094

10195
group('openFiles', () {
10296
setUp(() {
103-
when(mockApi.openFile(any)).thenAnswer((_) async => <String>['foo']);
97+
api.result = <String>['foo'];
10498
});
10599

106100
test('passes the accepted type groups correctly', () async {
@@ -121,16 +115,14 @@ void main() {
121115

122116
await plugin.openFiles(acceptedTypeGroups: <XTypeGroup>[group, groupTwo]);
123117

124-
final VerificationResult result = verify(mockApi.openFile(captureAny));
125-
final FileSelectorConfig config =
126-
result.captured[0] as FileSelectorConfig;
127-
128-
// iOS only accepts uniformTypeIdentifiers.
129118
expect(
130-
listEquals(config.utis, <String>['public.text', 'public.image']),
119+
listEquals(api.passedConfig?.utis, <String>[
120+
'public.text',
121+
'public.image',
122+
]),
131123
isTrue,
132124
);
133-
expect(config.allowMultiSelection, isTrue);
125+
expect(api.passedConfig?.allowMultiSelection, isTrue);
134126
});
135127

136128
test('throws for a type group that does not support iOS', () async {
@@ -147,10 +139,10 @@ void main() {
147139

148140
test('correctly handles no type groups', () async {
149141
await expectLater(plugin.openFiles(), completes);
150-
final VerificationResult result = verify(mockApi.openFile(captureAny));
151-
final FileSelectorConfig config =
152-
result.captured[0] as FileSelectorConfig;
153-
expect(listEquals(config.utis, <String>['public.data']), isTrue);
142+
expect(
143+
listEquals(api.passedConfig?.utis, <String>['public.data']),
144+
isTrue,
145+
);
154146
});
155147

156148
test('correctly handles a wildcard group', () async {
@@ -160,10 +152,30 @@ void main() {
160152
plugin.openFiles(acceptedTypeGroups: <XTypeGroup>[group]),
161153
completes,
162154
);
163-
final VerificationResult result = verify(mockApi.openFile(captureAny));
164-
final FileSelectorConfig config =
165-
result.captured[0] as FileSelectorConfig;
166-
expect(listEquals(config.utis, <String>['public.data']), isTrue);
155+
expect(
156+
listEquals(api.passedConfig?.utis, <String>['public.data']),
157+
isTrue,
158+
);
167159
});
168160
});
169161
}
162+
163+
/// Fake implementation that stores arguments and provides a canned response.
164+
class FakeFileSelectorApi implements FileSelectorApi {
165+
List<String> result = <String>[];
166+
FileSelectorConfig? passedConfig;
167+
168+
@override
169+
Future<List<String>> openFile(FileSelectorConfig config) async {
170+
passedConfig = config;
171+
return result;
172+
}
173+
174+
@override
175+
// ignore: non_constant_identifier_names
176+
BinaryMessenger? get pigeonVar_binaryMessenger => null;
177+
178+
@override
179+
// ignore: non_constant_identifier_names
180+
String get pigeonVar_messageChannelSuffix => '';
181+
}

packages/file_selector/file_selector_ios/test/file_selector_ios_test.mocks.dart

Lines changed: 0 additions & 42 deletions
This file was deleted.

packages/file_selector/file_selector_ios/test/test_api.g.dart

Lines changed: 0 additions & 100 deletions
This file was deleted.

packages/file_selector/file_selector_linux/pigeons/messages.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class PlatformFileChooserOptions {
5252
final bool? selectMultiple;
5353
}
5454

55-
@HostApi(dartHostTestHandler: 'TestFileSelectorApi')
55+
@HostApi()
5656
abstract class FileSelectorApi {
5757
/// Shows an file chooser with the given [type] and [options], returning the
5858
/// list of selected paths.

packages/file_selector/file_selector_macos/lib/file_selector_macos.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
// found in the LICENSE file.
44

55
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';
6+
import 'package:flutter/foundation.dart' show visibleForTesting;
67

78
import 'src/messages.g.dart';
89

910
/// An implementation of [FileSelectorPlatform] for macOS.
1011
class FileSelectorMacOS extends FileSelectorPlatform {
11-
final FileSelectorApi _hostApi = FileSelectorApi();
12+
/// Creates a new plugin implementation instance.
13+
FileSelectorMacOS({@visibleForTesting FileSelectorApi? api})
14+
: _hostApi = api ?? FileSelectorApi();
15+
16+
final FileSelectorApi _hostApi;
1217

1318
/// Registers the macOS implementation.
1419
static void registerWith() {

0 commit comments

Comments
 (0)