Skip to content

Commit 03d34e2

Browse files
[file_selector] Remove OCMock from iOS implementation (#6503)
To aid in future conversion to Swift, remove the use of OCMock in favor of a protocol and an explicit stub.
1 parent 488da36 commit 03d34e2

File tree

8 files changed

+68
-36
lines changed

8 files changed

+68
-36
lines changed

packages/file_selector/file_selector_ios/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
## NEXT
1+
## 0.5.1+9
22

3+
* Adjusts implementation for testabiity.
34
* Updates minimum iOS version to 12.0 and minimum Flutter version to 3.16.6.
45

56
## 0.5.1+8

packages/file_selector/file_selector_ios/example/ios/Podfile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ target 'Runner' do
3434
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
3535
target 'RunnerTests' do
3636
inherit! :search_paths
37-
# Pods for testing
38-
pod 'OCMock', '~> 3.8.1'
3937
end
4038
end
4139

packages/file_selector/file_selector_ios/example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@
197197
C71AE4B2281C6A090086307A /* Sources */,
198198
C71AE4B3281C6A090086307A /* Frameworks */,
199199
C71AE4B4281C6A090086307A /* Resources */,
200-
5BE5886DAAA885227DE0796D /* [CP] Embed Pods Frameworks */,
201200
);
202201
buildRules = (
203202
);
@@ -215,7 +214,7 @@
215214
97C146E61CF9000F007C117D /* Project object */ = {
216215
isa = PBXProject;
217216
attributes = {
218-
LastUpgradeCheck = 1430;
217+
LastUpgradeCheck = 1510;
219218
ORGANIZATIONNAME = "";
220219
TargetAttributes = {
221220
97C146ED1CF9000F007C117D = {
@@ -285,23 +284,6 @@
285284
shellPath = /bin/sh;
286285
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
287286
};
288-
5BE5886DAAA885227DE0796D /* [CP] Embed Pods Frameworks */ = {
289-
isa = PBXShellScriptBuildPhase;
290-
buildActionMask = 2147483647;
291-
files = (
292-
);
293-
inputFileListPaths = (
294-
"${PODS_ROOT}/Target Support Files/Pods-RunnerTests/Pods-RunnerTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
295-
);
296-
name = "[CP] Embed Pods Frameworks";
297-
outputFileListPaths = (
298-
"${PODS_ROOT}/Target Support Files/Pods-RunnerTests/Pods-RunnerTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
299-
);
300-
runOnlyForDeploymentPostprocessing = 0;
301-
shellPath = /bin/sh;
302-
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RunnerTests/Pods-RunnerTests-frameworks.sh\"\n";
303-
showEnvVarsInLog = 0;
304-
};
305287
9740EEB61CF901F6004384FC /* Run Script */ = {
306288
isa = PBXShellScriptBuildPhase;
307289
alwaysOutOfDate = 1;

packages/file_selector/file_selector_ios/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1430"
3+
LastUpgradeVersion = "1510"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

packages/file_selector/file_selector_ios/example/ios/RunnerTests/FileSelectorTests.m

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,19 @@
66
@import file_selector_ios.Test;
77
@import XCTest;
88

9-
#import <OCMock/OCMock.h>
9+
@interface TestPresenter : NSObject <FFSViewPresenter>
10+
@property(nonatomic) UIViewController *presentedController;
11+
@end
12+
13+
@implementation TestPresenter
14+
- (void)presentViewController:(UIViewController *)viewControllerToPresent
15+
animated:(BOOL)animated
16+
completion:(void (^__nullable)(void))completion {
17+
self.presentedController = viewControllerToPresent;
18+
}
19+
@end
20+
21+
#pragma mark -
1022

1123
@interface FileSelectorTests : XCTestCase
1224

@@ -19,18 +31,16 @@ - (void)testPickerPresents {
1931
UIDocumentPickerViewController *picker =
2032
[[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[]
2133
inMode:UIDocumentPickerModeImport];
22-
id mockPresentingVC = OCMClassMock([UIViewController class]);
34+
TestPresenter *presenter = [[TestPresenter alloc] init];
2335
plugin.documentPickerViewControllerOverride = picker;
24-
plugin.presentingViewControllerOverride = mockPresentingVC;
36+
plugin.viewPresenterOverride = presenter;
2537

2638
[plugin openFileSelectorWithConfig:[FFSFileSelectorConfig makeWithUtis:@[] allowMultiSelection:NO]
2739
completion:^(NSArray<NSString *> *paths, FlutterError *error){
2840
}];
2941

3042
XCTAssertEqualObjects(picker.delegate, plugin);
31-
OCMVerify(times(1), [mockPresentingVC presentViewController:picker
32-
animated:[OCMArg any]
33-
completion:[OCMArg any]]);
43+
XCTAssertEqualObjects(presenter.presentedController, picker);
3444
}
3545

3646
- (void)testReturnsPickedFiles {

packages/file_selector/file_selector_ios/ios/Classes/FFSFileSelectorPlugin.m

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,34 @@
88

99
#import <objc/runtime.h>
1010

11+
// TODO(stuartmorgan): When migrating to Swift, eliminate this in favor of
12+
// adding FFSViewPresenter conformance to UIViewController.
13+
@interface FFSPresentingViewController : NSObject <FFSViewPresenter>
14+
- (instancetype)initWithViewController:(nullable UIViewController *)controller;
15+
// The wrapped controller.
16+
@property(nonatomic) UIViewController *controller;
17+
@end
18+
19+
@implementation FFSPresentingViewController
20+
- (instancetype)initWithViewController:(nullable UIViewController *)controller {
21+
self = [super init];
22+
if (self) {
23+
_controller = controller;
24+
}
25+
return self;
26+
}
27+
28+
- (void)presentViewController:(UIViewController *)viewControllerToPresent
29+
animated:(BOOL)animated
30+
completion:(void (^__nullable)(void))completion {
31+
[self.controller presentViewController:viewControllerToPresent
32+
animated:animated
33+
completion:completion];
34+
}
35+
@end
36+
37+
#pragma mark -
38+
1139
@implementation FFSFileSelectorPlugin
1240

1341
#pragma mark - FFSFileSelectorApi
@@ -23,13 +51,15 @@ - (void)openFileSelectorWithConfig:(FFSFileSelectorConfig *)config
2351
documentPicker.delegate = self;
2452
documentPicker.allowsMultipleSelection = config.allowMultiSelection;
2553

26-
UIViewController *presentingVC =
27-
self.presentingViewControllerOverride
28-
?: UIApplication.sharedApplication.delegate.window.rootViewController;
29-
if (presentingVC) {
54+
id<FFSViewPresenter> presenter =
55+
self.viewPresenterOverride
56+
?: [[FFSPresentingViewController alloc]
57+
initWithViewController:UIApplication.sharedApplication.delegate.window
58+
.rootViewController];
59+
if (presenter) {
3060
objc_setAssociatedObject(documentPicker, @selector(openFileSelectorWithConfig:completion:),
3161
completion, OBJC_ASSOCIATION_COPY_NONATOMIC);
32-
[presentingVC presentViewController:documentPicker animated:YES completion:nil];
62+
[presenter presentViewController:documentPicker animated:YES completion:nil];
3363
} else {
3464
completion(nil, [FlutterError errorWithCode:@"error"
3565
message:@"Missing root view controller."

packages/file_selector/file_selector_ios/ios/Classes/FFSFileSelectorPlugin_Test.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,24 @@
44

55
#import "FFSFileSelectorPlugin.h"
66

7+
@import UIKit;
8+
79
#import "messages.g.h"
810

11+
/// Interface for presenting a view controller, to allow injecting an alternate
12+
/// test implementation.
13+
@protocol FFSViewPresenter <NSObject>
14+
/// Wrapper for -[UIViewController presentViewController:animated:completion:].
15+
- (void)presentViewController:(UIViewController *_Nonnull)viewControllerToPresent
16+
animated:(BOOL)animated
17+
completion:(void (^__nullable)(void))completion;
18+
@end
19+
920
// This header is available in the Test module. Import via "@import file_selector_ios.Test;".
1021
@interface FFSFileSelectorPlugin () <FFSFileSelectorApi, UIDocumentPickerDelegate>
1122

1223
/// Overrides the view controller used for presenting the document picker.
13-
@property(nonatomic) UIViewController *_Nullable presentingViewControllerOverride;
24+
@property(nonatomic) id<FFSViewPresenter> _Nullable viewPresenterOverride;
1425

1526
/// Overrides the UIDocumentPickerViewController used for file picking.
1627
@property(nonatomic) UIDocumentPickerViewController *_Nullable documentPickerViewControllerOverride;

packages/file_selector/file_selector_ios/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: file_selector_ios
22
description: iOS implementation of the file_selector plugin.
33
repository: https://github.com/flutter/packages/tree/main/packages/file_selector/file_selector_ios
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22
5-
version: 0.5.1+8
5+
version: 0.5.1+9
66

77
environment:
88
sdk: ^3.2.3

0 commit comments

Comments
 (0)