forked from marcuswestin/WebViewJavascriptBridge
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBridgeTests.m
More file actions
149 lines (126 loc) · 5.84 KB
/
Copy pathBridgeTests.m
File metadata and controls
149 lines (126 loc) · 5.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//
// BridgeTests.m
// WKWebViewJavascriptBridge
//
// Created by Pieter De Baets on 18/04/2015.
// Copyright (c) 2015 marcuswestin. All rights reserved.
//
#import <XCTest/XCTest.h>
#import "WebViewJavascriptBridge.h"
#import "WKWebViewJavascriptBridge.h"
#import "AppDelegate.h"
static NSString *const echoHandler = @"echoHandler";
@interface BridgeTests : XCTestCase
@end
@implementation BridgeTests {
UIWebView *_uiWebView;
WKWebView *_wkWebView;
}
- (void)setUp {
[super setUp];
UIViewController *rootVC = [[(AppDelegate *)[[UIApplication sharedApplication] delegate] window] rootViewController];
_uiWebView = [[UIWebView alloc] initWithFrame:rootVC.view.bounds];
CGRect wkFrame = _uiWebView.frame;
wkFrame.origin.y += _uiWebView.frame.size.height;
_wkWebView = [[WKWebView alloc] initWithFrame:wkFrame];
[rootVC.view addSubview:_wkWebView];
}
- (void)tearDown {
[super tearDown];
[_uiWebView removeFromSuperview];
[_wkWebView removeFromSuperview];
}
static void loadEchoSample(id webView) {
NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"echo" withExtension:@"html"]];
[(UIWebView*)webView loadRequest:request];
}
- (void)testInitialization {
[self classSpecificTestInitialization:[WebViewJavascriptBridge class] webView:_uiWebView];
[self classSpecificTestInitialization:[WKWebViewJavascriptBridge class] webView:_wkWebView];
[self waitForExpectationsWithTimeout:3 handler:NULL];
}
- (void)classSpecificTestInitialization:(Class)cls webView:(id)webView {
XCTestExpectation *startup = [self expectationWithDescription:@"Startup completed"];
WebViewJavascriptBridge *bridge = [self bridgeForCls:cls webView:webView];
[bridge registerHandler:@"Greet" handler:^(id data, WVJBResponseCallback responseCallback) {
XCTAssertEqualObjects(data, @"Hello world");
[startup fulfill];
}];
XCTAssertNotNil(bridge);
loadEchoSample(webView);
}
- (void)testEchoHandler {
[self classSpecificTestEchoHandler:[WebViewJavascriptBridge class] webView:_uiWebView];
[self classSpecificTestEchoHandler:[WKWebViewJavascriptBridge class] webView:_wkWebView];
[self waitForExpectationsWithTimeout:3 handler:NULL];
}
- (void)classSpecificTestEchoHandler:(Class)cls webView:(id)webView {
WebViewJavascriptBridge *bridge = [self bridgeForCls:cls webView:webView];
XCTestExpectation *callbackInvocked = [self expectationWithDescription:@"Callback invoked"];
[bridge callHandler:echoHandler data:@"testEchoHandler" responseCallback:^(id responseData) {
XCTAssertEqualObjects(responseData, @"testEchoHandler");
[callbackInvocked fulfill];
}];
loadEchoSample(webView);
}
- (void)testEchoHandlerAfterSetup {
[self classSpecificTestEchoHandlerAfterSetup:[WebViewJavascriptBridge class] webView:_uiWebView];
[self classSpecificTestEchoHandlerAfterSetup:[WKWebViewJavascriptBridge class] webView:_wkWebView];
[self waitForExpectationsWithTimeout:3 handler:NULL];
}
- (void)classSpecificTestEchoHandlerAfterSetup:(Class)cls webView:(id)webView {
WebViewJavascriptBridge *bridge = [self bridgeForCls:cls webView:webView];
XCTestExpectation *callbackInvocked = [self expectationWithDescription:@"Callback invoked"];
loadEchoSample(webView);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 150 * NSEC_PER_MSEC), dispatch_get_main_queue(), ^{
[bridge callHandler:echoHandler data:@"testEchoHandler" responseCallback:^(id responseData) {
XCTAssertEqualObjects(responseData, @"testEchoHandler");
[callbackInvocked fulfill];
}];
});
}
- (void)testObjectEncoding {
[self classSpecificTestObjectEncoding:[WebViewJavascriptBridge class] webView:_uiWebView];
[self classSpecificTestObjectEncoding:[WKWebViewJavascriptBridge class] webView:_wkWebView];
[self waitForExpectationsWithTimeout:3 handler:NULL];
}
- (void)classSpecificTestObjectEncoding:(Class)cls webView:(id)webView {
WebViewJavascriptBridge *bridge = [self bridgeForCls:cls webView:webView];
void (^echoObject)(id) = ^void(id object) {
XCTestExpectation *callbackInvocked = [self expectationWithDescription:@"Callback invoked"];
[bridge callHandler:echoHandler data:object responseCallback:^(id responseData) {
XCTAssertEqualObjects(responseData, object);
[callbackInvocked fulfill];
}];
};
echoObject(@"A string sent over the wire");
echoObject(@"A string with '\"'/\\");
echoObject(@[ @1, @2, @3 ]);
echoObject(@{ @"a" : @1, @"b" : @2 });
loadEchoSample(webView);
}
- (void)testJavascriptReceiveResponse {
[self classSpecificTestJavascriptReceiveResponse:[WebViewJavascriptBridge class] webView:_uiWebView];
[self classSpecificTestJavascriptReceiveResponse:[WKWebViewJavascriptBridge class] webView:_wkWebView];
[self waitForExpectationsWithTimeout:3 handler:NULL];
}
- (void)classSpecificTestJavascriptReceiveResponse:(Class)cls webView:(id)webView {
WebViewJavascriptBridge *bridge = [self bridgeForCls:cls webView:webView];
loadEchoSample(webView);
XCTestExpectation *callbackInvocked = [self expectationWithDescription:@"Callback invoked"];
[bridge registerHandler:@"objcEchoToJs" handler:^(id data, WVJBResponseCallback responseCallback) {
responseCallback(data);
}];
[bridge callHandler:@"jsRcvResponseTest" data:nil responseCallback:^(id responseData) {
XCTAssertEqualObjects(responseData, @"Response from JS");
[callbackInvocked fulfill];
}];
}
- (WebViewJavascriptBridge*)bridgeForCls:(Class)cls webView:(id)webView {
if (cls == [WebViewJavascriptBridge class]) {
return [WebViewJavascriptBridge bridgeForWebView:webView];
} else {
return (WebViewJavascriptBridge*)[WKWebViewJavascriptBridge bridgeForWebView:_wkWebView];
}
}
@end