Framework/ROADWebService/ROADWebServiceIntegrationTest/RFWebServiceIntegrationTest.m (149 lines of code) (raw):
//
// RFWebServiceIntegrationTest.m
// ROADWebService
//
// Copyright (c) 2014 EPAM Systems, Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// Redistributions in binary form must reproduce the above copyright notice, this
// list of conditions and the following disclaimer in the documentation and/or
// other materials provided with the distribution.
// Neither the name of the EPAM Systems, Inc. nor the names of its contributors
// may be used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// See the NOTICE file and the LICENSE file distributed with this work
// for additional information regarding copyright ownership and licensing
#import <XCTest/XCTest.h>
#import "RFWebServiceClientIntegrationWithRoot.h"
#import "RFWebServiceClient+DynamicIntegrationTest.h"
#import "RFServiceProvider+ConcreteWebServiceIntegrationClient.h"
#import "RFBasicAuthenticationProvider.h"
#import "RFDigestAuthenticationProvider.h"
#import "RFDownloader.h"
#import "RFWebClientIntegrationWithSharedHeader.h"
#import "NSError+RFWebService.h"
@interface RFWebServiceIntegrationTest : XCTestCase
{
BOOL authenticationFinished;
}
@end
@implementation RFWebServiceIntegrationTest
- (void)setUp {
[super setUp];
}
- (void)tearDown {
[super setUp];
}
- (void)testServiceRootAttribute {
RFWebServiceClientIntegrationWithRoot *webServiceClientWithRoot = [[RFWebServiceClientIntegrationWithRoot alloc] init];
XCTAssertEqualObjects(webServiceClientWithRoot.serviceRoot, @"http://google.com", @"Service root was not initialized by a correct value from an attribute.");
webServiceClientWithRoot = [[RFWebServiceClientIntegrationWithRoot alloc] initWithServiceRoot:@"http://yahoo.com"];
XCTAssertEqualObjects(webServiceClientWithRoot.serviceRoot, @"http://yahoo.com", @"Service root from attribute was not overrided by a init method parameter.");
}
- (void)testHTTPBasicAuthentication {
authenticationFinished = NO;
__block BOOL isFinished = NO;
RFWebServiceClient *client = [[RFWebServiceClient alloc] initWithServiceRoot:@"http://httpbin.org/"];
client.authenticationProvider = [[RFBasicAuthenticationProvider alloc] initWithUser:@"user" password:@"passwd"];
[client dynamicTestHttpRequestPath:@"basic-auth/user/passwd" success:^(id result) {
isFinished = YES; /* reveived data ... */
} failure:^(NSError *error) {
isFinished = YES;
}];
while (!isFinished) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
XCTAssertTrue([client.authenticationProvider isSessionOpened], @"Authentication was failed and session was not opened.");
}
- (void)testHTTPBasicAuthenticationInConjunctionWithSSL {
authenticationFinished = NO;
__block BOOL isFinished = NO;
RFWebServiceClient *client = [[RFWebServiceClient alloc] initWithServiceRoot:@"https://httpbin.org/"];
client.authenticationProvider = [[RFBasicAuthenticationProvider alloc] initWithUser:@"user" password:@"passwd"];
[client dynamicTestHttpsRequestPath:@"basic-auth/user/passwd" success:^(id result) {
isFinished = YES; /* reveived data ... */
} failure:^(NSError *error) {
isFinished = YES;
}];
while (!isFinished) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
XCTAssertTrue([client.authenticationProvider isSessionOpened], @"Authentication was failed and session was not opened.");
}
- (void)testHTTPDigestAuthentication {
authenticationFinished = NO;
__block BOOL isFinished = false;
RFWebServiceClient *client = [[RFWebServiceClient alloc] initWithServiceRoot:@"http://httpbin.org/"];
client.authenticationProvider = [[RFDigestAuthenticationProvider alloc] initWithUser:@"user" password:@"passwd"];
[client dynamicTestHttpRequestPath:@"digest-auth/auth/user/passwd" success:^(id result) {
isFinished = YES; /* reveived data ... */
} failure:^(NSError *error) {
isFinished = YES;
}];
while (!isFinished) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
XCTAssertTrue([client.authenticationProvider isSessionOpened], @"Authentication was failed and session was not opened.");
}
- (void)testHTTPDigestAuthenticationInConjunctionWithSSL {
authenticationFinished = NO;
__block BOOL isFinished = NO;
RFWebServiceClient *client = [[RFWebServiceClient alloc] initWithServiceRoot:@"https://httpbin.org/"];
client.authenticationProvider = [[RFDigestAuthenticationProvider alloc] initWithUser:@"user" password:@"passwd"];
[client dynamicTestHttpsRequestPath:@"digest-auth/auth/user/passwd" success:^(id result) {
isFinished = YES; /* reveived data ... */
} failure:^(NSError *error) {
isFinished = YES;
}];
while (!isFinished) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
XCTAssertTrue([client.authenticationProvider isSessionOpened], @"Authentication was failed and session was not opened.");
}
- (void)testWebServiceManagement {
RFConcreteWebServiceIntegrationClient *client = [RFServiceProvider concreteWebServiceClient];
XCTAssertTrue(client != nil, @"Concrete web service client was not created properly.");
client.sharedHeaders = [@{@"key1" : @"value1"} mutableCopy];
RFConcreteWebServiceIntegrationClient *theSameClient = [RFServiceProvider concreteWebServiceClient];
XCTAssertTrue([theSameClient.sharedHeaders count], @"Shared headers has not been saved.");
}
- (void)testSerializationRootAttribute {
__block BOOL isFinished = NO;
__block id requestResult = nil;
RFConcreteWebServiceIntegrationClient *webClient = [[RFConcreteWebServiceIntegrationClient alloc] initWithServiceRoot:@"http://api.openweathermap.org/data/2.5/weather?q=London,uk"];
[webClient testSerializationRootWithSuccess:^(id result) {
requestResult = result;
isFinished = YES;
} failure:^(NSError *error) {
isFinished = YES;
}];
while (!isFinished) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
XCTAssertTrue([requestResult isKindOfClass:[NSNumber class]], @"Serialization root return wrong object");
}
- (void)testWrongSerializationRootAttribute {
__block BOOL isFinished = NO;
__block id requestResult = nil;
RFConcreteWebServiceIntegrationClient *webClient = [[RFConcreteWebServiceIntegrationClient alloc] initWithServiceRoot:@"http://api.openweathermap.org/data/2.5/weather?q=London,uk"];
[webClient testWrongSerializationRootWithSuccess:^(id result) {
requestResult = result;
isFinished = YES;
} failure:^(NSError *error) {
isFinished = YES;
}];
while (!isFinished) {
[[NSRunLoop currentRunLoop] runUntilDate:[[NSDate alloc] initWithTimeIntervalSinceNow:0.2]];
}
XCTAssertTrue(requestResult == nil, @"Wrong serialization root does not return null");
}
- (void)testSharedHeaderAttribute {
RFWebClientIntegrationWithSharedHeader *webClient = [[RFWebClientIntegrationWithSharedHeader alloc] init];
XCTAssertTrue([webClient.sharedHeaders isEqualToDictionary:@{@"key1" : @"value1"}], @"Shared headers was not configured via attributes");
}
- (void)testWebClientSerializationDelegateAttribute {
RFWebClientIntegrationWithSharedHeader *webClient = [[RFWebClientIntegrationWithSharedHeader alloc] init];
XCTAssertTrue([webClient.serializationDelegate isKindOfClass:[RFXMLSerializer class]], @"Serialization delegate was set incorrectly and has wrong type.");
}
- (void)testURLBuilderEncodingParameter {
NSString *unprocessed = @"http://online.store.com/storefront/?request=get-document&doi=10.1175%2F1520-0426(2005)014%3C1157:DODADSS%3E2.0.CO%3B2";
NSString *processed = [unprocessed stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
RFConcreteWebServiceIntegrationClient *webClient = [[RFConcreteWebServiceIntegrationClient alloc] initWithServiceRoot:processed];
RFDownloader *downloader = (RFDownloader *)[webClient testURLEscapingEncodingWithSuccess:nil failure:nil];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
[downloader cancel];
XCTAssertEqualObjects([downloader.request.URL absoluteString], @"http://online.store.com/storefront/?request=get-document&doi=10.1175/1520-0426(2005)014%3C1157:DODADSS%3E2.0.CO;2", @"URL string escaping via encoding is done incorectly");
}
- (void)testURLBuilderAllowedCharsetParameter {
RFConcreteWebServiceIntegrationClient *webClient = [[RFConcreteWebServiceIntegrationClient alloc] initWithServiceRoot:@"http://PERSISTING.for.escaping"];
RFDownloader *downloader = (RFDownloader *)[webClient testURLEscapingAllowedCharsetWithSuccess:nil failure:nil];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
[downloader cancel];
XCTAssertEqualObjects([downloader.request.URL absoluteString], @"%68%74%74%70%3A%2F%2FPERSISTING%2E%66%6F%72%2E%65%73%63%61%70%69%6E%67", @"URL string escaping via charset is done incorrectly!");
}
@end