factor out BITHockeyAppClient to provide network services

* factor out HockeyAppClient
* configure Authenticator with HockeyAppClient
* move appendPostValue to HockeyAppClient (& add the missing boundary parameter)
* move tests over to new file
This commit is contained in:
Stephan Diederich 2013-09-06 17:11:55 +02:00
parent 6a0cfdd4dc
commit 96304ac639
14 changed files with 1881 additions and 420 deletions

View File

@ -9,6 +9,7 @@
#import <UIKit/UIKit.h>
@protocol BITAuthenticationViewControllerDelegate;
@class BITAuthenticator;
@class BITHockeyAppClient;
@interface BITAuthenticationViewController : UITableViewController
@ -16,6 +17,11 @@
requirePassword:(BOOL) requiresPassword
delegate:(id<BITAuthenticationViewControllerDelegate>) delegate;
/**
* must be set
*/
@property (nonatomic, strong) BITHockeyAppClient *hockeyAppClient;
/**
* The application's id to identifiy it in the backend
*/

View File

@ -10,6 +10,7 @@
#import "BITAuthenticator_Private.h"
#import "HockeySDKPrivate.h"
#import "HockeySDK.h"
#import "BITHockeyAppClient.h"
@interface BITAuthenticationViewController ()<UITextFieldDelegate> {
UIStatusBarStyle _statusBarStyle;
@ -244,41 +245,41 @@
NSDictionary *params = [self parametersForAuthentication];
__weak typeof (self) weakSelf = self;
[self.authenticator postPath:authenticationPath
parameters:params
completion:^(BITHTTPOperation *operation, id response, NSError *error) {
typeof (self) strongSelf = weakSelf;
if(nil == response) {
//TODO think about alertview messages
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"Failed to authenticate"
delegate:nil
cancelButtonTitle:BITHockeyLocalizedString(@"OK")
otherButtonTitles:nil];
[alert show];
} else if(401 == operation.response.statusCode) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"Not authorized"
delegate:nil
cancelButtonTitle:BITHockeyLocalizedString(@"OK")
otherButtonTitles:nil];
[alert show];
} else {
NSError *authParseError = nil;
NSString *authToken = [strongSelf.class authenticationTokenFromReponse:response
error:&authParseError];
if(nil == authToken) {
[self.hockeyAppClient postPath:authenticationPath
parameters:params
completion:^(BITHTTPOperation *operation, id response, NSError *error) {
typeof (self) strongSelf = weakSelf;
if(nil == response) {
//TODO think about alertview messages
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"Failed to authenticate"
delegate:nil
cancelButtonTitle:BITHockeyLocalizedString(@"OK")
otherButtonTitles:nil];
[alert show];
} else if(401 == operation.response.statusCode) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"Not authorized"
delegate:nil
cancelButtonTitle:BITHockeyLocalizedString(@"OK")
otherButtonTitles:nil];
[alert show];
} else {
[strongSelf.delegate authenticationViewController:strongSelf authenticatedWithToken:authToken];
NSError *authParseError = nil;
NSString *authToken = [strongSelf.class authenticationTokenFromReponse:response
error:&authParseError];
if(nil == authToken) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"Failed to authenticate"
delegate:nil
cancelButtonTitle:BITHockeyLocalizedString(@"OK")
otherButtonTitles:nil];
[alert show];
} else {
[strongSelf.delegate authenticationViewController:strongSelf authenticatedWithToken:authToken];
}
}
}
[self showLoginUI:NO];
[self showLoginUI:NO];
}];
}

View File

@ -11,6 +11,7 @@
#import "HockeySDKPrivate.h"
#import "BITAuthenticator_Private.h"
#import "BITHTTPOperation.h"
#import "BITHockeyAppClient.h"
static NSString* const kBITAuthenticatorAuthTokenKey = @"BITAuthenticatorAuthTokenKey";
static NSString* const kBITAuthenticatorLastAuthenticatedVersionKey = @"BITAuthenticatorLastAuthenticatedVersionKey";
@ -23,7 +24,6 @@ static NSString* const kBITAuthenticatorLastAuthenticatedVersionKey = @"BITAuthe
- (void)dealloc {
[self unregisterObservers];
[self cancelOperationsWithPath:nil method:nil];
}
- (instancetype) initWithAppIdentifier:(NSString *)appIdentifier isAppStoreEnvironemt:(BOOL)isAppStoreEnvironment {
@ -107,7 +107,7 @@ static NSString* const kBITAuthenticatorLastAuthenticatedVersionKey = @"BITAuthe
} else {
NSString *validationPath = [NSString stringWithFormat:@"api/3/apps/%@/identity/validate", self.encodedAppIdentifier];
__weak typeof (self) weakSelf = self;
[self getPath:validationPath
[self.hockeyAppClient getPath:validationPath
parameters:[self validationParameters]
completion:^(BITHTTPOperation *operation, id response, NSError *error) {
typeof (self) strongSelf = weakSelf;
@ -376,119 +376,4 @@ static NSString* const kBITAuthenticatorLastAuthenticatedVersionKey = @"BITAuthe
};
};
#pragma mark - Networking
- (NSMutableURLRequest *) requestWithMethod:(NSString*) method
path:(NSString *) path
parameters:(NSDictionary *)params {
NSParameterAssert(self.serverURL);
NSParameterAssert(method);
NSParameterAssert(params == nil || [method isEqualToString:@"POST"] || [method isEqualToString:@"GET"]);
path = path ? : @"";
NSURL *endpoint = [[NSURL URLWithString:self.serverURL] URLByAppendingPathComponent:path];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:endpoint];
request.HTTPMethod = method;
if (params) {
if ([method isEqualToString:@"GET"]) {
NSString *absoluteURLString = [endpoint absoluteString];
//either path already has parameters, or not
NSString *appenderFormat = [path rangeOfString:@"?"].location == NSNotFound ? @"?%@" : @"&%@";
endpoint = [NSURL URLWithString:[absoluteURLString stringByAppendingFormat:appenderFormat,
[self.class queryStringFromParameters:params withEncoding:NSUTF8StringEncoding]]];
[request setURL:endpoint];
} else {
//TODO: this is crap. Boundary must be the same as the one in appendData
//unify this!
NSString *boundary = @"----FOO";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request setValue:contentType forHTTPHeaderField:@"Content-type"];
NSMutableData *postBody = [NSMutableData data];
[params enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
[postBody appendData:[self appendPostValue:value forKey:key]];
}];
[postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];
}
}
return request;
}
+ (NSString *) queryStringFromParameters:(NSDictionary *) params withEncoding:(NSStringEncoding) encoding {
NSMutableString *queryString = [NSMutableString new];
[params enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL *stop) {
NSAssert([key isKindOfClass:[NSString class]], @"Query parameters can only be string-string pairs");
NSAssert([value isKindOfClass:[NSString class]], @"Query parameters can only be string-string pairs");
[queryString appendFormat:queryString.length ? @"&%@=%@" : @"%@=%@", key, value];
}];
return queryString;
}
- (BITHTTPOperation*) operationWithURLRequest:(NSURLRequest*) request
completion:(BITNetworkCompletionBlock) completion {
BITHTTPOperation *operation = [BITHTTPOperation operationWithRequest:request
];
[operation setCompletion:completion];
return operation;
}
- (void)getPath:(NSString *)path parameters:(NSDictionary *)params completion:(BITNetworkCompletionBlock)completion {
NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:params];
BITHTTPOperation *op = [self operationWithURLRequest:request
completion:completion];
[self enqeueHTTPOperation:op];
}
- (void)postPath:(NSString *)path parameters:(NSDictionary *)params completion:(BITNetworkCompletionBlock)completion {
NSURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:params];
BITHTTPOperation *op = [self operationWithURLRequest:request
completion:completion];
[self enqeueHTTPOperation:op];
}
- (void) enqeueHTTPOperation:(BITHTTPOperation *) operation {
[self.operationQueue addOperation:operation];
}
- (NSUInteger) cancelOperationsWithPath:(NSString*) path
method:(NSString*) method {
NSUInteger cancelledOperations = 0;
for(BITHTTPOperation *operation in self.operationQueue.operations) {
NSURLRequest *request = operation.URLRequest;
BOOL matchedMethod = YES;
if(method && ![request.HTTPMethod isEqualToString:method]) {
matchedMethod = NO;
}
BOOL matchedPath = YES;
if(path) {
//method is not interesting here, we' just creating it to get the URL
NSURL *url = [self requestWithMethod:@"GET" path:path parameters:nil].URL;
matchedPath = [request.URL isEqual:url];
}
if(matchedPath && matchedMethod) {
++cancelledOperations;
[operation cancel];
}
}
return cancelledOperations;
}
- (NSOperationQueue *)operationQueue {
if(nil == _operationQueue) {
_operationQueue = [[NSOperationQueue alloc] init];
_operationQueue.maxConcurrentOperationCount = 1;
}
return _operationQueue;
}
@end

View File

@ -9,10 +9,15 @@
#import "BITAuthenticator.h"
#import "BITHockeyBaseManagerPrivate.h"
#import "BITAuthenticationViewController.h"
#import "BITHTTPOperation.h" //needed for typedef
@class BITHockeyAppClient;
@interface BITAuthenticator ()<BITAuthenticationViewControllerDelegate>
/**
* must be set
*/
@property (nonatomic, strong) BITHockeyAppClient *hockeyAppClient;
//can be set for testing
@property (nonatomic) UIDevice *currentDevice;
@ -46,72 +51,4 @@
- (void) validationSucceededWithCompletion:(tValidationCompletion) completion;
- (void) validationFailedWithError:(NSError *) validationError completion:(tValidationCompletion) completion;
#pragma mark - Networking helpers (TODO: move to base-class / networking component)
@property (nonatomic, strong) NSOperationQueue *operationQueue;
/**
* creates an NRURLRequest for the given method and path by using
* the internally stored baseURL.
*
* @param method the HTTPMethod to check, must not be nil
* @param params parameters for the request (only supported for GET and POST for now)
* @param path path to append to baseURL. can be nil in which case "/" is appended
*
* @return an NSMutableURLRequest for further configuration
*/
- (NSMutableURLRequest *) requestWithMethod:(NSString*) method
path:(NSString *) path
parameters:(NSDictionary *) params;
/**
* Creates an operation for the given NSURLRequest
*
* @param request the request that should be handled
* @param completion completionBlock that is called once the operation finished
*
* @return operation, which can be queued via enqueueHTTPOperation:
*/
- (BITHTTPOperation*) operationWithURLRequest:(NSURLRequest*) request
completion:(BITNetworkCompletionBlock) completion;
/**
* Creates an operation for the given path, and enqueues it
*
* @param path the request path to check
* @param params parameters for the request
* @param completion completionBlock that is called once the operation finished
*
*/
- (void) getPath:(NSString*) path
parameters:(NSDictionary *) params
completion:(BITNetworkCompletionBlock) completion;
/**
* Creates an operation for the given path, and enqueues it
*
* @param path the request path to check
* @param params parameters for the request
* @param completion completionBlock that is called once the operation finished
*
*/
- (void) postPath:(NSString*) path
parameters:(NSDictionary *) params
completion:(BITNetworkCompletionBlock) completion;
/**
* adds the given operation to the internal queue
*
* @param operation operation to add
*/
- (void) enqeueHTTPOperation:(BITHTTPOperation *) operation;
/**
* cancels the specified operations
*
* @param path the path which operation should be cancelled. Can be nil to match all
* @param method the method which operations to cancel. Can be nil to match all
* @return number of operations cancelled
*/
- (NSUInteger) cancelOperationsWithPath:(NSString*) path
method:(NSString*) method;
@end

View File

@ -37,7 +37,7 @@
#import "BITHockeyManagerPrivate.h"
#import "BITHockeyHelper.h"
#import "BITHockeyAppClient.h"
#define kBITFeedbackUserDataAsked @"HockeyFeedbackUserDataAsked"
#define kBITFeedbackDateOfLastCheck @"HockeyFeedbackDateOfLastCheck"
@ -749,27 +749,27 @@
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[self appendPostValue:@"Apple" forKey:@"oem"]];
[postBody appendData:[self appendPostValue:[[UIDevice currentDevice] systemVersion] forKey:@"os_version"]];
[postBody appendData:[self appendPostValue:[self getDevicePlatform] forKey:@"model"]];
[postBody appendData:[self appendPostValue:[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0] forKey:@"lang"]];
[postBody appendData:[self appendPostValue:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] forKey:@"bundle_version"]];
[postBody appendData:[self appendPostValue:[message text] forKey:@"text"]];
[postBody appendData:[self appendPostValue:[message token] forKey:@"message_token"]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:@"Apple" forKey:@"oem" boundary:boundary]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:[[UIDevice currentDevice] systemVersion] forKey:@"os_version" boundary:boundary]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:[self getDevicePlatform] forKey:@"model" boundary:boundary]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0] forKey:@"lang" boundary:boundary]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] forKey:@"bundle_version" boundary:boundary]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:[message text] forKey:@"text" boundary:boundary]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:[message token] forKey:@"message_token" boundary:boundary]];
NSString *installString = bit_appAnonID();
if (installString) {
[postBody appendData:[self appendPostValue:installString forKey:@"install_string"]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:installString forKey:@"install_string" boundary:boundary]];
}
if (self.userID) {
[postBody appendData:[self appendPostValue:self.userID forKey:@"user_string"]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:self.userID forKey:@"user_string" boundary:boundary]];
}
if (self.userName) {
[postBody appendData:[self appendPostValue:self.userName forKey:@"name"]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:self.userName forKey:@"name" boundary:boundary]];
}
if (self.userEmail) {
[postBody appendData:[self appendPostValue:self.userEmail forKey:@"email"]];
[postBody appendData:[BITHockeyAppClient dataWithPostValue:self.userEmail forKey:@"email" boundary:boundary]];
}
[postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

View File

@ -0,0 +1,108 @@
//
// BITHockeyAppClient.h
// HockeySDK
//
// Created by Stephan Diederich on 06.09.13.
//
//
#import <Foundation/Foundation.h>
#import "BITHTTPOperation.h" //needed for typedef
@interface BITHockeyAppClient : NSObject
/**
* designated initializer
*
* @param baseURL the baseURL of the HockeyApp instance
*/
- (instancetype) initWithBaseURL:(NSURL*) baseURL;
/**
* baseURL to which relative paths are appended
*/
@property (nonatomic, strong) NSURL *baseURL;
/**
* creates an NRURLRequest for the given method and path by using
* the internally stored baseURL.
*
* @param method the HTTPMethod to check, must not be nil
* @param params parameters for the request (only supported for GET and POST for now)
* @param path path to append to baseURL. can be nil in which case "/" is appended
*
* @return an NSMutableURLRequest for further configuration
*/
- (NSMutableURLRequest *) requestWithMethod:(NSString*) method
path:(NSString *) path
parameters:(NSDictionary *) params;
/**
* Creates an operation for the given NSURLRequest
*
* @param request the request that should be handled
* @param completion completionBlock that is called once the operation finished
*
* @return operation, which can be queued via enqueueHTTPOperation:
*/
- (BITHTTPOperation*) operationWithURLRequest:(NSURLRequest*) request
completion:(BITNetworkCompletionBlock) completion;
/**
* Creates an operation for the given path, and enqueues it
*
* @param path the request path to check
* @param params parameters for the request
* @param completion completionBlock that is called once the operation finished
*
*/
- (void) getPath:(NSString*) path
parameters:(NSDictionary *) params
completion:(BITNetworkCompletionBlock) completion;
/**
* Creates an operation for the given path, and enqueues it
*
* @param path the request path to check
* @param params parameters for the request
* @param completion completionBlock that is called once the operation finished
*
*/
- (void) postPath:(NSString*) path
parameters:(NSDictionary *) params
completion:(BITNetworkCompletionBlock) completion;
/**
* adds the given operation to the internal queue
*
* @param operation operation to add
*/
- (void) enqeueHTTPOperation:(BITHTTPOperation *) operation;
/**
* cancels the specified operations
*
* @param path the path which operation should be cancelled. Can be nil to match all
* @param method the method which operations to cancel. Can be nil to match all
* @return number of operations cancelled
*/
- (NSUInteger) cancelOperationsWithPath:(NSString*) path
method:(NSString*) method;
/**
* Access to the internal operation queue
*/
@property (nonatomic, strong) NSOperationQueue *operationQueue;
#pragma mark - Helpers
/**
* create a post body from the given value, key and boundary
* c/p from HockeyBaseManager
*
* @param value -
* @param key -
* @param boundary -
*
* @return NSData instance configured to be attached on a (post) URLRequest
*/
+ (NSData *)dataWithPostValue:(NSString *)value forKey:(NSString *)key boundary:(NSString *) boundary;
@end

View File

@ -0,0 +1,153 @@
//
// BITHockeyAppClient.m
// HockeySDK
//
// Created by Stephan Diederich on 06.09.13.
//
//
#import "BITHockeyAppClient.h"
@implementation BITHockeyAppClient
- (void)dealloc {
[self cancelOperationsWithPath:nil method:nil];
}
- (instancetype)initWithBaseURL:(NSURL *)baseURL {
self = [super init];
if ( self ) {
NSParameterAssert(baseURL);
_baseURL = baseURL;
}
return self;
}
#pragma mark - Networking
- (NSMutableURLRequest *) requestWithMethod:(NSString*) method
path:(NSString *) path
parameters:(NSDictionary *)params {
NSParameterAssert(self.baseURL);
NSParameterAssert(method);
NSParameterAssert(params == nil || [method isEqualToString:@"POST"] || [method isEqualToString:@"GET"]);
path = path ? : @"";
NSURL *endpoint = [self.baseURL URLByAppendingPathComponent:path];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:endpoint];
request.HTTPMethod = method;
if (params) {
if ([method isEqualToString:@"GET"]) {
NSString *absoluteURLString = [endpoint absoluteString];
//either path already has parameters, or not
NSString *appenderFormat = [path rangeOfString:@"?"].location == NSNotFound ? @"?%@" : @"&%@";
endpoint = [NSURL URLWithString:[absoluteURLString stringByAppendingFormat:appenderFormat,
[self.class queryStringFromParameters:params withEncoding:NSUTF8StringEncoding]]];
[request setURL:endpoint];
} else {
//TODO: this is crap. Boundary must be the same as the one in appendData
//unify this!
NSString *boundary = @"----FOO";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request setValue:contentType forHTTPHeaderField:@"Content-type"];
NSMutableData *postBody = [NSMutableData data];
[params enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
[postBody appendData:[[self class] dataWithPostValue:value forKey:key boundary:boundary]];
}];
[postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];
}
}
return request;
}
+ (NSData *)dataWithPostValue:(NSString *)value forKey:(NSString *)key boundary:(NSString *) boundary {
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\";\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"Content-Type: text\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
return postBody;
}
+ (NSString *) queryStringFromParameters:(NSDictionary *) params withEncoding:(NSStringEncoding) encoding {
NSMutableString *queryString = [NSMutableString new];
[params enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL *stop) {
NSAssert([key isKindOfClass:[NSString class]], @"Query parameters can only be string-string pairs");
NSAssert([value isKindOfClass:[NSString class]], @"Query parameters can only be string-string pairs");
[queryString appendFormat:queryString.length ? @"&%@=%@" : @"%@=%@", key, value];
}];
return queryString;
}
- (BITHTTPOperation*) operationWithURLRequest:(NSURLRequest*) request
completion:(BITNetworkCompletionBlock) completion {
BITHTTPOperation *operation = [BITHTTPOperation operationWithRequest:request
];
[operation setCompletion:completion];
return operation;
}
- (void)getPath:(NSString *)path parameters:(NSDictionary *)params completion:(BITNetworkCompletionBlock)completion {
NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:params];
BITHTTPOperation *op = [self operationWithURLRequest:request
completion:completion];
[self enqeueHTTPOperation:op];
}
- (void)postPath:(NSString *)path parameters:(NSDictionary *)params completion:(BITNetworkCompletionBlock)completion {
NSURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:params];
BITHTTPOperation *op = [self operationWithURLRequest:request
completion:completion];
[self enqeueHTTPOperation:op];
}
- (void) enqeueHTTPOperation:(BITHTTPOperation *) operation {
[self.operationQueue addOperation:operation];
}
- (NSUInteger) cancelOperationsWithPath:(NSString*) path
method:(NSString*) method {
NSUInteger cancelledOperations = 0;
for(BITHTTPOperation *operation in self.operationQueue.operations) {
NSURLRequest *request = operation.URLRequest;
BOOL matchedMethod = YES;
if(method && ![request.HTTPMethod isEqualToString:method]) {
matchedMethod = NO;
}
BOOL matchedPath = YES;
if(path) {
//method is not interesting here, we' just creating it to get the URL
NSURL *url = [self requestWithMethod:@"GET" path:path parameters:nil].URL;
matchedPath = [request.URL isEqual:url];
}
if(matchedPath && matchedMethod) {
++cancelledOperations;
[operation cancel];
}
}
return cancelledOperations;
}
- (NSOperationQueue *)operationQueue {
if(nil == _operationQueue) {
_operationQueue = [[NSOperationQueue alloc] init];
_operationQueue.maxConcurrentOperationCount = 1;
}
return _operationQueue;
}
@end

View File

@ -291,24 +291,6 @@
- (void)startManager {
}
#pragma mark - Networking
- (NSData *)appendPostValue:(NSString *)value forKey:(NSString *)key {
NSString *boundary = @"----FOO";
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\";\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"Content-Type: text\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
return postBody;
}
#pragma mark - Helpers
- (NSDate *)parseRFC3339Date:(NSString *)dateString {

View File

@ -49,9 +49,6 @@
- (UIWindow *)findVisibleWindow;
- (void)showView:(UIViewController *)viewController;
/** Network helpers */
- (NSData *)appendPostValue:(NSString *)value forKey:(NSString *)key;
/** Date helpers */
- (NSDate *)parseRFC3339Date:(NSString *)dateString;

View File

@ -36,6 +36,7 @@
#import "BITStoreUpdateManagerPrivate.h"
#import "BITFeedbackManagerPrivate.h"
#import "BITAuthenticator_Private.h"
#import "BITHockeyAppClient.h"
@interface BITHockeyManager ()
@ -247,6 +248,7 @@
if (_serverURL != aServerURL) {
_serverURL = [aServerURL copy];
_authenticator.hockeyAppClient.baseURL = [NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL];
}
}
@ -302,7 +304,9 @@
_feedbackManager.delegate = _delegate;
BITHockeyLog(@"INFO: Setup Authenticator");
BITHockeyAppClient *client = [[BITHockeyAppClient alloc] initWithBaseURL:[NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]];
_authenticator = [[BITAuthenticator alloc] initWithAppIdentifier:_appIdentifier isAppStoreEnvironemt:_appStoreEnvironment];
_authenticator.hockeyAppClient = client;
_authenticator.delegate = _delegate;
#if JIRA_MOBILE_CONNECT_SUPPORT_ENABLED

View File

@ -127,6 +127,9 @@
1EF95CA7162CB037000AE3AD /* BITFeedbackActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */; };
1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF95CA9162CB313000AE3AD /* BITFeedbackComposeViewControllerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
E405266217A2AD300096359C /* BITFeedbackManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E405266117A2AD300096359C /* BITFeedbackManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
E40E0B0917DA19DC005E38C1 /* BITHockeyAppClientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E40E0B0817DA19DC005E38C1 /* BITHockeyAppClientTests.m */; };
E40E0B0C17DA1AFF005E38C1 /* BITHockeyAppClient.h in Headers */ = {isa = PBXBuildFile; fileRef = E40E0B0A17DA1AFF005E38C1 /* BITHockeyAppClient.h */; };
E40E0B0D17DA1AFF005E38C1 /* BITHockeyAppClient.m in Sources */ = {isa = PBXBuildFile; fileRef = E40E0B0B17DA1AFF005E38C1 /* BITHockeyAppClient.m */; };
E48A3DEC17B3ED1C00924C3D /* BITAuthenticator.h in Headers */ = {isa = PBXBuildFile; fileRef = E48A3DEA17B3ED1C00924C3D /* BITAuthenticator.h */; settings = {ATTRIBUTES = (Public, ); }; };
E48A3DED17B3ED1C00924C3D /* BITAuthenticator.m in Sources */ = {isa = PBXBuildFile; fileRef = E48A3DEB17B3ED1C00924C3D /* BITAuthenticator.m */; };
E48A3DEF17B3EFF100924C3D /* BITAuthenticatorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E48A3DEE17B3EFF100924C3D /* BITAuthenticatorTests.m */; };
@ -276,6 +279,9 @@
BEE0207C16C5107E004426EA /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/HockeySDK.strings; sourceTree = "<group>"; };
E400561D148D79B500EB22B9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
E405266117A2AD300096359C /* BITFeedbackManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManagerDelegate.h; sourceTree = "<group>"; };
E40E0B0817DA19DC005E38C1 /* BITHockeyAppClientTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyAppClientTests.m; sourceTree = "<group>"; };
E40E0B0A17DA1AFF005E38C1 /* BITHockeyAppClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyAppClient.h; sourceTree = "<group>"; };
E40E0B0B17DA1AFF005E38C1 /* BITHockeyAppClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyAppClient.m; sourceTree = "<group>"; };
E41EB465148D7BF50015DEDC /* BITHockeyManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManager.h; sourceTree = "<group>"; };
E41EB466148D7BF50015DEDC /* BITHockeyManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyManager.m; sourceTree = "<group>"; };
E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CrashReporter.framework; path = ../Vendor/CrashReporter.framework; sourceTree = "<group>"; };
@ -356,6 +362,7 @@
1E5A459716F0DFC200B55C04 /* Supporting Files */,
1E5A459D16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m */,
E48A3DEE17B3EFF100924C3D /* BITAuthenticatorTests.m */,
E40E0B0817DA19DC005E38C1 /* BITHockeyAppClientTests.m */,
);
path = HockeySDKTests;
sourceTree = "<group>";
@ -558,6 +565,8 @@
E48A3DF017B408D800924C3D /* private */,
E48A3DEA17B3ED1C00924C3D /* BITAuthenticator.h */,
E48A3DEB17B3ED1C00924C3D /* BITAuthenticator.m */,
E40E0B0A17DA1AFF005E38C1 /* BITHockeyAppClient.h */,
E40E0B0B17DA1AFF005E38C1 /* BITHockeyAppClient.m */,
);
name = Network;
sourceTree = "<group>";
@ -593,6 +602,7 @@
1E49A4481612223B00463151 /* BITFeedbackListViewController.h in Headers */,
1E49A47F1612226D00463151 /* BITUpdateViewController.h in Headers */,
1E49A43C1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */,
E40E0B0C17DA1AFF005E38C1 /* BITHockeyAppClient.h in Headers */,
1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */,
1EF95CA6162CB037000AE3AD /* BITFeedbackActivity.h in Headers */,
1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */,
@ -817,6 +827,7 @@
files = (
1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */,
1E49A43F1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */,
E40E0B0D17DA1AFF005E38C1 /* BITHockeyAppClient.m in Sources */,
1E49A4451612223B00463151 /* BITFeedbackListViewCell.m in Sources */,
1E49A44B1612223B00463151 /* BITFeedbackListViewController.m in Sources */,
1E49A4511612223B00463151 /* BITFeedbackManager.m in Sources */,
@ -856,6 +867,7 @@
buildActionMask = 2147483647;
files = (
1E5A459E16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m in Sources */,
E40E0B0917DA19DC005E38C1 /* BITHockeyAppClientTests.m in Sources */,
E48A3DEF17B3EFF100924C3D /* BITAuthenticatorTests.m in Sources */,
1EA1170716F53B91001C015C /* BITTestHelper.m in Sources */,
);

File diff suppressed because it is too large Load Diff

View File

@ -41,7 +41,6 @@
}
- (void)tearDown {
[_sut cancelOperationsWithPath:nil method:nil];
[_sut cleanupInternalStorage];
_sut = nil;
@ -279,177 +278,4 @@
[verifyCount(delegateMock, times(1)) authenticatorDidValidateInstallation:_sut];
}
#pragma mark - Networking base tests
- (void) testThatURLRequestHasBaseURLSet {
_sut.serverURL = @"http://myserver.com";
NSMutableURLRequest *request = [_sut requestWithMethod:@"GET" path:nil parameters:nil];
assertThat(request.URL, equalTo([NSURL URLWithString:@"http://myserver.com/"]));
}
- (void) testThatURLRequestHasPathAppended {
_sut.serverURL = @"http://myserver.com";
NSMutableURLRequest *request = [_sut requestWithMethod:@"GET" path:@"projects" parameters:nil];
assertThat(request.URL, equalTo([NSURL URLWithString:@"http://myserver.com/projects"]));
}
- (void) testThatURLRequestHasMethodSet {
NSMutableURLRequest *request = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
assertThat(request.HTTPMethod, equalTo(@"POST"));
}
- (void) testThatOperationHasURLRequestSet {
_sut.serverURL = @"http://myserver.com";
NSURLRequest *r = [_sut requestWithMethod:@"PUT" path:@"x" parameters:nil];
BITHTTPOperation *op = [_sut operationWithURLRequest:r
completion:nil];
assertThat(op.URLRequest, equalTo(r));
}
- (void) testThatURLRequestHasParametersInGetAppended {
NSDictionary *parameters = @{
@"email" : @"peter@pan.de",
@"push" : @"pop",
};
NSMutableURLRequest *request = [_sut requestWithMethod:@"GET"
path:@"something"
parameters:parameters];
NSURL *url = request.URL;
NSString *params = [url query];
NSArray *paramPairs = [params componentsSeparatedByString:@"&"];
assertThat(paramPairs, hasCountOf(2));
NSMutableDictionary *dict = [NSMutableDictionary new];
for(NSString *paramPair in paramPairs) {
NSArray *a = [paramPair componentsSeparatedByString:@"="];
assertThat(a, hasCountOf(2));
dict[a[0]] = a[1];
}
assertThat(dict, equalTo(parameters));
}
- (void) testThatURLRequestHasParametersInPostInTheBody {
//pending
}
#pragma mark - Convenience methods
- (void) testThatGetPathCreatesAndEnquesAnOperation {
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0));
[given([_sut operationWithURLRequest:(id)anything()
completion:nil]) willReturn:[NSOperation new]];
[_sut getPath:@"endpoint"
parameters:nil
completion:nil];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1));
}
- (void) testThatPostPathCreatesAndEnquesAnOperation {
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0));
[given([_sut operationWithURLRequest:nil
completion:nil]) willReturn:[NSOperation new]];
[_sut postPath:@"endpoint"
parameters:nil
completion:nil];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1));
}
#pragma mark - Completion Tests
- (void) testThatCompletionIsCalled {
//TODO
}
#pragma mark - HTTPOperation enqueuing / cancellation
- (void) testThatOperationIsQueued {
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0));
[_sut.operationQueue setSuspended:YES];
BITHTTPOperation *op = [BITHTTPOperation new];
[_sut enqeueHTTPOperation:op];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithNilMethod {
[_sut.operationQueue setSuspended:YES];
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:nil parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:nil parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:nil];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(3));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithNilPath {
[_sut.operationQueue setSuspended:YES];
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:@"test" parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:@"Another/acas" parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:nil];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(3));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithSetPath {
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:@"test" parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:@"Another/acas" parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut.operationQueue setSuspended:YES];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:@"Another/acas" method:nil];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithSetMethod {
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:@"test" parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:@"Another/acas" parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:@"POST"];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithSetMethodAndPath {
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:@"test" parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:@"Another/acas" parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:@"Another/acas" method:@"PUT"];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1));
}
#pragma mark - Operation Testing
@end

View File

@ -0,0 +1,231 @@
//
// BITHockeyAppClientTests
// HockeySDKTests
//
// Created by Stephan Diederich on 06.09.13.
//
//
#import <SenTestingKit/SenTestingKit.h>
#define HC_SHORTHAND
#import <OCHamcrestIOS/OCHamcrestIOS.h>
#define MOCKITO_SHORTHAND
#import <OCMockitoIOS/OCMockitoIOS.h>
#import "HockeySDK.h"
#import "BITHockeyAppClient.h"
#import "BITHTTPOperation.h"
#import "BITTestHelper.h"
@interface BITHockeyAppClientTests : SenTestCase
@end
@implementation BITHockeyAppClientTests {
BITHockeyAppClient *_sut;
}
- (void)setUp {
[super setUp];
_sut = [[BITHockeyAppClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://bitbaseurl.com"]];
}
- (void)tearDown {
[_sut cancelOperationsWithPath:nil method:nil];
_sut = nil;
[super tearDown];
}
#pragma mark - Setup helpers
- (NSDictionary *)jsonFromFixture:(NSString *)fixture {
NSString *dataString = [BITTestHelper jsonFixture:fixture];
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
return json;
}
#pragma mark - Setup Tests
- (void) testThatItInstantiates {
STAssertNotNil(_sut, @"Should be there");
}
#pragma mark - Networking base tests
- (void) testThatURLRequestHasBaseURLSet {
_sut.baseURL = [NSURL URLWithString:@"http://myserver.com"];
NSMutableURLRequest *request = [_sut requestWithMethod:@"GET" path:nil parameters:nil];
assertThat(request.URL, equalTo([NSURL URLWithString:@"http://myserver.com/"]));
}
- (void) testThatURLRequestHasPathAppended {
_sut.baseURL = [NSURL URLWithString:@"http://myserver.com"];
NSMutableURLRequest *request = [_sut requestWithMethod:@"GET" path:@"projects" parameters:nil];
assertThat(request.URL, equalTo([NSURL URLWithString:@"http://myserver.com/projects"]));
}
- (void) testThatURLRequestHasMethodSet {
NSMutableURLRequest *request = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
assertThat(request.HTTPMethod, equalTo(@"POST"));
}
- (void) testThatOperationHasURLRequestSet {
_sut.baseURL = [NSURL URLWithString:@"http://myserver.com"];
NSURLRequest *r = [_sut requestWithMethod:@"PUT" path:@"x" parameters:nil];
BITHTTPOperation *op = [_sut operationWithURLRequest:r
completion:nil];
assertThat(op.URLRequest, equalTo(r));
}
- (void) testThatURLRequestHasParametersInGetAppended {
NSDictionary *parameters = @{
@"email" : @"peter@pan.de",
@"push" : @"pop",
};
NSMutableURLRequest *request = [_sut requestWithMethod:@"GET"
path:@"something"
parameters:parameters];
NSURL *url = request.URL;
NSString *params = [url query];
NSArray *paramPairs = [params componentsSeparatedByString:@"&"];
assertThat(paramPairs, hasCountOf(2));
NSMutableDictionary *dict = [NSMutableDictionary new];
for(NSString *paramPair in paramPairs) {
NSArray *a = [paramPair componentsSeparatedByString:@"="];
assertThat(a, hasCountOf(2));
dict[a[0]] = a[1];
}
assertThat(dict, equalTo(parameters));
}
- (void) testThatURLRequestHasParametersInPostInTheBody {
//pending
}
#pragma mark - Convenience methods
- (void) testThatGetPathCreatesAndEnquesAnOperation {
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0));
[given([_sut operationWithURLRequest:(id)anything()
completion:nil]) willReturn:[NSOperation new]];
[_sut getPath:@"endpoint"
parameters:nil
completion:nil];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1));
}
- (void) testThatPostPathCreatesAndEnquesAnOperation {
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0));
[given([_sut operationWithURLRequest:nil
completion:nil]) willReturn:[NSOperation new]];
[_sut postPath:@"endpoint"
parameters:nil
completion:nil];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1));
}
#pragma mark - Completion Tests
- (void) testThatCompletionIsCalled {
//TODO
}
#pragma mark - HTTPOperation enqueuing / cancellation
- (void) testThatOperationIsQueued {
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0));
[_sut.operationQueue setSuspended:YES];
BITHTTPOperation *op = [BITHTTPOperation new];
[_sut enqeueHTTPOperation:op];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithNilMethod {
[_sut.operationQueue setSuspended:YES];
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:nil parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:nil parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:nil];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(3));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithNilPath {
[_sut.operationQueue setSuspended:YES];
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:@"test" parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:@"Another/acas" parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:nil];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(3));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithSetPath {
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:@"test" parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:@"Another/acas" parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut.operationQueue setSuspended:YES];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:@"Another/acas" method:nil];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithSetMethod {
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:@"test" parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:@"Another/acas" parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:@"POST"];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1));
}
- (void) testThatOperationCancellingMatchesAllOperationsWithSetMethodAndPath {
NSURLRequest *requestGet = [_sut requestWithMethod:@"GET" path:@"test" parameters:nil];
NSURLRequest *requestPut = [_sut requestWithMethod:@"PUT" path:@"Another/acas" parameters:nil];
NSURLRequest *requestPost = [_sut requestWithMethod:@"POST" path:nil parameters:nil];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestGet
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPut
completion:nil]];
[_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost
completion:nil]];
assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3));
NSUInteger numCancelled = [_sut cancelOperationsWithPath:@"Another/acas" method:@"PUT"];
assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1));
}
#pragma mark - Operation Testing
@end