119 lines
3.0 KiB
Objective-C

#import "LSNocilla.h"
#import "LSNSURLHook.h"
#import "LSStubRequest.h"
#import "LSHTTPRequestDSLRepresentation.h"
#import "LSASIHTTPRequestHook.h"
#import "LSNSURLSessionHook.h"
#import "LSASIHTTPRequestHook.h"
NSString * const LSUnexpectedRequest = @"Unexpected Request";
@interface LSNocilla ()
@property (nonatomic, strong) NSMutableArray *mutableRequests;
@property (nonatomic, strong) NSMutableArray *hooks;
@property (nonatomic, assign, getter = isStarted) BOOL started;
- (void)loadHooks;
- (void)unloadHooks;
@end
static LSNocilla *sharedInstace = nil;
@implementation LSNocilla
+ (LSNocilla *)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstace = [[self alloc] init];
});
return sharedInstace;
}
- (id)init {
self = [super init];
if (self) {
_mutableRequests = [NSMutableArray array];
_hooks = [NSMutableArray array];
[self registerHook:[[LSNSURLHook alloc] init]];
if (NSClassFromString(@"NSURLSession") != nil) {
[self registerHook:[[LSNSURLSessionHook alloc] init]];
}
[self registerHook:[[LSASIHTTPRequestHook alloc] init]];
}
return self;
}
- (NSArray *)stubbedRequests {
return [NSArray arrayWithArray:self.mutableRequests];
}
- (void)start {
if (!self.isStarted){
[self loadHooks];
self.started = YES;
}
}
- (void)stop {
[self unloadHooks];
[self clearStubs];
self.started = NO;
}
- (void)addStubbedRequest:(LSStubRequest *)request {
NSUInteger index = [self.mutableRequests indexOfObject:request];
if (index == NSNotFound) {
[self.mutableRequests addObject:request];
return;
}
[self.mutableRequests replaceObjectAtIndex:index withObject:request];
}
- (void)clearStubs {
[self.mutableRequests removeAllObjects];
}
- (LSStubResponse *)responseForRequest:(id<LSHTTPRequest>)actualRequest {
NSArray* requests = [LSNocilla sharedInstance].stubbedRequests;
for(LSStubRequest *someStubbedRequest in requests) {
if ([someStubbedRequest matchesRequest:actualRequest]) {
return someStubbedRequest.response;
}
}
[NSException raise:@"NocillaUnexpectedRequest" format:@"An unexpected HTTP request was fired.\n\nUse this snippet to stub the request:\n%@\n", [[[LSHTTPRequestDSLRepresentation alloc] initWithRequest:actualRequest] description]];
return nil;
}
- (void)registerHook:(LSHTTPClientHook *)hook {
if (![self hookWasRegistered:hook]) {
[[self hooks] addObject:hook];
}
}
- (BOOL)hookWasRegistered:(LSHTTPClientHook *)aHook {
for (LSHTTPClientHook *hook in self.hooks) {
if ([hook isMemberOfClass: [aHook class]]) {
return YES;
}
}
return NO;
}
#pragma mark - Private
- (void)loadHooks {
for (LSHTTPClientHook *hook in self.hooks) {
[hook load];
}
}
- (void)unloadHooks {
for (LSHTTPClientHook *hook in self.hooks) {
[hook unload];
}
}
@end