Moving tests around

This commit is contained in:
Blake Watters
2012-10-14 13:51:08 -04:00
parent f3ece00743
commit 1beb11ac1b
6 changed files with 855 additions and 1118 deletions

View File

@@ -0,0 +1,21 @@
//
// RKManagedObjectRequestOperationTest.m
// RestKit
//
// Created by Blake Watters on 10/10/12.
// Copyright (c) 2012 RestKit. All rights reserved.
//
#import "RKTestEnvironment.h"
@interface RKManagedObjectRequestOperationTest : RKTestCase
@end
@implementation RKManagedObjectRequestOperationTest
- (void)testThatTargetObjectIsRefreshedWhenStoreIsSavedSuccessfully
{
}
@end

View File

@@ -0,0 +1,814 @@
//
// RKObjectRequestOperationTest.m
// RestKit
//
// Created by Blake Watters on 10/14/12.
// Copyright (c) 2012 RestKit. All rights reserved.
//
#import "RKTestEnvironment.h"
@interface RKObjectRequestOperationTest : RKTestCase
@end
@implementation RKObjectRequestOperationTest
- (void)testThatObjectRequestOperationResultsInRefreshedPropertiesAfterMapping
{
}
- (void)testCancellationOfObjectRequestOperationCancelsMapping
{
}
@end
//#import "RKObjectMappingProvider.h"
//#import "RKErrorMessage.h"
//#import "RKJSONParserJSONKit.h"
//
//// Models
//#import "RKObjectLoaderTestResultModel.h"
//
//@interface RKTestComplexUser : NSObject {
// NSNumber *_userID;
// NSString *_firstname;
// NSString *_lastname;
// NSString *_email;
// NSString *_phone;
//}
//
//@property (nonatomic, retain) NSNumber *userID;
//@property (nonatomic, retain) NSString *firstname;
//@property (nonatomic, retain) NSString *lastname;
//@property (nonatomic, retain) NSString *email;
//@property (nonatomic, retain) NSString *phone;
//
//@end
//
//@implementation RKTestComplexUser
//
//@synthesize userID = _userID;
//@synthesize firstname = _firstname;
//@synthesize lastname = _lastname;
//@synthesize phone = _phone;
//@synthesize email = _email;
//
//- (void)willSendWithObjectLoader:(RKObjectLoader *)objectLoader
//{
// return;
//}
//
//@end
//
//@interface RKTestResponseLoaderWithWillMapData : RKTestResponseLoader {
// id _mappableData;
//}
//
//@property (nonatomic, readonly) id mappableData;
//
//@end
//
//@implementation RKTestResponseLoaderWithWillMapData
//
//@synthesize mappableData = _mappableData;
//
//- (void)dealloc
//{
// [_mappableData release];
// [super dealloc];
//}
//
//- (void)objectLoader:(RKObjectLoader *)loader willMapData:(inout id *)mappableData
//{
// [*mappableData setValue:@"monkey!" forKey:@"newKey"];
// _mappableData = [*mappableData retain];
//}
//
//@end
//
///////////////////////////////////////////////////////////////////////////////
//
//@interface RKObjectLoaderTest : RKTestCase {
//
//}
//
//@end
//
//@implementation RKObjectLoaderTest
//
//- (void)setUp
//{
// [RKTestFactory setUp];
//}
//
//- (void)tearDown
//{
// [RKTestFactory tearDown];
//}
//
//- (RKObjectMappingProvider *)providerForComplexUser
//{
// NSMutableDictionary *mappingDictionary = [NSMutableDictionary dictionary];
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// [userMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"firstname" toKeyPath:@"firstname"]];
// [mappingsDictionary setObject:userMapping forKey:@"data.STUser"];
// return provider;
//}
//
//- (RKObjectMappingProvider *)errorMappingProvider
//{
// NSMutableDictionary *mappingDictionary = [NSMutableDictionary dictionary];
// RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
// [errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"" toKeyPath:@"errorMessage"]];
// errorMapping.rootKeyPath = @"errors";
// provider.errorMapping = errorMapping;
// return provider;
//}
//
//- (void)testShouldHandleTheErrorCaseAppropriately
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// objectManager.mappingProvider = [self errorMappingProvider];
//
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/errors.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
//
// assertThat(responseLoader.error, isNot(nilValue()));
// assertThat([responseLoader.error localizedDescription], is(equalTo(@"error1, error2")));
//
// NSArray *objects = [[responseLoader.error userInfo] objectForKey:RKObjectMapperErrorObjectsKey];
// RKErrorMessage *error1 = [objects objectAtIndex:0];
// RKErrorMessage *error2 = [objects lastObject];
//
// assertThat(error1.errorMessage, is(equalTo(@"error1")));
// assertThat(error2.errorMessage, is(equalTo(@"error2")));
//}
//
//- (void)testShouldNotCrashWhenLoadingAnErrorResponseWithAnUnmappableMIMEType
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// RKTestResponseLoader *loader = [RKTestResponseLoader responseLoader];
// [objectManager loadObjectsAtResourcePath:@"/404" delegate:loader];
// [loader waitForResponse];
// assertThatBool(loader.loadedUnexpectedResponse, is(equalToBool(YES)));
//}
//
//#pragma mark - Complex JSON
//
//- (void)testShouldLoadAComplexUserObjectWithTargetObject
//{
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// NSString *authString = [NSString stringWithFormat:@"TRUEREST username=%@&password=%@&apikey=123456&class=iphone", @"username", @"password"];
// [objectLoader.URLRequest addValue:authString forHTTPHeaderField:@"Authorization"];
// objectLoader.method = RKRequestMethodGET;
// objectLoader.targetObject = user;
// objectLoader.mappingProvider = [self providerForComplexUser];
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
//
// assertThat(user.firstname, is(equalTo(@"Diego")));
//}
//
//- (void)testShouldLoadAComplexUserObjectWithoutTargetObject
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.mappingProvider = [self providerForComplexUser];
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// assertThatUnsignedInteger([responseLoader.objects count], is(equalToInt(1)));
// RKTestComplexUser *user = [responseLoader.objects lastObject];
//
// assertThat(user.firstname, is(equalTo(@"Diego")));
//}
//
//- (void)testShouldLoadAComplexUserObjectUsingRegisteredKeyPath
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.mappingProvider = [self providerForComplexUser];
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// assertThatUnsignedInteger([responseLoader.objects count], is(equalToInt(1)));
// RKTestComplexUser *user = [responseLoader.objects lastObject];
//
// assertThat(user.firstname, is(equalTo(@"Diego")));
//}
//
//#pragma mark - willSendWithObjectLoader:
//
//- (void)testShouldInvokeWillSendWithObjectLoaderOnSend
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// id mockObject = [OCMockObject partialMockForObject:user];
//
// // Explicitly init so we don't get a managed object loader...
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [[RKObjectLoader alloc] initWithURL:[objectManager.baseURL URLByAppendingResourcePath:@"/200"] mappingProvider:[self providerForComplexUser]];
// objectLoader.configurationDelegate = objectManager;
// objectLoader.sourceObject = mockObject;
// objectLoader.delegate = responseLoader;
// [[mockObject expect] willSendWithObjectLoader:objectLoader];
// [objectLoader send];
// [responseLoader waitForResponse];
// [mockObject verify];
//}
//
//- (void)testShouldInvokeWillSendWithObjectLoaderOnSendAsynchronously
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// [objectManager setMappingProvider:[self providerForComplexUser]];
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// id mockObject = [OCMockObject partialMockForObject:user];
//
// // Explicitly init so we don't get a managed object loader...
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:[objectManager.baseURL URLByAppendingResourcePath:@"/200"] mappingProvider:objectManager.mappingProvider];
// objectLoader.delegate = responseLoader;
// objectLoader.sourceObject = mockObject;
// [[mockObject expect] willSendWithObjectLoader:objectLoader];
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// [mockObject verify];
//}
//
//- (void)testShouldInvokeWillSendWithObjectLoaderOnSendSynchronously
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// [objectManager setMappingProvider:[self providerForComplexUser]];
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// id mockObject = [OCMockObject partialMockForObject:user];
//
// // Explicitly init so we don't get a managed object loader...
// RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:[objectManager.baseURL URLByAppendingResourcePath:@"/200"] mappingProvider:objectManager.mappingProvider];
// objectLoader.sourceObject = mockObject;
// [[mockObject expect] willSendWithObjectLoader:objectLoader];
// [objectLoader sendSynchronously];
// [mockObject verify];
//}
//
//- (void)testShouldLoadResultsNestedAtAKeyPath
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[RKObjectLoaderTestResultModel class]];
// [objectMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"id" toKeyPath:@"ID"]];
// [objectMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"ends_at" toKeyPath:@"endsAt"]];
// [objectMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"photo_url" toKeyPath:@"photoURL"]];
// [objectManager.mappingProvider setMapping:objectMapping forKeyPath:@"results"];
// RKTestResponseLoader *loader = [RKTestResponseLoader responseLoader];
// [objectManager loadObjectsAtResourcePath:@"/JSON/ArrayOfResults.json" delegate:loader];
// [loader waitForResponse];
// assertThat([loader objects], hasCountOf(2));
// assertThat([[[loader objects] objectAtIndex:0] ID], is(equalToInt(226)));
// assertThat([[[loader objects] objectAtIndex:0] photoURL], is(equalTo(@"1308262872.jpg")));
// assertThat([[[loader objects] objectAtIndex:1] ID], is(equalToInt(235)));
// assertThat([[[loader objects] objectAtIndex:1] photoURL], is(equalTo(@"1308634984.jpg")));
//}
//
//- (void)testShouldAllowMutationOfTheParsedDataInWillMapData
//{
// RKTestResponseLoaderWithWillMapData *loader = (RKTestResponseLoaderWithWillMapData *)[RKTestResponseLoaderWithWillMapData responseLoader];
// RKObjectManager *manager = [RKTestFactory objectManager];
// [manager loadObjectsAtResourcePath:@"/JSON/humans/1.json" delegate:loader];
// [loader waitForResponse];
// assertThat([loader.mappableData valueForKey:@"newKey"], is(equalTo(@"monkey!")));
//}
//
//- (void)testShouldAllowYouToPostAnObjectAndHandleAnEmpty204Response
//{
// RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// [mapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
// RKObjectMapping *serializationMapping = [mapping inverseMapping];
//
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// [objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/204"method:RKRequestMethodAny]];
// [objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// user.firstname = @"Blake";
// user.lastname = @"Watters";
// user.email = @"blake@restkit.org";
//
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
// loader.delegate = responseLoader;
// loader.objectMapping = mapping;
// [loader send];
// [responseLoader waitForResponse];
// assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
// assertThat(user.email, is(equalTo(@"blake@restkit.org")));
//}
//
//- (void)testShouldAllowYouToPOSTAnObjectAndMapBackNonNestedContent
//{
// RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// [mapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
// RKObjectMapping *serializationMapping = [mapping inverseMapping];
//
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// [objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/notNestedUser" method:RKRequestMethodAny]];
// [objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// user.firstname = @"Blake";
// user.lastname = @"Watters";
// user.email = @"blake@restkit.org";
//
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
// loader.delegate = responseLoader;
// loader.objectMapping = mapping;
// [loader send];
// [responseLoader waitForResponse];
// assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
// assertThat(user.email, is(equalTo(@"changed")));
//}
//
//- (void)testShouldMapContentWithoutAMIMEType
//{
// // TODO: Not sure that this is even worth it. Unable to get the Sinatra server to produce such a response
// return;
// RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);
// RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// [mapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
// RKObjectMapping *serializationMapping = [mapping inverseMapping];
//
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// [[RKParserRegistry sharedRegistry] setParserClass:[RKJSONParserJSONKit class] forMIMEType:@"text/html"];
// [objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/noMIME" method:RKRequestMethodAny]];
// [objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// user.firstname = @"Blake";
// user.lastname = @"Watters";
// user.email = @"blake@restkit.org";
//
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
// loader.delegate = responseLoader;
// loader.objectMapping = mapping;
// [loader send];
// [responseLoader waitForResponse];
// assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
// assertThat(user.email, is(equalTo(@"changed")));
//}
//
//- (void)testShouldAllowYouToPOSTAnObjectOfOneTypeAndGetBackAnother
//{
// RKObjectMapping *sourceMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// [sourceMapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
// RKObjectMapping *serializationMapping = [sourceMapping inverseMapping];
//
// RKObjectMapping *targetMapping = [RKObjectMapping mappingForClass:[RKObjectLoaderTestResultModel class]];
// [targetMapping addAttributeMappingsFromArray:@[@"ID"]];
//
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// [objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/notNestedUser" method:RKRequestMethodAny]];
// [objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// user.firstname = @"Blake";
// user.lastname = @"Watters";
// user.email = @"blake@restkit.org";
//
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
// loader.delegate = responseLoader;
// loader.sourceObject = user;
// loader.targetObject = nil;
// loader.objectMapping = targetMapping;
// [loader send];
// [responseLoader waitForResponse];
// assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
//
// // Our original object should not have changed
// assertThat(user.email, is(equalTo(@"blake@restkit.org")));
//
// // And we should have a new one
// RKObjectLoaderTestResultModel *newObject = [[responseLoader objects] lastObject];
// assertThat(newObject, is(instanceOf([RKObjectLoaderTestResultModel class])));
// assertThat(newObject.ID, is(equalToInt(31337)));
//}
//
//- (void)testShouldAllowYouToPOSTAnObjectOfOneTypeAndGetBackAnotherViaURLConfiguration
//{
// RKObjectMapping *sourceMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// [sourceMapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
// RKObjectMapping *serializationMapping = [sourceMapping inverseMapping];
//
// RKObjectMapping *targetMapping = [RKObjectMapping mappingForClass:[RKObjectLoaderTestResultModel class]];
// [targetMapping addAttributeMappingsFromArray:@[@"ID"]];
//
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// [objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/notNestedUser" method:RKRequestMethodAny]];
// [objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
// [objectManager.mappingProvider setObjectMapping:targetMapping forpathPattern:@"/notNestedUser"];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// user.firstname = @"Blake";
// user.lastname = @"Watters";
// user.email = @"blake@restkit.org";
//
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
// loader.delegate = responseLoader;
// loader.sourceObject = user;
// loader.targetObject = nil;
// [loader send];
// [responseLoader waitForResponse];
// assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
//
// // Our original object should not have changed
// assertThat(user.email, is(equalTo(@"blake@restkit.org")));
//
// // And we should have a new one
// RKObjectLoaderTestResultModel *newObject = [[responseLoader objects] lastObject];
// assertThat(newObject, is(instanceOf([RKObjectLoaderTestResultModel class])));
// assertThat(newObject.ID, is(equalToInt(31337)));
//}
//
//// TODO: Should live in a different file...
//- (void)testShouldAllowYouToPOSTAnObjectAndMapBackNonNestedContentViapostObject
//{
// RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// [mapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
// RKObjectMapping *serializationMapping = [mapping inverseMapping];
//
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// [objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/notNestedUser" method:RKRequestMethodAny]];
// [objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// user.firstname = @"Blake";
// user.lastname = @"Watters";
// user.email = @"blake@restkit.org";
//
// // NOTE: The postObject: should infer the target object from sourceObject and the mapping class
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// [objectManager postObject:user usingBlock:^(RKObjectLoader *loader) {
// loader.delegate = responseLoader;
// loader.objectMapping = mapping;
// }];
// [responseLoader waitForResponse];
// assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
// assertThat(user.email, is(equalTo(@"changed")));
//}
//
//- (void)testShouldRespectTheRootKeyPathWhenConstructingATemporaryObjectMappingProvider
//{
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// userMapping.rootKeyPath = @"data.STUser";
// [userMapping addAttributeMappingsFromArray:@[@"firstname"]];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
//
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.objectMapping = userMapping;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.targetObject = user;
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
//
// assertThat(user.firstname, is(equalTo(@"Diego")));
//}
//
//- (void)testShouldDetermineObjectLoaderBasedOnResourcePathPatternWithExactMatch
//{
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// userMapping.rootKeyPath = @"data.STUser";
// [userMapping addAttributeMappingsFromArray:@[@"firstname"]];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
// [mappingProvider setObjectMapping:userMapping forpathPattern:@"/JSON/ComplexNestedUser.json"];
//
// RKURL *URL = [objectManager.baseURL URLByAppendingResourcePath:@"/JSON/ComplexNestedUser.json"];
// RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:URL mappingProvider:mappingProvider];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.targetObject = user;
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
//
// NSLog(@"Response: %@", responseLoader.objects);
//
// assertThat(user.firstname, is(equalTo(@"Diego")));
//}
//
//- (void)testShouldDetermineObjectLoaderBasedOnResourcePathPatternWithPartialMatch
//{
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// userMapping.rootKeyPath = @"data.STUser";
// [userMapping addAttributeMappingsFromArray:@[@"firstname"]];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
// [mappingProvider setObjectMapping:userMapping forpathPattern:@"/JSON/:name\\.json"];
//
// RKURL *URL = [objectManager.baseURL URLByAppendingResourcePath:@"/JSON/ComplexNestedUser.json"];
// RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:URL mappingProvider:mappingProvider];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.targetObject = user;
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
//
// NSLog(@"Response: %@", responseLoader.objects);
//
// assertThat(user.firstname, is(equalTo(@"Diego")));
//}
//
//- (void)testShouldReturnSuccessWhenTheStatusCodeIs200AndTheResponseBodyIsEmpty
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// user.firstname = @"Blake";
// user.lastname = @"Watters";
// user.email = @"blake@restkit.org";
//
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// userMapping.rootKeyPath = @"data.STUser";
// [userMapping addAttributeMappingsFromArray:@[@"firstname"]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/humans/1234"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodDELETE;
// objectLoader.objectMapping = userMapping;
// objectLoader.targetObject = user;
// [objectLoader send];
// [responseLoader waitForResponse];
// assertThatBool(responseLoader.wasSuccessful, is(equalToBool(YES)));
//}
//
//- (void)testShouldInvokeTheDelegateWithTheTargetObjectWhenTheStatusCodeIs200AndTheResponseBodyIsEmpty
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
//
// RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
// user.firstname = @"Blake";
// user.lastname = @"Watters";
// user.email = @"blake@restkit.org";
//
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// userMapping.rootKeyPath = @"data.STUser";
// [userMapping addAttributeMappingsFromArray:@[@"firstname"]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
//
// RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:[objectManager.baseURL URLByAppendingResourcePath:@"/humans/1234"] mappingProvider:objectManager.mappingProvider];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodDELETE;
// objectLoader.objectMapping = userMapping;
// objectLoader.targetObject = user;
// [objectLoader send];
// [responseLoader waitForResponse];
// assertThat(responseLoader.objects, hasItem(user));
//}
//
//- (void)testShouldConsiderTheLoadOfEmptyObjectsWithoutAnyMappableAttributesAsSuccess
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
//
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// [userMapping addAttributeMappingsFromArray:@[@"firstname"]];
// [objectManager.mappingProvider setMapping:userMapping forKeyPath:@"firstUser"];
// [objectManager.mappingProvider setMapping:userMapping forKeyPath:@"secondUser"];
//
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// [objectManager loadObjectsAtResourcePath:@"/users/empty" delegate:responseLoader];
// [responseLoader waitForResponse];
// assertThatBool(responseLoader.wasSuccessful, is(equalToBool(YES)));
//}
//
//- (void)testShouldInvokeTheDelegateOnSuccessIfTheResponseIsAnEmptyArray
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// responseLoader.timeout = 20;
// [objectManager loadObjectsAtResourcePath:@"/empty/array" delegate:responseLoader];
// [responseLoader waitForResponse];
// assertThat(responseLoader.objects, isNot(nilValue()));
// assertThatBool([responseLoader.objects isKindOfClass:[NSArray class]], is(equalToBool(YES)));
// assertThat(responseLoader.objects, is(empty()));
//}
//
//- (void)testShouldInvokeTheDelegateOnSuccessIfTheResponseIsAnEmptyDictionary
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// responseLoader.timeout = 20;
// [objectManager loadObjectsAtResourcePath:@"/empty/dictionary" delegate:responseLoader];
// [responseLoader waitForResponse];
// assertThat(responseLoader.objects, isNot(nilValue()));
// assertThatBool([responseLoader.objects isKindOfClass:[NSArray class]], is(equalToBool(YES)));
// assertThat(responseLoader.objects, is(empty()));
//}
//
//- (void)testShouldInvokeTheDelegateOnSuccessIfTheResponseIsAnEmptyString
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// responseLoader.timeout = 20;
// [objectManager loadObjectsAtResourcePath:@"/empty/string" delegate:responseLoader];
// [responseLoader waitForResponse];
// assertThat(responseLoader.objects, isNot(nilValue()));
// assertThatBool([responseLoader.objects isKindOfClass:[NSArray class]], is(equalToBool(YES)));
// assertThat(responseLoader.objects, is(empty()));
//}
//
//- (void)testShouldNotBlockNetworkOperationsWhileAwaitingObjectMapping
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
// objectManager.requestCache.storagePolicy = RKRequestCacheStoragePolicyDisabled;
// objectManager.client.requestQueue.concurrentRequestsLimit = 1;
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// userMapping.rootKeyPath = @"human";
// [userMapping addAttributeMappingsFromArray:@[@"name", @"id"]];
//
// // Suspend the Queue to block object mapping
// [objectManager.mappingQueue setSuspended:YES];
//
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// [objectManager.mappingProvider setObjectMapping:userMapping forpathPattern:@"/humans/1"];
// [objectManager loadObjectsAtResourcePath:@"/humans/1" delegate:nil];
// [objectManager.client get:@"/empty/string" delegate:responseLoader];
// [responseLoader waitForResponse];
//
// // We should get a response is network is released even though object mapping didn't finish
// assertThatBool(responseLoader.wasSuccessful, is(equalToBool(YES)));
//}
//
//#pragma mark - Block Tests
//
//- (void)testInvocationOfDidLoadObjectBlock
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.mappingProvider = [self providerForComplexUser];
// __block id expectedResult = nil;
// objectLoader.onDidLoadObject = ^(id object) {
// expectedResult = object;
// };
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// assertThat(expectedResult, is(notNilValue()));
//}
//
//- (void)testInvocationOfDidLoadObjectBlockIsSingularObjectOfCorrectType
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.mappingProvider = [self providerForComplexUser];
// __block id expectedResult = nil;
// objectLoader.onDidLoadObject = ^(id object) {
// expectedResult = object;
// };
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// assertThat(expectedResult, is(instanceOf([RKTestComplexUser class])));
//}
//
//- (void)testInvocationOfDidLoadObjectsBlock
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.mappingProvider = [self providerForComplexUser];
// __block id expectedResult = nil;
// objectLoader.onDidLoadObjects = ^(NSArray *objects) {
// expectedResult = objects;
// };
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// assertThat(expectedResult, is(notNilValue()));
//}
//
//- (void)testInvocationOfDidLoadObjectsBlocksIsCollectionOfObjects
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.mappingProvider = [self providerForComplexUser];
// __block id expectedResult = nil;
// objectLoader.onDidLoadObjects = ^(NSArray *objects) {
// expectedResult = [objects retain];
// };
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// NSLog(@"The expectedResult = %@", expectedResult);
// assertThat(expectedResult, is(instanceOf([NSArray class])));
// assertThat(expectedResult, hasCountOf(1));
// [expectedResult release];
//}
//
//- (void)testInvocationOfDidLoadObjectsDictionaryBlock
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.mappingProvider = [self providerForComplexUser];
// __block id expectedResult = nil;
// objectLoader.onDidLoadObjectsDictionary = ^(NSDictionary *dictionary) {
// expectedResult = dictionary;
// };
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// assertThat(expectedResult, is(notNilValue()));
//}
//
//- (void)testInvocationOfDidLoadObjectsDictionaryBlocksIsDictionaryOfObjects
//{
// RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
// RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
// objectLoader.delegate = responseLoader;
// objectLoader.method = RKRequestMethodGET;
// objectLoader.mappingProvider = [self providerForComplexUser];
// __block id expectedResult = nil;
// objectLoader.onDidLoadObjectsDictionary = ^(NSDictionary *dictionary) {
// expectedResult = dictionary;
// };
//
// [objectLoader sendAsynchronously];
// [responseLoader waitForResponse];
// assertThat(expectedResult, is(instanceOf([NSDictionary class])));
// assertThat(expectedResult, hasCountOf(1));
//}
//
//// NOTE: Errors are fired in a number of contexts within the RKObjectLoader. We have centralized the cases into a private
//// method and test that one case here. There should be better coverage for this.
//- (void)testInvocationOfOnDidFailWithError
//{
// RKObjectLoader *loader = [RKObjectLoader loaderWithURL:nil mappingProvider:nil];
// NSError *expectedError = [NSError errorWithDomain:@"Testing" code:1234 userInfo:nil];
// __block NSError *blockError = nil;
// loader.onDidFailWithError = ^(NSError *error) {
// blockError = error;
// };
// [loader performSelector:@selector(informDelegateOfError:) withObject:expectedError];
// assertThat(blockError, is(equalTo(expectedError)));
//}
//
//- (void)testShouldNotAssertDuringObjectMappingOnSynchronousRequest
//{
// RKObjectManager *objectManager = [RKTestFactory objectManager];
//
// RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
// userMapping.rootKeyPath = @"data.STUser";
// [userMapping addAttributeMappingsFromArray:@[@"firstname"]];
// RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/humans/1"];
// objectLoader.objectMapping = userMapping;
// [objectLoader sendSynchronously];
// RKResponse *response = [objectLoader sendSynchronously];
//
// assertThatInteger(response.statusCode, is(equalToInt(200)));
//}
//
//@end

View File

@@ -1,808 +0,0 @@
//
// RKObjectLoaderTest.m
// RestKit
//
// Created by Blake Watters on 4/27/11.
// Copyright (c) 2009-2012 RestKit. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import "RKTestEnvironment.h"
#import "RKObjectMappingProvider.h"
#import "RKErrorMessage.h"
#import "RKJSONParserJSONKit.h"
// Models
#import "RKObjectLoaderTestResultModel.h"
@interface RKTestComplexUser : NSObject {
NSNumber *_userID;
NSString *_firstname;
NSString *_lastname;
NSString *_email;
NSString *_phone;
}
@property (nonatomic, retain) NSNumber *userID;
@property (nonatomic, retain) NSString *firstname;
@property (nonatomic, retain) NSString *lastname;
@property (nonatomic, retain) NSString *email;
@property (nonatomic, retain) NSString *phone;
@end
@implementation RKTestComplexUser
@synthesize userID = _userID;
@synthesize firstname = _firstname;
@synthesize lastname = _lastname;
@synthesize phone = _phone;
@synthesize email = _email;
- (void)willSendWithObjectLoader:(RKObjectLoader *)objectLoader
{
return;
}
@end
@interface RKTestResponseLoaderWithWillMapData : RKTestResponseLoader {
id _mappableData;
}
@property (nonatomic, readonly) id mappableData;
@end
@implementation RKTestResponseLoaderWithWillMapData
@synthesize mappableData = _mappableData;
- (void)dealloc
{
[_mappableData release];
[super dealloc];
}
- (void)objectLoader:(RKObjectLoader *)loader willMapData:(inout id *)mappableData
{
[*mappableData setValue:@"monkey!" forKey:@"newKey"];
_mappableData = [*mappableData retain];
}
@end
/////////////////////////////////////////////////////////////////////////////
@interface RKObjectLoaderTest : RKTestCase {
}
@end
@implementation RKObjectLoaderTest
- (void)setUp
{
[RKTestFactory setUp];
}
- (void)tearDown
{
[RKTestFactory tearDown];
}
- (RKObjectMappingProvider *)providerForComplexUser
{
NSMutableDictionary *mappingDictionary = [NSMutableDictionary dictionary];
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
[userMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"firstname" toKeyPath:@"firstname"]];
[mappingsDictionary setObject:userMapping forKey:@"data.STUser"];
return provider;
}
- (RKObjectMappingProvider *)errorMappingProvider
{
NSMutableDictionary *mappingDictionary = [NSMutableDictionary dictionary];
RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"" toKeyPath:@"errorMessage"]];
errorMapping.rootKeyPath = @"errors";
provider.errorMapping = errorMapping;
return provider;
}
- (void)testShouldHandleTheErrorCaseAppropriately
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
objectManager.mappingProvider = [self errorMappingProvider];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/errors.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThat(responseLoader.error, isNot(nilValue()));
assertThat([responseLoader.error localizedDescription], is(equalTo(@"error1, error2")));
NSArray *objects = [[responseLoader.error userInfo] objectForKey:RKObjectMapperErrorObjectsKey];
RKErrorMessage *error1 = [objects objectAtIndex:0];
RKErrorMessage *error2 = [objects lastObject];
assertThat(error1.errorMessage, is(equalTo(@"error1")));
assertThat(error2.errorMessage, is(equalTo(@"error2")));
}
- (void)testShouldNotCrashWhenLoadingAnErrorResponseWithAnUnmappableMIMEType
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKTestResponseLoader *loader = [RKTestResponseLoader responseLoader];
[objectManager loadObjectsAtResourcePath:@"/404" delegate:loader];
[loader waitForResponse];
assertThatBool(loader.loadedUnexpectedResponse, is(equalToBool(YES)));
}
#pragma mark - Complex JSON
- (void)testShouldLoadAComplexUserObjectWithTargetObject
{
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
NSString *authString = [NSString stringWithFormat:@"TRUEREST username=%@&password=%@&apikey=123456&class=iphone", @"username", @"password"];
[objectLoader.URLRequest addValue:authString forHTTPHeaderField:@"Authorization"];
objectLoader.method = RKRequestMethodGET;
objectLoader.targetObject = user;
objectLoader.mappingProvider = [self providerForComplexUser];
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThat(user.firstname, is(equalTo(@"Diego")));
}
- (void)testShouldLoadAComplexUserObjectWithoutTargetObject
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.mappingProvider = [self providerForComplexUser];
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThatUnsignedInteger([responseLoader.objects count], is(equalToInt(1)));
RKTestComplexUser *user = [responseLoader.objects lastObject];
assertThat(user.firstname, is(equalTo(@"Diego")));
}
- (void)testShouldLoadAComplexUserObjectUsingRegisteredKeyPath
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.mappingProvider = [self providerForComplexUser];
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThatUnsignedInteger([responseLoader.objects count], is(equalToInt(1)));
RKTestComplexUser *user = [responseLoader.objects lastObject];
assertThat(user.firstname, is(equalTo(@"Diego")));
}
#pragma mark - willSendWithObjectLoader:
- (void)testShouldInvokeWillSendWithObjectLoaderOnSend
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
id mockObject = [OCMockObject partialMockForObject:user];
// Explicitly init so we don't get a managed object loader...
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [[RKObjectLoader alloc] initWithURL:[objectManager.baseURL URLByAppendingResourcePath:@"/200"] mappingProvider:[self providerForComplexUser]];
objectLoader.configurationDelegate = objectManager;
objectLoader.sourceObject = mockObject;
objectLoader.delegate = responseLoader;
[[mockObject expect] willSendWithObjectLoader:objectLoader];
[objectLoader send];
[responseLoader waitForResponse];
[mockObject verify];
}
- (void)testShouldInvokeWillSendWithObjectLoaderOnSendAsynchronously
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
[objectManager setMappingProvider:[self providerForComplexUser]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
id mockObject = [OCMockObject partialMockForObject:user];
// Explicitly init so we don't get a managed object loader...
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:[objectManager.baseURL URLByAppendingResourcePath:@"/200"] mappingProvider:objectManager.mappingProvider];
objectLoader.delegate = responseLoader;
objectLoader.sourceObject = mockObject;
[[mockObject expect] willSendWithObjectLoader:objectLoader];
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
[mockObject verify];
}
- (void)testShouldInvokeWillSendWithObjectLoaderOnSendSynchronously
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
[objectManager setMappingProvider:[self providerForComplexUser]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
id mockObject = [OCMockObject partialMockForObject:user];
// Explicitly init so we don't get a managed object loader...
RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:[objectManager.baseURL URLByAppendingResourcePath:@"/200"] mappingProvider:objectManager.mappingProvider];
objectLoader.sourceObject = mockObject;
[[mockObject expect] willSendWithObjectLoader:objectLoader];
[objectLoader sendSynchronously];
[mockObject verify];
}
- (void)testShouldLoadResultsNestedAtAKeyPath
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[RKObjectLoaderTestResultModel class]];
[objectMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"id" toKeyPath:@"ID"]];
[objectMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"ends_at" toKeyPath:@"endsAt"]];
[objectMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"photo_url" toKeyPath:@"photoURL"]];
[objectManager.mappingProvider setMapping:objectMapping forKeyPath:@"results"];
RKTestResponseLoader *loader = [RKTestResponseLoader responseLoader];
[objectManager loadObjectsAtResourcePath:@"/JSON/ArrayOfResults.json" delegate:loader];
[loader waitForResponse];
assertThat([loader objects], hasCountOf(2));
assertThat([[[loader objects] objectAtIndex:0] ID], is(equalToInt(226)));
assertThat([[[loader objects] objectAtIndex:0] photoURL], is(equalTo(@"1308262872.jpg")));
assertThat([[[loader objects] objectAtIndex:1] ID], is(equalToInt(235)));
assertThat([[[loader objects] objectAtIndex:1] photoURL], is(equalTo(@"1308634984.jpg")));
}
- (void)testShouldAllowMutationOfTheParsedDataInWillMapData
{
RKTestResponseLoaderWithWillMapData *loader = (RKTestResponseLoaderWithWillMapData *)[RKTestResponseLoaderWithWillMapData responseLoader];
RKObjectManager *manager = [RKTestFactory objectManager];
[manager loadObjectsAtResourcePath:@"/JSON/humans/1.json" delegate:loader];
[loader waitForResponse];
assertThat([loader.mappableData valueForKey:@"newKey"], is(equalTo(@"monkey!")));
}
- (void)testShouldAllowYouToPostAnObjectAndHandleAnEmpty204Response
{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
[mapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
RKObjectMapping *serializationMapping = [mapping inverseMapping];
RKObjectManager *objectManager = [RKTestFactory objectManager];
[objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/204"method:RKRequestMethodAny]];
[objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
user.firstname = @"Blake";
user.lastname = @"Watters";
user.email = @"blake@restkit.org";
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
loader.delegate = responseLoader;
loader.objectMapping = mapping;
[loader send];
[responseLoader waitForResponse];
assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
assertThat(user.email, is(equalTo(@"blake@restkit.org")));
}
- (void)testShouldAllowYouToPOSTAnObjectAndMapBackNonNestedContent
{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
[mapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
RKObjectMapping *serializationMapping = [mapping inverseMapping];
RKObjectManager *objectManager = [RKTestFactory objectManager];
[objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/notNestedUser" method:RKRequestMethodAny]];
[objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
user.firstname = @"Blake";
user.lastname = @"Watters";
user.email = @"blake@restkit.org";
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
loader.delegate = responseLoader;
loader.objectMapping = mapping;
[loader send];
[responseLoader waitForResponse];
assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
assertThat(user.email, is(equalTo(@"changed")));
}
- (void)testShouldMapContentWithoutAMIMEType
{
// TODO: Not sure that this is even worth it. Unable to get the Sinatra server to produce such a response
return;
RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
[mapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
RKObjectMapping *serializationMapping = [mapping inverseMapping];
RKObjectManager *objectManager = [RKTestFactory objectManager];
[[RKParserRegistry sharedRegistry] setParserClass:[RKJSONParserJSONKit class] forMIMEType:@"text/html"];
[objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/noMIME" method:RKRequestMethodAny]];
[objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
user.firstname = @"Blake";
user.lastname = @"Watters";
user.email = @"blake@restkit.org";
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
loader.delegate = responseLoader;
loader.objectMapping = mapping;
[loader send];
[responseLoader waitForResponse];
assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
assertThat(user.email, is(equalTo(@"changed")));
}
- (void)testShouldAllowYouToPOSTAnObjectOfOneTypeAndGetBackAnother
{
RKObjectMapping *sourceMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
[sourceMapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
RKObjectMapping *serializationMapping = [sourceMapping inverseMapping];
RKObjectMapping *targetMapping = [RKObjectMapping mappingForClass:[RKObjectLoaderTestResultModel class]];
[targetMapping addAttributeMappingsFromArray:@[@"ID"]];
RKObjectManager *objectManager = [RKTestFactory objectManager];
[objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/notNestedUser" method:RKRequestMethodAny]];
[objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
user.firstname = @"Blake";
user.lastname = @"Watters";
user.email = @"blake@restkit.org";
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
loader.delegate = responseLoader;
loader.sourceObject = user;
loader.targetObject = nil;
loader.objectMapping = targetMapping;
[loader send];
[responseLoader waitForResponse];
assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
// Our original object should not have changed
assertThat(user.email, is(equalTo(@"blake@restkit.org")));
// And we should have a new one
RKObjectLoaderTestResultModel *newObject = [[responseLoader objects] lastObject];
assertThat(newObject, is(instanceOf([RKObjectLoaderTestResultModel class])));
assertThat(newObject.ID, is(equalToInt(31337)));
}
- (void)testShouldAllowYouToPOSTAnObjectOfOneTypeAndGetBackAnotherViaURLConfiguration
{
RKObjectMapping *sourceMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
[sourceMapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
RKObjectMapping *serializationMapping = [sourceMapping inverseMapping];
RKObjectMapping *targetMapping = [RKObjectMapping mappingForClass:[RKObjectLoaderTestResultModel class]];
[targetMapping addAttributeMappingsFromArray:@[@"ID"]];
RKObjectManager *objectManager = [RKTestFactory objectManager];
[objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/notNestedUser" method:RKRequestMethodAny]];
[objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
[objectManager.mappingProvider setObjectMapping:targetMapping forpathPattern:@"/notNestedUser"];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
user.firstname = @"Blake";
user.lastname = @"Watters";
user.email = @"blake@restkit.org";
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *loader = [objectManager loaderForObject:user method:RKRequestMethodPOST];
loader.delegate = responseLoader;
loader.sourceObject = user;
loader.targetObject = nil;
[loader send];
[responseLoader waitForResponse];
assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
// Our original object should not have changed
assertThat(user.email, is(equalTo(@"blake@restkit.org")));
// And we should have a new one
RKObjectLoaderTestResultModel *newObject = [[responseLoader objects] lastObject];
assertThat(newObject, is(instanceOf([RKObjectLoaderTestResultModel class])));
assertThat(newObject.ID, is(equalToInt(31337)));
}
// TODO: Should live in a different file...
- (void)testShouldAllowYouToPOSTAnObjectAndMapBackNonNestedContentViapostObject
{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
[mapping addAttributeMappingsFromArray:@[@"firstname", @"lastname", @"email"]];
RKObjectMapping *serializationMapping = [mapping inverseMapping];
RKObjectManager *objectManager = [RKTestFactory objectManager];
[objectManager.router.routeSet addRoute:[RKRoute routeWithClass:[RKTestComplexUser class] pathPattern:@"/notNestedUser" method:RKRequestMethodAny]];
[objectManager.mappingProvider setSerializationMapping:serializationMapping forClass:[RKTestComplexUser class]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
user.firstname = @"Blake";
user.lastname = @"Watters";
user.email = @"blake@restkit.org";
// NOTE: The postObject: should infer the target object from sourceObject and the mapping class
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
[objectManager postObject:user usingBlock:^(RKObjectLoader *loader) {
loader.delegate = responseLoader;
loader.objectMapping = mapping;
}];
[responseLoader waitForResponse];
assertThatBool([responseLoader wasSuccessful], is(equalToBool(YES)));
assertThat(user.email, is(equalTo(@"changed")));
}
- (void)testShouldRespectTheRootKeyPathWhenConstructingATemporaryObjectMappingProvider
{
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
userMapping.rootKeyPath = @"data.STUser";
[userMapping addAttributeMappingsFromArray:@[@"firstname"]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.objectMapping = userMapping;
objectLoader.method = RKRequestMethodGET;
objectLoader.targetObject = user;
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThat(user.firstname, is(equalTo(@"Diego")));
}
- (void)testShouldDetermineObjectLoaderBasedOnResourcePathPatternWithExactMatch
{
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
userMapping.rootKeyPath = @"data.STUser";
[userMapping addAttributeMappingsFromArray:@[@"firstname"]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
[mappingProvider setObjectMapping:userMapping forpathPattern:@"/JSON/ComplexNestedUser.json"];
RKURL *URL = [objectManager.baseURL URLByAppendingResourcePath:@"/JSON/ComplexNestedUser.json"];
RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:URL mappingProvider:mappingProvider];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.targetObject = user;
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
NSLog(@"Response: %@", responseLoader.objects);
assertThat(user.firstname, is(equalTo(@"Diego")));
}
- (void)testShouldDetermineObjectLoaderBasedOnResourcePathPatternWithPartialMatch
{
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
userMapping.rootKeyPath = @"data.STUser";
[userMapping addAttributeMappingsFromArray:@[@"firstname"]];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
[mappingProvider setObjectMapping:userMapping forpathPattern:@"/JSON/:name\\.json"];
RKURL *URL = [objectManager.baseURL URLByAppendingResourcePath:@"/JSON/ComplexNestedUser.json"];
RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:URL mappingProvider:mappingProvider];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.targetObject = user;
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
NSLog(@"Response: %@", responseLoader.objects);
assertThat(user.firstname, is(equalTo(@"Diego")));
}
- (void)testShouldReturnSuccessWhenTheStatusCodeIs200AndTheResponseBodyIsEmpty
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
user.firstname = @"Blake";
user.lastname = @"Watters";
user.email = @"blake@restkit.org";
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
userMapping.rootKeyPath = @"data.STUser";
[userMapping addAttributeMappingsFromArray:@[@"firstname"]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/humans/1234"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodDELETE;
objectLoader.objectMapping = userMapping;
objectLoader.targetObject = user;
[objectLoader send];
[responseLoader waitForResponse];
assertThatBool(responseLoader.wasSuccessful, is(equalToBool(YES)));
}
- (void)testShouldInvokeTheDelegateWithTheTargetObjectWhenTheStatusCodeIs200AndTheResponseBodyIsEmpty
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKTestComplexUser *user = [[RKTestComplexUser new] autorelease];
user.firstname = @"Blake";
user.lastname = @"Watters";
user.email = @"blake@restkit.org";
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
userMapping.rootKeyPath = @"data.STUser";
[userMapping addAttributeMappingsFromArray:@[@"firstname"]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [RKObjectLoader loaderWithURL:[objectManager.baseURL URLByAppendingResourcePath:@"/humans/1234"] mappingProvider:objectManager.mappingProvider];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodDELETE;
objectLoader.objectMapping = userMapping;
objectLoader.targetObject = user;
[objectLoader send];
[responseLoader waitForResponse];
assertThat(responseLoader.objects, hasItem(user));
}
- (void)testShouldConsiderTheLoadOfEmptyObjectsWithoutAnyMappableAttributesAsSuccess
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
[userMapping addAttributeMappingsFromArray:@[@"firstname"]];
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"firstUser"];
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"secondUser"];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
[objectManager loadObjectsAtResourcePath:@"/users/empty" delegate:responseLoader];
[responseLoader waitForResponse];
assertThatBool(responseLoader.wasSuccessful, is(equalToBool(YES)));
}
- (void)testShouldInvokeTheDelegateOnSuccessIfTheResponseIsAnEmptyArray
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
responseLoader.timeout = 20;
[objectManager loadObjectsAtResourcePath:@"/empty/array" delegate:responseLoader];
[responseLoader waitForResponse];
assertThat(responseLoader.objects, isNot(nilValue()));
assertThatBool([responseLoader.objects isKindOfClass:[NSArray class]], is(equalToBool(YES)));
assertThat(responseLoader.objects, is(empty()));
}
- (void)testShouldInvokeTheDelegateOnSuccessIfTheResponseIsAnEmptyDictionary
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
responseLoader.timeout = 20;
[objectManager loadObjectsAtResourcePath:@"/empty/dictionary" delegate:responseLoader];
[responseLoader waitForResponse];
assertThat(responseLoader.objects, isNot(nilValue()));
assertThatBool([responseLoader.objects isKindOfClass:[NSArray class]], is(equalToBool(YES)));
assertThat(responseLoader.objects, is(empty()));
}
- (void)testShouldInvokeTheDelegateOnSuccessIfTheResponseIsAnEmptyString
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
responseLoader.timeout = 20;
[objectManager loadObjectsAtResourcePath:@"/empty/string" delegate:responseLoader];
[responseLoader waitForResponse];
assertThat(responseLoader.objects, isNot(nilValue()));
assertThatBool([responseLoader.objects isKindOfClass:[NSArray class]], is(equalToBool(YES)));
assertThat(responseLoader.objects, is(empty()));
}
- (void)testShouldNotBlockNetworkOperationsWhileAwaitingObjectMapping
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
objectManager.requestCache.storagePolicy = RKRequestCacheStoragePolicyDisabled;
objectManager.client.requestQueue.concurrentRequestsLimit = 1;
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
userMapping.rootKeyPath = @"human";
[userMapping addAttributeMappingsFromArray:@[@"name", @"id"]];
// Suspend the Queue to block object mapping
[objectManager.mappingQueue setSuspended:YES];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
[objectManager.mappingProvider setObjectMapping:userMapping forpathPattern:@"/humans/1"];
[objectManager loadObjectsAtResourcePath:@"/humans/1" delegate:nil];
[objectManager.client get:@"/empty/string" delegate:responseLoader];
[responseLoader waitForResponse];
// We should get a response is network is released even though object mapping didn't finish
assertThatBool(responseLoader.wasSuccessful, is(equalToBool(YES)));
}
#pragma mark - Block Tests
- (void)testInvocationOfDidLoadObjectBlock
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.mappingProvider = [self providerForComplexUser];
__block id expectedResult = nil;
objectLoader.onDidLoadObject = ^(id object) {
expectedResult = object;
};
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThat(expectedResult, is(notNilValue()));
}
- (void)testInvocationOfDidLoadObjectBlockIsSingularObjectOfCorrectType
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.mappingProvider = [self providerForComplexUser];
__block id expectedResult = nil;
objectLoader.onDidLoadObject = ^(id object) {
expectedResult = object;
};
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThat(expectedResult, is(instanceOf([RKTestComplexUser class])));
}
- (void)testInvocationOfDidLoadObjectsBlock
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.mappingProvider = [self providerForComplexUser];
__block id expectedResult = nil;
objectLoader.onDidLoadObjects = ^(NSArray *objects) {
expectedResult = objects;
};
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThat(expectedResult, is(notNilValue()));
}
- (void)testInvocationOfDidLoadObjectsBlocksIsCollectionOfObjects
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.mappingProvider = [self providerForComplexUser];
__block id expectedResult = nil;
objectLoader.onDidLoadObjects = ^(NSArray *objects) {
expectedResult = [objects retain];
};
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
NSLog(@"The expectedResult = %@", expectedResult);
assertThat(expectedResult, is(instanceOf([NSArray class])));
assertThat(expectedResult, hasCountOf(1));
[expectedResult release];
}
- (void)testInvocationOfDidLoadObjectsDictionaryBlock
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.mappingProvider = [self providerForComplexUser];
__block id expectedResult = nil;
objectLoader.onDidLoadObjectsDictionary = ^(NSDictionary *dictionary) {
expectedResult = dictionary;
};
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThat(expectedResult, is(notNilValue()));
}
- (void)testInvocationOfDidLoadObjectsDictionaryBlocksIsDictionaryOfObjects
{
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[RKTestFactory baseURL]];
RKTestResponseLoader *responseLoader = [RKTestResponseLoader responseLoader];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/JSON/ComplexNestedUser.json"];
objectLoader.delegate = responseLoader;
objectLoader.method = RKRequestMethodGET;
objectLoader.mappingProvider = [self providerForComplexUser];
__block id expectedResult = nil;
objectLoader.onDidLoadObjectsDictionary = ^(NSDictionary *dictionary) {
expectedResult = dictionary;
};
[objectLoader sendAsynchronously];
[responseLoader waitForResponse];
assertThat(expectedResult, is(instanceOf([NSDictionary class])));
assertThat(expectedResult, hasCountOf(1));
}
// NOTE: Errors are fired in a number of contexts within the RKObjectLoader. We have centralized the cases into a private
// method and test that one case here. There should be better coverage for this.
- (void)testInvocationOfOnDidFailWithError
{
RKObjectLoader *loader = [RKObjectLoader loaderWithURL:nil mappingProvider:nil];
NSError *expectedError = [NSError errorWithDomain:@"Testing" code:1234 userInfo:nil];
__block NSError *blockError = nil;
loader.onDidFailWithError = ^(NSError *error) {
blockError = error;
};
[loader performSelector:@selector(informDelegateOfError:) withObject:expectedError];
assertThat(blockError, is(equalTo(expectedError)));
}
- (void)testShouldNotAssertDuringObjectMappingOnSynchronousRequest
{
RKObjectManager *objectManager = [RKTestFactory objectManager];
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestComplexUser class]];
userMapping.rootKeyPath = @"data.STUser";
[userMapping addAttributeMappingsFromArray:@[@"firstname"]];
RKObjectLoader *objectLoader = [objectManager loaderWithResourcePath:@"/humans/1"];
objectLoader.objectMapping = userMapping;
[objectLoader sendSynchronously];
RKResponse *response = [objectLoader sendSynchronously];
assertThatInteger(response.statusCode, is(equalToInt(200)));
}
@end

View File

@@ -1194,7 +1194,7 @@
RKMappingOperation *operation = [[RKMappingOperation alloc] initWithSourceObject:dictionary destinationObject:user mapping:mapping];
operation.delegate = mockDelegate;
NSError *error = nil;
[[mockDelegate expect] mappingOperation:operation didFindMapping:nameMapping forKeyPath:@"name"];
[[mockDelegate expect] mappingOperation:operation didFindValue:[NSNull null] forKeyPath:@"name" mapping:nameMapping];
[[mockDelegate expect] mappingOperation:operation didSetValue:nil forKeyPath:@"name" usingMapping:nameMapping];
operation.dataSource = dataSource;
[operation performMapping:&error];
@@ -1215,7 +1215,7 @@
RKMappingOperation *operation = [[RKMappingOperation alloc] initWithSourceObject:dictionary destinationObject:user mapping:mapping];
operation.delegate = mockDelegate;
NSError *error = nil;
[[mockDelegate expect] mappingOperation:operation didFindMapping:nameMapping forKeyPath:@"name"];
[[mockDelegate expect] mappingOperation:operation didFindValue:@"Blake Watters" forKeyPath:@"name" mapping:nameMapping];
[[mockDelegate expect] mappingOperation:operation didNotSetUnchangedValue:@"Blake Watters" forKeyPath:@"name" usingMapping:nameMapping];
RKObjectMappingOperationDataSource *dataSource = [RKObjectMappingOperationDataSource new];
operation.dataSource = dataSource;

View File

@@ -1,308 +0,0 @@
//
// RKObjectMappingProviderTest.m
// RestKit
//
// Created by Greg Combs on 9/18/11.
// Copyright (c) 2009-2012 RestKit. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import "RKTestEnvironment.h"
#import "RKObjectManager.h"
#import "RKManagedObjectStore.h"
#import "RKTestResponseLoader.h"
#import "RKEntityMapping.h"
#import "RKObjectMappingProvider.h"
#import "RKHuman.h"
#import "RKCat.h"
#import "RKObjectMapperTestModel.h"
#import "RKOrderedDictionary.h"
@interface RKObjectMappingProviderTest : RKTestCase {
RKObjectManager *_objectManager;
}
@end
@implementation RKObjectMappingProviderTest
- (void)setUp
{
_objectManager = [RKTestFactory objectManager];
_objectManager.managedObjectStore = [RKTestFactory managedObjectStore];
[RKObjectManager setSharedManager:_objectManager];
NSError *error;
[_objectManager.managedObjectStore resetPersistentStores:&error];
}
- (void)testShouldFindAnExistingObjectMappingForAClass
{
RKManagedObjectStore *managedObjectStore = [RKTestFactory managedObjectStore];
RKEntityMapping *humanMapping = [RKEntityMapping mappingForEntityForName:@"RKHuman" inManagedObjectStore:managedObjectStore];
assertThat(humanMapping, isNot(equalTo(nil)));
[humanMapping addAttributeMappingsFromArray:@[@"name"]];
[_objectManager.mappingProvider addObjectMapping:humanMapping];
RKMapping *returnedMapping = [_objectManager.mappingProvider objectMappingForClass:[RKHuman class]];
assertThat(returnedMapping, isNot(equalTo(nil)));
assertThat(returnedMapping, is(equalTo(humanMapping)));
}
- (void)testShouldFindAnExistingObjectMappingForAKeyPath
{
RKManagedObjectStore *managedObjectStore = [RKTestFactory managedObjectStore];
RKEntityMapping *catMapping = [RKEntityMapping mappingForEntityForName:@"RKCat" inManagedObjectStore:managedObjectStore];
assertThat(catMapping, isNot(equalTo(nil)));
[catMapping addAttributeMappingsFromArray:@[@"name"]];
[_objectManager.mappingProvider setMapping:catMapping forKeyPath:@"cat"];
RKMapping *returnedMapping = [_objectManager.mappingProvider mappingForKeyPath:@"cat"];
assertThat(returnedMapping, isNot(equalTo(nil)));
assertThat(returnedMapping, is(equalTo(catMapping)));
}
- (void)testShouldAllowYouToRemoveAMappingByKeyPath
{
RKManagedObjectStore *managedObjectStore = [RKTestFactory managedObjectStore];
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKEntityMapping *catMapping = [RKEntityMapping mappingForEntityForName:@"RKCat" inManagedObjectStore:managedObjectStore];
assertThat(catMapping, isNot(equalTo(nil)));
[catMapping addAttributeMappingsFromArray:@[@"name"]];
[mappingProvider setMapping:catMapping forKeyPath:@"cat"];
RKMapping *returnedMapping = [mappingProvider mappingForKeyPath:@"cat"];
assertThat(returnedMapping, isNot(equalTo(nil)));
[mappingProvider removeMappingForKeyPath:@"cat"];
returnedMapping = [mappingProvider mappingForKeyPath:@"cat"];
assertThat(returnedMapping, is(nilValue()));
}
- (void)testSettingMappingInAContext
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
STAssertNoThrow([mappingProvider setMapping:mapping context:1], nil);
}
- (void)testRetrievalOfMapping
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping context:1];
assertThat([mappingProvider mappingForContext:1], is(equalTo(mapping)));
}
- (void)testRetrievalOfMappingsCollectionForUndefinedContextReturnsEmptyArray
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
NSArray *collection = [mappingProvider mappingsForContext:1];
assertThat(collection, is(empty()));
}
- (void)testRetrievalOfMappingsCollectionWhenSingleMappingIsStoredRaisesError
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping context:1];
STAssertThrows([mappingProvider mappingsForContext:1], @"Expected collection mapping retrieval to throw due to storage of single mapping");
}
- (void)testAddingMappingToCollectionContext
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
STAssertNoThrow([mappingProvider addMapping:mapping context:1], nil);
}
- (void)testRetrievalOfMappingCollection
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping_1 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider addMapping:mapping_1 context:1];
RKObjectMapping *mapping_2 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider addMapping:mapping_2 context:1];
NSArray *collection = [mappingProvider mappingsForContext:1];
assertThat(collection, hasItems(mapping_1, mapping_2, nil));
}
- (void)testRetrievalOfMappingCollectionReturnsImmutableArray
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping_1 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider addMapping:mapping_1 context:1];
RKObjectMapping *mapping_2 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider addMapping:mapping_2 context:1];
NSArray *collection = [mappingProvider mappingsForContext:1];
assertThat(collection, isNot(instanceOf([NSMutableArray class])));
}
- (void)testRemovalOfMappingFromCollection
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping_1 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider addMapping:mapping_1 context:1];
RKObjectMapping *mapping_2 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider addMapping:mapping_2 context:1];
[mappingProvider removeMapping:mapping_1 context:1];
NSArray *collection = [mappingProvider mappingsForContext:1];
assertThat(collection, onlyContains(mapping_2, nil));
}
- (void)testAttemptToRemoveMappingFromContextThatDoesNotIncludeItRaisesError
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
STAssertThrows([mappingProvider removeMapping:mapping context:1], @"Removal of mapping not included in context should raise an error.");
}
- (void)testSettingMappingForKeyPathInContext
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
STAssertNoThrow([mappingProvider setMapping:mapping forKeyPath:@"testing" context:1], nil);
}
- (void)testRetrievalOfMappingForKeyPathInContext
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping forKeyPath:@"testing" context:1];
assertThat([mappingProvider mappingForKeyPath:@"testing" context:1], is(equalTo(mapping)));
}
- (void)testRemovalOfMappingByKeyPathInContext
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping forKeyPath:@"testing" context:1];
[mappingProvider removeMappingForKeyPath:@"testing" context:1];
assertThat([mappingProvider mappingForKeyPath:@"testing" context:1], is(nilValue()));
}
- (void)testSettingMappingForPathMatcherCreatesOrderedDictionary
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping forPattern:@"/articles/:id" context:1];
id contextValue = [mappingProvider valueForContext:1];
assertThat(contextValue, is(instanceOf([RKOrderedDictionary class])));
}
- (void)testSettingMappingForPathMatcherCreatesDictionaryWithPathMatcherAsKey
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping forPattern:@"/articles/:id" context:1];
NSDictionary *contextValue = [mappingProvider valueForContext:1];
assertThat([contextValue allKeys], contains(@"/articles/:id", nil));
}
- (void)testSettingMappingForPathMatcherCreatesDictionaryWithMappingAsValue
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
RKObjectMappingProviderContextEntry *entry = [RKObjectMappingProviderContextEntry contextEntryWithMapping:mapping];
[mappingProvider setMapping:mapping forPattern:@"/articles/:id" context:1];
NSDictionary *contextValue = [mappingProvider valueForContext:1];
assertThat([contextValue allValues], contains(entry, nil));
}
- (void)testRetrievalOfMappingForPathMatcher
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping forPattern:@"/articles/:id" context:1];
RKMapping *matchedMapping = [mappingProvider mappingForPatternMatchingString:@"/articles/12345" context:1];
assertThat(matchedMapping, is(equalTo(mapping)));
}
- (void)testRetrievalOfMappingForPathMatcherIncludingQueryParameters
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping forPattern:@"/articles/:id" context:1];
RKMapping *matchedMapping = [mappingProvider mappingForPatternMatchingString:@"/articles/12345?page=5&this=that" context:1];
assertThat(matchedMapping, is(equalTo(mapping)));
}
- (void)testRetrievalOfMappingForPathMatcherWithMultipleEntries
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping_2 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping_2 forPattern:@"/articles/:id\\.json" context:1];
RKObjectMapping *mapping_3 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping_3 forPattern:@"/articles/:id\\.xml" context:1];
RKObjectMapping *mapping_4 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping_4 forPattern:@"/articles/:id/comments/:id" context:1];
RKObjectMapping *mapping_1 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping_1 forPattern:@"/articles/:id" context:1];
// Test them
assertThat([mappingProvider mappingForPatternMatchingString:@"/articles/12345" context:1], is(equalTo(mapping_1)));
assertThat([mappingProvider mappingForPatternMatchingString:@"/articles/12345.json" context:1], is(equalTo(mapping_2)));
assertThat([mappingProvider mappingForPatternMatchingString:@"/articles/12345.xml" context:1], is(equalTo(mapping_3)));
assertThat([mappingProvider mappingForPatternMatchingString:@"/articles/12345/comments/3" context:1], is(equalTo(mapping_4)));
}
- (void)testRetrievalOfMappingForPathMatcherWithEntriesInsertedByIndex
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping_2 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping_2 forPattern:@"/articles/:id\\.json" atIndex:0 context:1];
RKObjectMapping *mapping_3 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping_3 forPattern:@"/articles/:id\\.xml" atIndex:0 context:1];
RKObjectMapping *mapping_4 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping_4 forPattern:@"/articles/:id/comments/:id" atIndex:1 context:1];
RKObjectMapping *mapping_1 = [RKObjectMapping mappingForClass:[NSMutableArray class]];
[mappingProvider setMapping:mapping_1 forPattern:@"/articles/:id" atIndex:3 context:1];
// Test them
assertThat([mappingProvider mappingForPatternMatchingString:@"/articles/12345" context:1], is(equalTo(mapping_1)));
assertThat([mappingProvider mappingForPatternMatchingString:@"/articles/12345.json" context:1], is(equalTo(mapping_2)));
assertThat([mappingProvider mappingForPatternMatchingString:@"/articles/12345.xml" context:1], is(equalTo(mapping_3)));
assertThat([mappingProvider mappingForPatternMatchingString:@"/articles/12345/comments/3" context:1], is(equalTo(mapping_4)));
}
- (void)testRetrievalOfEntryForPathMatcher
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
RKObjectMappingProviderContextEntry *entry = [RKObjectMappingProviderContextEntry contextEntryWithMapping:mapping];
[mappingProvider setEntry:entry forPattern:@"/articles/:id" context:1];
RKObjectMappingProviderContextEntry *matchingEntry = [mappingProvider entryForPatternMatchingString:@"/articles/12345"
context:1];
assertThat(matchingEntry, is(equalTo(entry)));
}
- (void)testRetrievalOfEntryForPathMatcherIncludingQueryParameters
{
RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableArray class]];
RKObjectMappingProviderContextEntry *entry = [RKObjectMappingProviderContextEntry contextEntryWithMapping:mapping];
[mappingProvider setEntry:entry forPattern:@"/articles/:id" context:1];
RKObjectMappingProviderContextEntry *matchingEntry = [mappingProvider entryForPatternMatchingString:@"/articles/12345?page=5&this=that"
context:1];
assertThat(matchingEntry, is(equalTo(entry)));
}
@end