#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)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