Files
RestKit/Tests/Logic/Network/RKResponseDescriptorTest.m
Blake Watters 8dc54a89b2 Major overhaul to the Core Data managed object identification and relationship connection support.
* Replaces primary key with `RKEntityIdentifier`
* Add support for use of compound keys for object identification
* Refactor `RKConnectionMapping` to `RKConnectionDescription` and add support for connecting with multiple attributes
* Clarify naming of representation key methods to better match naming conventions
* Add type transformation support for object identification
* Greatly expand test coverage for object identification
* Drop the `NSEntityDescription` category
* Simplify the `RKManagedObjectCaching` protocol
* Add compound key support to the Fetch Request and In Memory Cache implementations
* Replace Kiwi with Specta for tests where contexts are helpful for organization
* Rename `defaultValueForMissingAttribute` to `defaultValueForAttribute`
2012-11-27 10:29:36 -05:00

288 lines
15 KiB
Objective-C

//
// RKResponseDescriptorTest.m
// RestKit
//
// Created by Blake Watters on 10/2/12.
// Copyright (c) 2012 RestKit. All rights reserved.
//
#import "RKTestEnvironment.h"
#import "RKTestUser.h"
#import "Specta.h"
SpecBegin(RKResponseDescriptorSpec)
describe(@"matchesURL:", ^{
__block NSURL *baseURL;
__block RKResponseDescriptor *responseDescriptor;
context(@"when baseURL is nil", ^{
beforeEach(^{
baseURL = nil;
});
context(@"and the path pattern is nil", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
responseDescriptor.baseURL = baseURL;
});
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"http://restkit.org/monkeys/1234.json"];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
context(@"and the path pattern is '/monkeys/:monkeyID\\.json'", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/monkeys/:monkeyID\\.json" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
responseDescriptor.baseURL = baseURL;
});
context(@"and given a URL in which the path and query string match the path pattern", ^{
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"http://restkit.org/monkeys/1234.json"];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
context(@"and given a URL in which the path and query string do match the path pattern", ^{
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"http://restkit.org/mismatch"];
expect([responseDescriptor matchesURL:URL]).to.equal(NO);
});
});
});
});
context(@"when the baseURL is 'http://restkit.org'", ^{
beforeEach(^{
baseURL = [NSURL URLWithString:@"http://restkit.org"];
});
context(@"and the path pattern is nil", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
responseDescriptor.baseURL = baseURL;
});
context(@"and given the URL 'http://google.com/monkeys/1234.json'", ^{
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"http://google.com/monkeys/1234.json"];
expect([responseDescriptor matchesURL:URL]).to.equal(NO);
});
});
context(@"and given the URL 'http://restkit.org/whatever", ^{
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"http://restkit.org/whatever"];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
});
context(@"and the path pattern is '/monkeys/:monkeyID\\.json'", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/monkeys/:monkeyID\\.json" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
responseDescriptor.baseURL = baseURL;
});
context(@"and given a URL with a different baseURL", ^{
it(@"returns NO", ^{
NSURL *otherBaseURL = [NSURL URLWithString:@"http://google.com"];
NSURL *URL = [NSURL URLWithString:@"/monkeys/1234.json" relativeToURL:otherBaseURL];
expect([responseDescriptor matchesURL:URL]).to.equal(NO);
});
});
context(@"and given a URL with a matching baseURL", ^{
context(@"in which the path and query string match the path pattern", ^{
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"/monkeys/1234.json" relativeToURL:baseURL];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
context(@"in which the path and query string do match the path pattern", ^{
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"/mismatch" relativeToURL:baseURL];
expect([responseDescriptor matchesURL:URL]).to.equal(NO);
});
});
context(@"and the URL includes a query string", ^{
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"/monkeys/1234.json?param1=val1&param2=val2" relativeToURL:baseURL];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
});
});
});
context(@"when the baseURL is 'http://0.0.0.0:5000", ^{
beforeEach(^{
baseURL = [NSURL URLWithString:@"http://0.0.0.0:5000"];
});
context(@"and the path pattern is '/api/v1/organizations/'", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/api/v1/organizations/" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
responseDescriptor.baseURL = baseURL;
});
context(@"and given the URL 'http://0.0.0.0:5000/api/v1/organizations/?client_search=t'", ^{
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"http://0.0.0.0:5000/api/v1/organizations/?client_search=t"];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
});
});
context(@"when the baseURL is 'http://restkit.org/api/v1/'", ^{
beforeEach(^{
baseURL = [NSURL URLWithString:@"http://restkit.org/api/v1/"];
});
context(@"and the path pattern is nil", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
responseDescriptor.baseURL = baseURL;
});
context(@"and given the URL 'http://google.com/monkeys/api/v1/1234.json'", ^{
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"http://restkit.org/monkeys/1234.json"];
expect([responseDescriptor matchesURL:URL]).to.equal(NO);
});
});
context(@"and given the URL 'http://restkit.org/api/v1/whatever", ^{
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"http://restkit.org/api/v1/whatever"];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
});
context(@"and the path pattern is not nil", ^{
context(@"and given a URL with a different baseURL", ^{
it(@"returns NO", ^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/whatever" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
responseDescriptor.baseURL = baseURL;
NSURL *otherBaseURL = [NSURL URLWithString:@"http://google.com"];
NSURL *URL = [NSURL URLWithString:@"monkeys/1234.json" relativeToURL:otherBaseURL];
expect([responseDescriptor matchesURL:URL]).to.equal(NO);
});
});
context(@"and given a URL relative to the base URL", ^{
context(@"and the path pattern is '/monkeys/:monkeyID\\.json'", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"monkeys/:monkeyID\\.json" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
responseDescriptor.baseURL = baseURL;
});
context(@"and given a relative URL object", ^{
context(@"in which the path and query string match the path pattern", ^{
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"monkeys/1234.json" relativeToURL:baseURL];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
context(@"in which the path and query string do match the path pattern", ^{
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"mismatch" relativeToURL:baseURL];
expect([responseDescriptor matchesURL:URL]).to.equal(NO);
});
});
});
context(@"and given a URL with a baseURL that is a substring of the response descriptor's baseURL", ^{
context(@"in which the path and query string match the path pattern", ^{
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"http://restkit.org/api/v1/monkeys/1234.json"];
expect([responseDescriptor matchesURL:URL]).to.equal(YES);
});
});
context(@"in which the path and query string do match the path pattern", ^{
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"http://restkit.org/api/v1/mismatch"];
expect([responseDescriptor matchesURL:URL]).to.equal(NO);
});
});
});
});
});
});
});
});
describe(@"matchesResponse:", ^{
__block RKResponseDescriptor *responseDescriptor;
context(@"when the baseURL is 'http://0.0.0.0:5000", ^{
context(@"and the path pattern is '/api/v1/organizations/'", ^{
context(@"and given the URL 'http://0.0.0.0:5000/api/v1/organizations/?client_search=t'", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/api/v1/organizations/" keyPath:nil statusCodes:[NSIndexSet indexSetWithIndex:200]];
responseDescriptor.baseURL = [NSURL URLWithString:@"http://0.0.0.0:5000"];
});
it(@"returns YES", ^{
NSURL *URL = [NSURL URLWithString:@"http://0.0.0.0:5000/api/v1/organizations/?client_search=t"];
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URL statusCode:200 HTTPVersion:@"1.1" headerFields:nil];
expect([responseDescriptor matchesResponse:response]).to.equal(YES);
});
});
});
});
context(@"when the baseURL is 'http://domain.com/domain/api/v1/'", ^{
context(@"and the path pattern is '/recommendation/'", ^{
context(@"then given the URL 'http://domain.com/domain/api/v1/recommendation'", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/recommendation/" keyPath:nil statusCodes:[NSIndexSet indexSetWithIndex:200]];
responseDescriptor.baseURL = [NSURL URLWithString:@"http://domain.com/domain/api/v1/"];
});
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"http://domain.com/domain/api/v1/recommendation/"];
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URL statusCode:200 HTTPVersion:@"1.1" headerFields:nil];
expect([responseDescriptor matchesResponse:response]).to.equal(NO);
});
});
context(@"then given the URL 'http://domain.com/domain/api/v1/recommendation?action=search&type=whatever'", ^{
beforeEach(^{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/recommendation/" keyPath:nil statusCodes:[NSIndexSet indexSetWithIndex:200]];
responseDescriptor.baseURL = [NSURL URLWithString:@"http://domain.com/domain/api/v1/"];
});
it(@"returns NO", ^{
NSURL *URL = [NSURL URLWithString:@"http://domain.com/domain/api/v1/recommendation?action=search&type=whatever"];
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URL statusCode:200 HTTPVersion:@"1.1" headerFields:nil];
expect([responseDescriptor matchesResponse:response]).to.equal(NO);
});
});
});
});
});
SpecEnd