@@ -12,6 +12,38 @@ @interface FWFNavigationDelegateHostApiTests : XCTestCase
12
12
@end
13
13
14
14
@implementation FWFNavigationDelegateHostApiTests
15
+ /* *
16
+ * Creates a partially mocked FWFNavigationDelegate and adds it to instanceManager.
17
+ *
18
+ * @param instanceManager Instance manager to add the delegate to.
19
+ * @param identifier Identifier for the delegate added to the instanceManager.
20
+ *
21
+ * @return A mock FWFNavigationDelegate.
22
+ */
23
+ - (id )mockNavigationDelegateWithManager : (FWFInstanceManager *)instanceManager
24
+ identifier : (long )identifier {
25
+ FWFNavigationDelegate *navigationDelegate = [[FWFNavigationDelegate alloc ]
26
+ initWithBinaryMessenger: OCMProtocolMock (@protocol (FlutterBinaryMessenger))
27
+ instanceManager: instanceManager];
28
+
29
+ [instanceManager addDartCreatedInstance: navigationDelegate withIdentifier: 0 ];
30
+ return OCMPartialMock (navigationDelegate);
31
+ }
32
+
33
+ /* *
34
+ * Creates a mock FWFNavigationDelegateFlutterApiImpl with instanceManager.
35
+ *
36
+ * @param instanceManager Instance manager passed to the Flutter API.
37
+ *
38
+ * @return A mock FWFNavigationDelegateFlutterApiImpl.
39
+ */
40
+ - (id )mockFlutterApiWithManager : (FWFInstanceManager *)instanceManager {
41
+ FWFNavigationDelegateFlutterApiImpl *flutterAPI = [[FWFNavigationDelegateFlutterApiImpl alloc ]
42
+ initWithBinaryMessenger: OCMProtocolMock (@protocol (FlutterBinaryMessenger))
43
+ instanceManager: instanceManager];
44
+ return OCMPartialMock (flutterAPI);
45
+ }
46
+
15
47
- (void )testCreateWithIdentifier {
16
48
FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
17
49
FWFNavigationDelegateHostApiImpl *hostAPI = [[FWFNavigationDelegateHostApiImpl alloc ]
@@ -29,31 +61,156 @@ - (void)testCreateWithIdentifier {
29
61
30
62
- (void )testDidFinishNavigation {
31
63
FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
32
- FWFNavigationDelegateHostApiImpl *hostAPI = [[FWFNavigationDelegateHostApiImpl alloc ]
33
- initWithBinaryMessenger: OCMProtocolMock (@protocol (FlutterBinaryMessenger))
34
- instanceManager: instanceManager];
35
64
36
- FlutterError *error;
37
- [hostAPI createWithIdentifier: @0 error: &error];
38
- FWFNavigationDelegate *navigationDelegate =
39
- (FWFNavigationDelegate *)[instanceManager instanceForIdentifier: 0 ];
40
- id mockDelegate = OCMPartialMock (navigationDelegate);
65
+ FWFNavigationDelegate *mockDelegate = [self mockNavigationDelegateWithManager: instanceManager
66
+ identifier: 0 ];
67
+ FWFNavigationDelegateFlutterApiImpl *mockFlutterAPI =
68
+ [self mockFlutterApiWithManager: instanceManager];
41
69
42
- FWFNavigationDelegateFlutterApiImpl *flutterAPI = [[FWFNavigationDelegateFlutterApiImpl alloc ]
43
- initWithBinaryMessenger: OCMProtocolMock (@protocol (FlutterBinaryMessenger))
44
- instanceManager: instanceManager];
45
- id mockFlutterApi = OCMPartialMock (flutterAPI);
46
-
47
- OCMStub ([mockDelegate navigationDelegateAPI ]).andReturn (mockFlutterApi);
70
+ OCMStub ([mockDelegate navigationDelegateAPI ]).andReturn (mockFlutterAPI);
48
71
49
72
WKWebView *mockWebView = OCMClassMock ([WKWebView class ]);
50
73
OCMStub ([mockWebView URL ]).andReturn ([NSURL URLWithString: @" https://flutter.dev/" ]);
51
74
[instanceManager addDartCreatedInstance: mockWebView withIdentifier: 1 ];
52
75
53
76
[mockDelegate webView: mockWebView didFinishNavigation: OCMClassMock ([WKNavigation class ])];
54
- OCMVerify ([mockFlutterApi didFinishNavigationForDelegateWithIdentifier: @0
77
+ OCMVerify ([mockFlutterAPI didFinishNavigationForDelegateWithIdentifier: @0
55
78
webViewIdentifier: @1
56
79
URL: @" https://flutter.dev/"
57
80
completion: OCMOCK_ANY]);
58
81
}
82
+
83
+ - (void )testDidStartProvisionalNavigation {
84
+ FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
85
+
86
+ FWFNavigationDelegate *mockDelegate = [self mockNavigationDelegateWithManager: instanceManager
87
+ identifier: 0 ];
88
+ FWFNavigationDelegateFlutterApiImpl *mockFlutterAPI =
89
+ [self mockFlutterApiWithManager: instanceManager];
90
+
91
+ OCMStub ([mockDelegate navigationDelegateAPI ]).andReturn (mockFlutterAPI);
92
+
93
+ WKWebView *mockWebView = OCMClassMock ([WKWebView class ]);
94
+ OCMStub ([mockWebView URL ]).andReturn ([NSURL URLWithString: @" https://flutter.dev/" ]);
95
+ [instanceManager addDartCreatedInstance: mockWebView withIdentifier: 1 ];
96
+
97
+ [mockDelegate webView: mockWebView
98
+ didStartProvisionalNavigation: OCMClassMock ([WKNavigation class ])];
99
+ OCMVerify ([mockFlutterAPI
100
+ didStartProvisionalNavigationForDelegateWithIdentifier: @0
101
+ webViewIdentifier: @1
102
+ URL: @" https://flutter.dev/"
103
+ completion: OCMOCK_ANY]);
104
+ }
105
+
106
+ - (void )testDecidePolicyForNavigationAction {
107
+ FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
108
+
109
+ FWFNavigationDelegate *mockDelegate = [self mockNavigationDelegateWithManager: instanceManager
110
+ identifier: 0 ];
111
+ FWFNavigationDelegateFlutterApiImpl *mockFlutterAPI =
112
+ [self mockFlutterApiWithManager: instanceManager];
113
+
114
+ OCMStub ([mockDelegate navigationDelegateAPI ]).andReturn (mockFlutterAPI);
115
+
116
+ WKWebView *mockWebView = OCMClassMock ([WKWebView class ]);
117
+ [instanceManager addDartCreatedInstance: mockWebView withIdentifier: 1 ];
118
+
119
+ WKNavigationAction *mockNavigationAction = OCMClassMock ([WKNavigationAction class ]);
120
+ OCMStub ([mockNavigationAction request ])
121
+ .andReturn ([NSURLRequest requestWithURL: [NSURL URLWithString: @" https://www.flutter.dev" ]]);
122
+
123
+ WKFrameInfo *mockFrameInfo = OCMClassMock ([WKFrameInfo class ]);
124
+ OCMStub ([mockFrameInfo isMainFrame ]).andReturn (YES );
125
+ OCMStub ([mockNavigationAction targetFrame ]).andReturn (mockFrameInfo);
126
+
127
+ OCMStub ([mockFlutterAPI
128
+ decidePolicyForNavigationActionForDelegateWithIdentifier: @0
129
+ webViewIdentifier: @1
130
+ navigationAction:
131
+ [OCMArg isKindOfClass: [FWFWKNavigationActionData
132
+ class ]]
133
+ completion:
134
+ ([OCMArg
135
+ invokeBlockWithArgs:
136
+ [FWFWKNavigationActionPolicyEnumData
137
+ makeWithValue:
138
+ FWFWKNavigationActionPolicyEnumCancel],
139
+ [NSNull null ], nil ])]);
140
+
141
+ WKNavigationActionPolicy __block callbackPolicy = -1 ;
142
+ [mockDelegate webView: mockWebView
143
+ decidePolicyForNavigationAction: mockNavigationAction
144
+ decisionHandler: ^(WKNavigationActionPolicy policy) {
145
+ callbackPolicy = policy;
146
+ }];
147
+ XCTAssertEqual (callbackPolicy, WKNavigationActionPolicyCancel );
148
+ }
149
+
150
+ - (void )testDidFailNavigation {
151
+ FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
152
+
153
+ FWFNavigationDelegate *mockDelegate = [self mockNavigationDelegateWithManager: instanceManager
154
+ identifier: 0 ];
155
+ FWFNavigationDelegateFlutterApiImpl *mockFlutterAPI =
156
+ [self mockFlutterApiWithManager: instanceManager];
157
+
158
+ OCMStub ([mockDelegate navigationDelegateAPI ]).andReturn (mockFlutterAPI);
159
+
160
+ WKWebView *mockWebView = OCMClassMock ([WKWebView class ]);
161
+ [instanceManager addDartCreatedInstance: mockWebView withIdentifier: 1 ];
162
+
163
+ [mockDelegate webView: mockWebView
164
+ didFailNavigation: OCMClassMock ([WKNavigation class ])
165
+ withError: [NSError errorWithDomain: @" domain" code: 0 userInfo: nil ]];
166
+ OCMVerify ([mockFlutterAPI
167
+ didFailNavigationForDelegateWithIdentifier: @0
168
+ webViewIdentifier: @1
169
+ error: [OCMArg isKindOfClass: [FWFNSErrorData class ]]
170
+ completion: OCMOCK_ANY]);
171
+ }
172
+
173
+ - (void )testDidFailProvisionalNavigation {
174
+ FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
175
+
176
+ FWFNavigationDelegate *mockDelegate = [self mockNavigationDelegateWithManager: instanceManager
177
+ identifier: 0 ];
178
+ FWFNavigationDelegateFlutterApiImpl *mockFlutterAPI =
179
+ [self mockFlutterApiWithManager: instanceManager];
180
+
181
+ OCMStub ([mockDelegate navigationDelegateAPI ]).andReturn (mockFlutterAPI);
182
+
183
+ WKWebView *mockWebView = OCMClassMock ([WKWebView class ]);
184
+ [instanceManager addDartCreatedInstance: mockWebView withIdentifier: 1 ];
185
+
186
+ [mockDelegate webView: mockWebView
187
+ didFailProvisionalNavigation: OCMClassMock ([WKNavigation class ])
188
+ withError: [NSError errorWithDomain: @" domain" code: 0 userInfo: nil ]];
189
+ OCMVerify ([mockFlutterAPI
190
+ didFailProvisionalNavigationForDelegateWithIdentifier: @0
191
+ webViewIdentifier: @1
192
+ error: [OCMArg isKindOfClass: [FWFNSErrorData
193
+ class ]]
194
+ completion: OCMOCK_ANY]);
195
+ }
196
+
197
+ - (void )testWebViewWebContentProcessDidTerminate {
198
+ FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
199
+
200
+ FWFNavigationDelegate *mockDelegate = [self mockNavigationDelegateWithManager: instanceManager
201
+ identifier: 0 ];
202
+ FWFNavigationDelegateFlutterApiImpl *mockFlutterAPI =
203
+ [self mockFlutterApiWithManager: instanceManager];
204
+
205
+ OCMStub ([mockDelegate navigationDelegateAPI ]).andReturn (mockFlutterAPI);
206
+
207
+ WKWebView *mockWebView = OCMClassMock ([WKWebView class ]);
208
+ [instanceManager addDartCreatedInstance: mockWebView withIdentifier: 1 ];
209
+
210
+ [mockDelegate webViewWebContentProcessDidTerminate: mockWebView];
211
+ OCMVerify ([mockFlutterAPI
212
+ webViewWebContentProcessDidTerminateForDelegateWithIdentifier: @0
213
+ webViewIdentifier: @1
214
+ completion: OCMOCK_ANY]);
215
+ }
59
216
@end
0 commit comments