mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-04-28 20:55:32 +08:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user