Files
RestKit/Tests/Logic/ObjectMapping/RKObjectRouterTest.m
Blake Watters 4142ffdb42 Reorganization and cleanups of Unit Tests
* Reorganized tests to accommodate split into Logic & Application.
* Eliminated 'Spec' naming in favor of 'Test' as the suite is entirely based on SenTest.
* Pulled majority of testing support classes up into the library and documented them.
* Introduced RKApplicationTests app for running the RKTableController UI tests
2012-02-10 17:32:23 -05:00

182 lines
7.6 KiB
Objective-C

//
// RKObjectRouterTest.m
// RestKit
//
// Created by Blake Watters on 7/20/10.
// Copyright 2010 Two Toasters
//
// 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 "NSManagedObject+ActiveRecord.h"
#import "RKManagedObjectStore.h"
#import "RKTestUser.h"
@interface RKTestObject : NSObject
@end
@implementation RKTestObject
+ (id)object {
return [[self new] autorelease];
}
@end
@interface RKTestSubclassedObject : RKTestObject
@end
@implementation RKTestSubclassedObject
@end
@interface RKObjectRouterTest : RKTestCase {
}
@end
@implementation RKTestUser (PolymorphicResourcePath)
- (NSString *)polymorphicResourcePath {
return @"/this/is/the/path";
}
@end
@implementation RKObjectRouterTest
-(void)testThrowAnExceptionWhenAskedForAPathForAnUnregisteredClassAndMethod {
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
NSException* exception = nil;
@try {
[router resourcePathForObject:[RKTestObject object] method:RKRequestMethodPOST];
}
@catch (NSException * e) {
exception = e;
}
assertThat(exception, isNot(nilValue()));
}
-(void)testThrowAnExceptionWhenAskedForAPathForARegisteredClassButUnregisteredMethod {
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestObject class] toResourcePath:@"/HumanService.asp" forMethod:RKRequestMethodGET];
NSException* exception = nil;
@try {
[router resourcePathForObject:[RKTestObject object] method:RKRequestMethodPOST];
}
@catch (NSException * e) {
exception = e;
}
assertThat(exception, isNot(nilValue()));
}
-(void)testReturnPathsRegisteredForTestificRequestMethods {
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestObject class] toResourcePath:@"/HumanService.asp" forMethod:RKRequestMethodGET];
NSString* path = [router resourcePathForObject:[RKTestObject object] method:RKRequestMethodGET];
assertThat(path, is(equalTo(@"/HumanService.asp")));
}
-(void)testReturnPathsRegisteredForTheClassAsAWhole {
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestObject class] toResourcePath:@"/HumanService.asp"];
NSString* path = [router resourcePathForObject:[RKTestObject object] method:RKRequestMethodGET];
assertThat(path, is(equalTo(@"/HumanService.asp")));
path = [router resourcePathForObject:[RKTestObject object] method:RKRequestMethodPOST];
assertThat(path, is(equalTo(@"/HumanService.asp")));
}
- (void)testShouldReturnPathsIfTheSuperclassIsRegistered {
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestObject class] toResourcePath:@"/HumanService.asp"];
NSString* path = [router resourcePathForObject:[RKTestSubclassedObject new] method:RKRequestMethodGET];
assertThat(path, is(equalTo(@"/HumanService.asp")));
}
- (void)testShouldFavorExactMatcherOverSuperclassMatches {
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestObject class] toResourcePath:@"/HumanService.asp"];
[router routeClass:[RKTestSubclassedObject class] toResourcePath:@"/SubclassedHumanService.asp"];
NSString* path = [router resourcePathForObject:[RKTestSubclassedObject new] method:RKRequestMethodGET];
assertThat(path, is(equalTo(@"/SubclassedHumanService.asp")));
path = [router resourcePathForObject:[RKTestObject new] method:RKRequestMethodPOST];
assertThat(path, is(equalTo(@"/HumanService.asp")));
}
-(void)testFavorTestificMethodsWhenClassAndTestificMethodsAreRegistered {
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestObject class] toResourcePath:@"/HumanService.asp"];
[router routeClass:[RKTestObject class] toResourcePath:@"/HumanServiceForPUT.asp" forMethod:RKRequestMethodPUT];
NSString* path = [router resourcePathForObject:[RKTestObject object] method:RKRequestMethodGET];
assertThat(path, is(equalTo(@"/HumanService.asp")));
path = [router resourcePathForObject:[RKTestObject object] method:RKRequestMethodPOST];
assertThat(path, is(equalTo(@"/HumanService.asp")));
path = [router resourcePathForObject:[RKTestObject object] method:RKRequestMethodPUT];
assertThat(path, is(equalTo(@"/HumanServiceForPUT.asp")));
}
-(void)testRaiseAnExceptionWhenAttemptIsMadeToRegisterOverAnExistingRoute {
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestObject class] toResourcePath:@"/HumanService.asp" forMethod:RKRequestMethodGET];
NSException* exception = nil;
@try {
[router routeClass:[RKTestObject class] toResourcePathPattern:@"/HumanService.asp" forMethod:RKRequestMethodGET];
}
@catch (NSException * e) {
exception = e;
}
assertThat(exception, isNot(nilValue()));
}
- (void)testShouldInterpolatePropertyNamesReferencedInTheMapping {
RKTestUser* blake = [RKTestUser user];
blake.name = @"blake";
blake.userID = [NSNumber numberWithInt:31337];
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestUser class] toResourcePathPattern:@"/humans/:userID/:name" forMethod:RKRequestMethodGET];
NSString* resourcePath = [router resourcePathForObject:blake method:RKRequestMethodGET];
assertThat(resourcePath, is(equalTo(@"/humans/31337/blake")));
}
- (void)testShouldInterpolatePropertyNamesReferencedInTheMappingWithDeprecatedParentheses {
RKTestUser* blake = [RKTestUser user];
blake.name = @"blake";
blake.userID = [NSNumber numberWithInt:31337];
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestUser class] toResourcePathPattern:@"/humans/(userID)/(name)" forMethod:RKRequestMethodGET];
NSString* resourcePath = [router resourcePathForObject:blake method:RKRequestMethodGET];
assertThat(resourcePath, is(equalTo(@"/humans/31337/blake")));
}
- (void)testShouldAllowForPolymorphicURLsViaMethodCalls {
RKTestUser* blake = [RKTestUser user];
blake.name = @"blake";
blake.userID = [NSNumber numberWithInt:31337];
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestUser class] toResourcePathPattern:@":polymorphicResourcePath" forMethod:RKRequestMethodGET escapeRoutedPath:NO];
NSString* resourcePath = [router resourcePathForObject:blake method:RKRequestMethodGET];
assertThat(resourcePath, is(equalTo(@"/this/is/the/path")));
}
- (void)testShouldAllowForPolymorphicURLsViaMethodCallsWithDeprecatedParentheses {
RKTestUser* blake = [RKTestUser user];
blake.name = @"blake";
blake.userID = [NSNumber numberWithInt:31337];
RKObjectRouter* router = [[[RKObjectRouter alloc] init] autorelease];
[router routeClass:[RKTestUser class] toResourcePathPattern:@"(polymorphicResourcePath)" forMethod:RKRequestMethodGET escapeRoutedPath:NO];
NSString* resourcePath = [router resourcePathForObject:blake method:RKRequestMethodGET];
assertThat(resourcePath, is(equalTo(@"/this/is/the/path")));
}
@end