Javier Cicchelli 9bcdaa697b [Setup] Basic project structure (#1)
This PR contains all the work related to setting up this project as required to implement the [Assignment](https://repo.rock-n-code.com/rock-n-code/deep-linking-assignment/wiki/Assignment) on top, as intended.

To summarise this work:
- [x] created a new **Xcode** project;
- [x] cloned the `Wikipedia` app and inserted it into the **Xcode** project;
- [x] created the `Locations` app and also, its `Libraries` package;
- [x] created the `Shared` package to share dependencies between the apps;
- [x] added a `Makefile` file and implemented some **environment** and **help** commands.

Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Reviewed-on: rock-n-code/deep-linking-assignment#1
2023-04-08 18:37:13 +00:00

131 lines
3.4 KiB
Objective-C

#import "LSStubRequest.h"
#import "LSMatcher.h"
#import "NSString+Matcheable.h"
@interface LSStubRequest ()
@property (nonatomic, strong, readwrite) NSString *method;
@property (nonatomic, strong, readwrite) LSMatcher *urlMatcher;
@property (nonatomic, strong, readwrite) NSMutableDictionary *mutableHeaders;
-(BOOL)matchesMethod:(id<LSHTTPRequest>)request;
-(BOOL)matchesURL:(id<LSHTTPRequest>)request;
-(BOOL)matchesHeaders:(id<LSHTTPRequest>)request;
-(BOOL)matchesBody:(id<LSHTTPRequest>)request;
@end
@implementation LSStubRequest
- (instancetype)initWithMethod:(NSString *)method url:(NSString *)url {
return [self initWithMethod:method urlMatcher:[url matcher]];
}
- (instancetype)initWithMethod:(NSString *)method urlMatcher:(LSMatcher *)urlMatcher; {
self = [super init];
if (self) {
self.method = method;
self.urlMatcher = urlMatcher;
self.mutableHeaders = [NSMutableDictionary dictionary];
}
return self;
}
- (void)setHeader:(NSString *)header value:(NSString *)value {
[self.mutableHeaders setValue:value forKey:header];
}
- (NSDictionary *)headers {
return [NSDictionary dictionaryWithDictionary:self.mutableHeaders];;
}
- (NSString *)description {
return [NSString stringWithFormat:@"StubRequest:\nMethod: %@\nURL: %@\nHeaders: %@\nBody: %@\nResponse: %@",
self.method,
self.urlMatcher,
self.headers,
self.body,
self.response];
}
- (LSStubResponse *)response {
if (!_response) {
_response = [[LSStubResponse alloc] initDefaultResponse];
}
return _response;
}
- (BOOL)matchesRequest:(id<LSHTTPRequest>)request {
if ([self matchesMethod:request]
&& [self matchesURL:request]
&& [self matchesHeaders:request]
&& [self matchesBody:request]
) {
return YES;
}
return NO;
}
-(BOOL)matchesMethod:(id<LSHTTPRequest>)request {
if (!self.method || [self.method isEqualToString:request.method]) {
return YES;
}
return NO;
}
-(BOOL)matchesURL:(id<LSHTTPRequest>)request {
return [self.urlMatcher matches:[request.url absoluteString]];
}
-(BOOL)matchesHeaders:(id<LSHTTPRequest>)request {
for (NSString *header in self.headers) {
if (![[request.headers objectForKey:header] isEqualToString:[self.headers objectForKey:header]]) {
return NO;
}
}
return YES;
}
-(BOOL)matchesBody:(id<LSHTTPRequest>)request {
NSData *reqBody = request.body;
if (!self.body || [self.body matchesData:reqBody]) {
return YES;
}
return NO;
}
#pragma mark - Equality
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[LSStubRequest class]]) {
return NO;
}
return [self isEqualToStubRequest:object];
}
- (BOOL)isEqualToStubRequest:(LSStubRequest *)stubRequest {
if (!stubRequest) {
return NO;
}
BOOL methodEqual = [self.method isEqualToString:stubRequest.method];
BOOL urlMatcherEqual = [self.urlMatcher isEqual:stubRequest.urlMatcher];
BOOL headersEqual = [self.headers isEqual:stubRequest.headers];
BOOL bodyEqual = (self.body == nil && stubRequest.body == nil) || [self.body isEqual:stubRequest.body];
return methodEqual && urlMatcherEqual && headersEqual && bodyEqual;
}
- (NSUInteger)hash {
return self.method.hash ^ self.urlMatcher.hash ^ self.headers.hash ^ self.body.hash;
}
@end