@@ -12,6 +12,38 @@ @interface FWFNavigationDelegateHostApiTests : XCTestCase
1212@end
1313
1414@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+
1547- (void )testCreateWithIdentifier {
1648 FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
1749 FWFNavigationDelegateHostApiImpl *hostAPI = [[FWFNavigationDelegateHostApiImpl alloc ]
@@ -29,31 +61,156 @@ - (void)testCreateWithIdentifier {
2961
3062- (void )testDidFinishNavigation {
3163 FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc ] init ];
32- FWFNavigationDelegateHostApiImpl *hostAPI = [[FWFNavigationDelegateHostApiImpl alloc ]
33- initWithBinaryMessenger: OCMProtocolMock (@protocol (FlutterBinaryMessenger))
34- instanceManager: instanceManager];
3564
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];
4169
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);
4871
4972 WKWebView *mockWebView = OCMClassMock ([WKWebView class ]);
5073 OCMStub ([mockWebView URL ]).andReturn ([NSURL URLWithString: @" https://flutter.dev/" ]);
5174 [instanceManager addDartCreatedInstance: mockWebView withIdentifier: 1 ];
5275
5376 [mockDelegate webView: mockWebView didFinishNavigation: OCMClassMock ([WKNavigation class ])];
54- OCMVerify ([mockFlutterApi didFinishNavigationForDelegateWithIdentifier: @0
77+ OCMVerify ([mockFlutterAPI didFinishNavigationForDelegateWithIdentifier: @0
5578 webViewIdentifier: @1
5679 URL: @" https://flutter.dev/"
5780 completion: OCMOCK_ANY]);
5881}
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+ }
59216@end
0 commit comments