Fix bug with dynamic parameterization when the concrete mapping includes a date.

Instead of relying on reference to the RKMapping, which could be dynamic, traverse from the attribute mapping back to its parent to obtain the appropraite date formatter.
This commit is contained in:
Blake Watters
2012-10-18 14:38:36 -04:00
parent 5684f7ab89
commit f69c2976e2
2 changed files with 30 additions and 3 deletions

View File

@@ -24,7 +24,6 @@
#import "RKMIMETypeSerialization.h"
#import "RKLog.h"
#import "RKObjectMappingOperationDataSource.h"
#import "RKObjectMapping.h"
#import "RKMappingOperation.h"
#import "RKMappingErrors.h"
@@ -105,8 +104,8 @@
id transformedValue = nil;
if ([value isKindOfClass:[NSDate class]]) {
// Date's are not natively serializable, must be encoded as a string
@synchronized(self.mapping.preferredDateFormatter) {
transformedValue = [self.mapping.preferredDateFormatter stringForObjectValue:value];
@synchronized(mapping.objectMapping.preferredDateFormatter) {
transformedValue = [mapping.objectMapping.preferredDateFormatter stringForObjectValue:value];
}
} else if ([value isKindOfClass:[NSDecimalNumber class]]) {
// Precision numbers are serialized as strings to work around Javascript notation limits

View File

@@ -355,6 +355,7 @@ typedef enum {
@property (nonatomic, copy) NSNumber *flightNumber;
@property (nonatomic, copy) NSNumber *departureAirportID;
@property (nonatomic, copy) NSNumber *arrivalAirportID;
@property (nonatomic, copy) NSDate *departureDate;
@end
@implementation RKDynamicParameterizationFlightSearch
@@ -409,4 +410,31 @@ typedef enum {
expect(error.code).to.equal(RKMappingErrorUnableToDetermineMapping);
}
- (void)testDynamicParameterizationIncludingADate
{
RKObjectMapping *concreteMapping = [RKObjectMapping requestMapping];
[concreteMapping addAttributeMappingsFromDictionary:@{ @"departureDate": @"departure_date" }];
RKDynamicMapping *flightSearchMapping = [RKDynamicMapping new];
[flightSearchMapping setObjectMapping:concreteMapping whenValueOfKeyPath:@"mode" isEqualTo:@(RKSearchByFlightNumberMode)];
RKDynamicParameterizationFlightSearch *flightSearch = [RKDynamicParameterizationFlightSearch new];
flightSearch.airlineID = @5678;
flightSearch.flightNumber = @1234;
flightSearch.departureAirportID = @25;
flightSearch.arrivalAirportID = @66;
flightSearch.mode = RKSearchByFlightNumberMode;
flightSearch.departureDate = [NSDate dateWithTimeIntervalSince1970:0];
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:flightSearchMapping
objectClass:[RKDynamicParameterizationFlightSearch class]
rootKeyPath:@"flight_search"];
NSError *error = nil;
NSDictionary *parameters = nil;
// Test generation of Flight Number parameters
parameters = [RKObjectParameterization parametersWithObject:flightSearch requestDescriptor:requestDescriptor error:&error];
NSDictionary *expectedParameters = @{ @"flight_search": @{ @"departure_date": @"1970-01-01 00:00:00 +0000" }};
expect(parameters).to.equal(expectedParameters);
}
@end