PageRenderTime 186ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/Tests/Logic/ObjectMapping/RKObjectParameterizationTest.m

http://github.com/RestKit/RestKit
Objective C | 786 lines | 621 code | 136 blank | 29 comment | 0 complexity | 1f84cd23b77273435856a86718bf2463 MD5 | raw file
Possible License(s): Apache-2.0
  1. //
  2. // RKObjectParameterizationTest.m
  3. // RestKit
  4. //
  5. // Created by Jeremy Ellison on 5/9/11.
  6. // Copyright (c) 2009-2012 RestKit. All rights reserved.
  7. //
  8. // Licensed under the Apache License, Version 2.0 (the "License");
  9. // you may not use this file except in compliance with the License.
  10. // You may obtain a copy of the License at
  11. //
  12. // http://www.apache.org/licenses/LICENSE-2.0
  13. //
  14. // Unless required by applicable law or agreed to in writing, software
  15. // distributed under the License is distributed on an "AS IS" BASIS,
  16. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. // See the License for the specific language governing permissions and
  18. // limitations under the License.
  19. //
  20. #import <CoreLocation/CoreLocation.h>
  21. #import "RKTestEnvironment.h"
  22. #import "RKObjectParameterization.h"
  23. #import "RKMIMETypeSerialization.h"
  24. #import "RKMappableObject.h"
  25. #import "RKDynamicMapping.h"
  26. #import "RKMappingErrors.h"
  27. #import "RKHuman.h"
  28. #import "RKTestUser.h"
  29. #import "RKCat.h"
  30. #import "RKCLLocationValueTransformer.h"
  31. @interface RKMIMETypeSerialization ()
  32. @property (nonatomic, strong) NSMutableArray *registrations;
  33. + (RKMIMETypeSerialization *)sharedSerialization;
  34. - (void)addRegistrationsForKnownSerializations;
  35. @end
  36. @interface RKObjectParameterizationTest : RKTestCase
  37. @end
  38. @implementation RKObjectParameterizationTest
  39. - (void)setUp
  40. {
  41. [RKTestFactory setUp];
  42. [RKMIMETypeSerialization sharedSerialization].registrations = [NSMutableArray array];
  43. [[RKMIMETypeSerialization sharedSerialization] addRegistrationsForKnownSerializations];
  44. // Reset the default transformer
  45. [RKValueTransformer setDefaultValueTransformer:nil];
  46. }
  47. - (void)tearDown
  48. {
  49. [RKTestFactory tearDown];
  50. }
  51. - (void)testShouldSerializeToFormEncodedData
  52. {
  53. NSDictionary *object = @{@"key1": @"value1", @"key2": @"value2"};
  54. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  55. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  56. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key2" toKeyPath:@"key2-form-name"]];
  57. NSError *error = nil;
  58. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  59. // URL Encode
  60. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  61. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeFormURLEncoded error:&error];
  62. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  63. expect(error).to.beNil();
  64. expect(string).to.equal(@"key1-form-name=value1&key2-form-name=value2");
  65. }
  66. - (void)testShouldSerializeADate
  67. {
  68. NSDictionary *object = @{@"key1": @"value1", @"date": [NSDate dateWithTimeIntervalSince1970:0]};
  69. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  70. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  71. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"date" toKeyPath:@"date-form-name"]];
  72. NSError *error = nil;
  73. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  74. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  75. expect(error).to.beNil();
  76. expect(parameters[@"date-form-name"]).to.equal(@"1970-01-01T00:00:00.000Z");
  77. }
  78. #pragma clang diagnostic push
  79. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  80. - (void)testShouldSerializeADateToAStringUsingThePreferredDateFormatter
  81. {
  82. NSDictionary *object = @{@"key1": @"value1", @"date": [NSDate dateWithTimeIntervalSince1970:0]};
  83. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  84. NSDateFormatter *dateFormatter = [NSDateFormatter new];
  85. dateFormatter.dateFormat = @"MM/dd/yyyy";
  86. dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
  87. mapping.preferredDateFormatter = dateFormatter;
  88. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  89. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"date" toKeyPath:@"date-form-name"]];
  90. NSError *error = nil;
  91. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  92. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  93. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeFormURLEncoded error:&error];
  94. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  95. expect(error).to.beNil();
  96. expect(string).to.equal(@"date-form-name=01/01/1970&key1-form-name=value1");
  97. }
  98. #pragma clang diagnostic pop
  99. - (void)testShouldSerializeADateToAStringUsingTheAttributeMappingValueTransformer
  100. {
  101. NSDictionary *object = @{@"key1": @"value1", @"date": [NSDate dateWithTimeIntervalSince1970:0]};
  102. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  103. NSDateFormatter *dateFormatter = [NSDateFormatter new];
  104. dateFormatter.dateFormat = @"MM/dd/yyyy";
  105. dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
  106. RKAttributeMapping *propertyMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"date" toKeyPath:@"date-form-name"];
  107. propertyMapping.valueTransformer = dateFormatter;
  108. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  109. [mapping addPropertyMapping: propertyMapping];
  110. NSError *error = nil;
  111. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  112. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  113. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeFormURLEncoded error:&error];
  114. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  115. expect(error).to.beNil();
  116. expect(string).to.equal(@"date-form-name=01/01/1970&key1-form-name=value1");
  117. }
  118. - (void)testShouldSerializeADateToJSON
  119. {
  120. NSDictionary *object = @{@"key1": @"value1", @"date": [NSDate dateWithTimeIntervalSince1970:0]};
  121. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  122. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  123. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"date" toKeyPath:@"date-form-name"]];
  124. NSError *error = nil;
  125. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  126. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  127. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  128. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  129. expect(error).to.beNil();
  130. expect(string).to.equal(@"{\"key1-form-name\":\"value1\",\"date-form-name\":\"1970-01-01T00:00:00.000Z\"}");
  131. }
  132. - (void)testShouldSerializeNSDecimalNumberAttributesToJSON
  133. {
  134. NSDictionary *object = @{@"key1": @"value1", @"number": [NSDecimalNumber decimalNumberWithString:@"18274191731731.4557723623"]};
  135. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  136. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  137. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"number" toKeyPath:@"number-form-name"]];
  138. NSError *error = nil;
  139. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  140. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  141. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  142. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  143. expect(error).to.beNil();
  144. expect(string).to.equal(@"{\"key1-form-name\":\"value1\",\"number-form-name\":\"18274191731731.4557723623\"}");
  145. }
  146. - (void)testShouldSerializeRelationshipsToo
  147. {
  148. NSDictionary *object = @{@"key1": @"value1", @"key2": @"value2",
  149. @"relationship1": @[@{@"relatioship1Key1": @"relationship1Value1"},
  150. @{@"relatioship1Key1": @"relationship1Value2"}],
  151. @"relationship2": @{@"subKey1": @"subValue1"}};
  152. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  153. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  154. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key2" toKeyPath:@"key2-form-name"]];
  155. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"relationship1.relatioship1Key1" toKeyPath:@"relationship1-form-name[r1k1]"]];
  156. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"relationship2.subKey1" toKeyPath:@"relationship2-form-name[subKey1]"]];
  157. NSError *error = nil;
  158. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  159. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  160. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeFormURLEncoded error:&error];
  161. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  162. expect(error).to.beNil();
  163. expect(string).to.equal(@"key1-form-name=value1&key2-form-name=value2&relationship1-form-name[r1k1][]=relationship1Value1&relationship1-form-name[r1k1][]=relationship1Value2&relationship2-form-name[subKey1]=subValue1");
  164. }
  165. - (void)testShouldSerializeToJSON
  166. {
  167. NSDictionary *object = @{@"key1": @"value1", @"key2": @"value2"};
  168. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  169. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  170. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key2" toKeyPath:@"key2-form-name"]];
  171. NSError *error = nil;
  172. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  173. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  174. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  175. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  176. expect(error).to.beNil();
  177. expect(string).to.equal(@"{\"key2-form-name\":\"value2\",\"key1-form-name\":\"value1\"}");
  178. }
  179. - (void)testShouldSetReturnEmptyDictionaryIfItDoesNotFindAnythingToSerialize
  180. {
  181. NSDictionary *object = @{@"key1": @"value1", @"key2": @"value2"};
  182. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  183. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key12123" toKeyPath:@"key1-form-name"]];
  184. NSError *error = nil;
  185. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  186. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  187. expect(error).to.beNil();
  188. expect(parameters).to.equal(@{ @"key1-form-name": [NSNull null] });
  189. }
  190. - (void)testEmptyParameterizationRespectsRootKeyPath
  191. {
  192. NSDictionary *object = @{@"key1": @"value1", @"key2": @"value2"};
  193. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  194. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key12123" toKeyPath:@"key1-form-name"]];
  195. NSError *error = nil;
  196. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:@"root" method:RKRequestMethodAny];
  197. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  198. expect(error).to.beNil();
  199. expect(parameters).to.equal(@{ @"root":@{ @"key1-form-name": [NSNull null] } });
  200. }
  201. - (void)testShouldSerializeNestedObjectsContainingDatesToJSON
  202. {
  203. RKMappableObject *object = [RKMappableObject new];
  204. object.stringTest = @"The string";
  205. RKMappableAssociation *association = [RKMappableAssociation new];
  206. association.date = [NSDate dateWithTimeIntervalSince1970:0];
  207. object.hasOne = association;
  208. // Setup object mappings
  209. RKObjectMapping *objectMapping = [RKObjectMapping requestMapping];
  210. [objectMapping addAttributeMappingsFromArray:@[ @"stringTest" ]];
  211. RKObjectMapping *relationshipMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
  212. [relationshipMapping addAttributeMappingsFromArray:@[ @"date" ]];
  213. [objectMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"hasOne" toKeyPath:@"hasOne" withMapping:relationshipMapping]];
  214. NSError *error = nil;
  215. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:objectMapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  216. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  217. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  218. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  219. expect((@[@"{\"stringTest\":\"The string\",\"hasOne\":{\"date\":\"1970-01-01T00:00:00.000Z\"}}", @"{\"hasOne\":{\"date\":\"1970-01-01T00:00:00.000Z\"},\"stringTest\":\"The string\"}"])).to.contain(string);
  220. }
  221. - (void)testShouldEncloseTheSerializationInAContainerIfRequested
  222. {
  223. NSDictionary *object = @{@"key1": @"value1", @"key2": @"value2"};
  224. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  225. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  226. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key2" toKeyPath:@"key2-form-name"]];
  227. NSError *error = nil;
  228. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:@"stuff" method:RKRequestMethodAny];
  229. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  230. expect(parameters[@"stuff"][@"key2-form-name"]).to.equal(@"value2");
  231. expect(parameters[@"stuff"][@"key1-form-name"]).to.equal(@"value1");
  232. }
  233. - (void)testShouldSerializeToManyRelationships
  234. {
  235. RKMappableObject *object = [RKMappableObject new];
  236. object.stringTest = @"The string";
  237. RKMappableAssociation *association = [RKMappableAssociation new];
  238. association.date = [NSDate dateWithTimeIntervalSince1970:0];
  239. object.hasMany = [NSSet setWithObject:association];
  240. // Setup object mappings
  241. RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
  242. [objectMapping addAttributeMappingsFromArray:@[@"stringTest"]];
  243. RKObjectMapping *relationshipMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
  244. [relationshipMapping addAttributeMappingsFromArray:@[@"date"]];
  245. [objectMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"hasMany" toKeyPath:@"hasMany" withMapping:relationshipMapping]];
  246. // Serialize
  247. NSError *error = nil;
  248. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:objectMapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  249. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  250. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  251. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  252. expect(string).to.equal(@"{\"hasMany\":[{\"date\":\"1970-01-01T00:00:00.000Z\"}],\"stringTest\":\"The string\"}");
  253. }
  254. - (void)testShouldSerializeAnNSNumberContainingABooleanToTrueFalseIfRequested
  255. {
  256. NSDictionary *object = @{@"key1": @"value1", @"boolean": @YES};
  257. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  258. RKAttributeMapping *attributeMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"boolean" toKeyPath:@"boolean-value"];
  259. [mapping addPropertyMapping:attributeMapping];
  260. NSError *error = nil;
  261. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  262. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  263. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  264. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  265. expect(error).to.beNil();
  266. expect(string).to.equal(@"{\"boolean-value\":true}");
  267. }
  268. - (void)testShouldSerializeANSOrderedSetToJSON
  269. {
  270. NSDictionary *object = @{@"key1": @"value1",
  271. @"set": [NSOrderedSet orderedSetWithObjects:@"setElementOne", @"setElementTwo", @"setElementThree", nil]};
  272. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  273. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  274. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"set" toKeyPath:@"set-form-name"]];
  275. NSError *error = nil;
  276. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  277. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  278. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  279. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  280. expect(error).to.beNil();
  281. expect(string).to.equal(@"{\"key1-form-name\":\"value1\",\"set-form-name\":[\"setElementOne\",\"setElementTwo\",\"setElementThree\"]}");
  282. }
  283. - (void)testShouldSerializeAnNSSetToJSON
  284. {
  285. NSDictionary *object = @{@"key1": @"value1",
  286. @"set": [NSSet setWithObjects:@"setElementOne", nil]};
  287. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  288. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]];
  289. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"set" toKeyPath:@"set-form-name"]];
  290. NSError *error = nil;
  291. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  292. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  293. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  294. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  295. expect(error).to.beNil();
  296. expect(string).to.equal(@"{\"key1-form-name\":\"value1\",\"set-form-name\":[\"setElementOne\"]}");
  297. }
  298. - (void)testParameterizationOfAttributesNestedByKeyPath
  299. {
  300. NSDictionary *object = @{ @"name" : @"Blake Watters", @"occupation" : @"Hacker" };
  301. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  302. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"name" toKeyPath:@"user.name"]];
  303. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"occupation" toKeyPath:@"user.job"]];
  304. NSError *error = nil;
  305. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  306. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  307. NSDictionary *expected = @{@"user": @{@"name": @"Blake Watters", @"job": @"Hacker"}};
  308. expect(parameters).to.equal(expected);
  309. }
  310. - (void)testParameterizationOfAttributesDeeplyNestedByKeyPathToFormEncoded
  311. {
  312. NSDictionary *object = @{ @"name" : @"Blake Watters", @"occupation" : @"Hacker" };
  313. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  314. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"name" toKeyPath:@"user.anotherKeyPath.name"]];
  315. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"occupation" toKeyPath:@"user.anotherKeyPath.another.job"]];
  316. NSError *error = nil;
  317. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  318. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  319. NSDictionary *expected = @{@"user": @{@"anotherKeyPath": @{@"name": @"Blake Watters", @"another": @{ @"job": @"Hacker"}}}};
  320. expect(parameters).to.equal(expected);
  321. }
  322. - (void)testParameterizationOfPrimitiveBooleansToJSONBooleans
  323. {
  324. NSDictionary *object = @{ @"name" : @"Blake Watters", @"isHacker" : @YES };
  325. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  326. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"name" toKeyPath:@"name"]];
  327. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"isHacker" toKeyPath:@"isHacker"]];
  328. NSError *error = nil;
  329. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  330. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  331. NSDictionary *expected = @ {@"name": @"Blake Watters", @"isHacker": @YES };
  332. expect(parameters).to.equal(expected);
  333. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  334. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  335. expect(error).to.beNil();
  336. expect(string).to.equal(@"{\"name\":\"Blake Watters\",\"isHacker\":true}");
  337. }
  338. - (void)testParameterizationOfBooleanPropertiesToJSONBooleansFromObjectProperties
  339. {
  340. RKMappableObject *object = [RKMappableObject new];
  341. object.stringTest = @"Whatever";
  342. object.isValid = NO;
  343. object.numberTest = @YES;
  344. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  345. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"stringTest" toKeyPath:@"name"]];
  346. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"isValid" toKeyPath:@"is_valid"]];
  347. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"numberTest" toKeyPath:@"is_boolean"]];
  348. NSError *error = nil;
  349. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  350. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  351. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  352. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  353. expect(error).to.beNil();
  354. // Unordered dictionary handling
  355. NSArray *serializations = @[ @"{\"is_valid\":0,\"name\":\"Whatever\",\"is_boolean\":true}", @"{\"name\":\"Whatever\",\"is_valid\":0,\"is_boolean\":true}", @"{\"name\":\"Whatever\",\"is_valid\":false,\"is_boolean\":true}"];
  356. expect(serializations).to.contain(string);
  357. }
  358. - (void)testParameterizationofBooleanPropertiesFromManagedObjectProperty
  359. {
  360. RKHuman *human = [RKTestFactory insertManagedObjectForEntityForName:@"Human" inManagedObjectContext:nil withProperties:nil];
  361. human.isHappy = @YES;
  362. human.name = @"Blake Watters";
  363. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  364. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"name" toKeyPath:@"name"]];
  365. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"isHappy" toKeyPath:@"happy"]];
  366. NSError *error = nil;
  367. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  368. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:human requestDescriptor:requestDescriptor error:&error];
  369. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  370. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  371. expect(error).to.beNil();
  372. expect(string).to.equal(@"{\"name\":\"Blake Watters\",\"happy\":true}");
  373. }
  374. - (void)testParameterizationofBooleanPropertiesFromManagedObjectPropertyWithFalseValue
  375. {
  376. RKHuman *human = [RKTestFactory insertManagedObjectForEntityForName:@"Human" inManagedObjectContext:nil withProperties:nil];
  377. human.isHappy = @NO;
  378. human.name = @"Blake Watters";
  379. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  380. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"name" toKeyPath:@"name"]];
  381. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"isHappy" toKeyPath:@"happy"]];
  382. NSError *error = nil;
  383. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  384. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:human requestDescriptor:requestDescriptor error:&error];
  385. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  386. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  387. expect(error).to.beNil();
  388. expect(string).to.equal(@"{\"name\":\"Blake Watters\",\"happy\":false}");
  389. }
  390. - (void)testSerializingWithDynamicNestingAttributeWithBraces
  391. {
  392. NSDictionary *object = @{ @"name" : @"blake", @"occupation" : @"Hacker" };
  393. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  394. [mapping addAttributeMappingToKeyOfRepresentationFromAttribute:@"name"];
  395. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"name" toKeyPath:@"{name}.name"]];
  396. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"occupation" toKeyPath:@"{name}.job"]];
  397. NSError *error = nil;
  398. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  399. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  400. NSDictionary *expected = @{@"blake": @{@"name": @"blake", @"job": @"Hacker"}};
  401. expect(parameters).to.equal(expected);
  402. }
  403. - (void)testSerializingWithDynamicNestingAttributeWithParentheses
  404. {
  405. NSDictionary *object = @{ @"name" : @"blake", @"occupation" : @"Hacker" };
  406. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  407. [mapping addAttributeMappingToKeyOfRepresentationFromAttribute:@"name"];
  408. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"name" toKeyPath:@"(name).name"]];
  409. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"occupation" toKeyPath:@"(name).job"]];
  410. NSError *error = nil;
  411. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  412. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error];
  413. NSDictionary *expected = @{@"blake": @{@"name": @"blake", @"job": @"Hacker"}};
  414. expect(parameters).to.equal(expected);
  415. }
  416. - (void)testParameterizationOfCoreDataEntityWithDateToNestedKeypath
  417. {
  418. RKHuman *human = [RKTestFactory insertManagedObjectForEntityForName:@"Human" inManagedObjectContext:nil withProperties:nil];
  419. human.birthday = [NSDate dateWithTimeIntervalSince1970:0];
  420. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  421. [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"birthday" toKeyPath:@"nestedPath.birthday"]];
  422. NSError *error = nil;
  423. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil method:RKRequestMethodAny];
  424. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:human requestDescriptor:requestDescriptor error:&error];
  425. NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  426. NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  427. expect(error).to.beNil();
  428. expect(string).to.equal(@"{\"nestedPath\":{\"birthday\":\"1970-01-01T00:00:00.000Z\"}}");
  429. }
  430. - (void)testParameterizationFromLocationToNestedDictionaryUsingValueTransformer
  431. {
  432. RKTestUser *user = [RKTestUser new];
  433. user.name = @"Blake";
  434. user.location = [[CLLocation alloc] initWithLatitude:125.55 longitude:200.5];
  435. RKObjectMapping *userMapping = [RKObjectMapping requestMapping];
  436. [userMapping addAttributeMappingsFromArray:@[ @"name" ]];
  437. RKAttributeMapping *attributeMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"location" toKeyPath:@"location"];
  438. attributeMapping.propertyValueClass = [NSDictionary class];
  439. attributeMapping.valueTransformer = [RKCLLocationValueTransformer locationValueTransformerWithLatitudeKey:@"latitude" longitudeKey:@"longitude"];
  440. [userMapping addPropertyMapping:attributeMapping];
  441. NSError *error = nil;
  442. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userMapping objectClass:[RKTestUser class] rootKeyPath:nil method:RKRequestMethodAny];
  443. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:user requestDescriptor:requestDescriptor error:&error];
  444. expect(parameters).notTo.beNil();
  445. expect(error).to.beNil();
  446. expect(parameters[@"location"]).notTo.beNil();
  447. expect(parameters[@"location"][@"latitude"]).to.equal(125.55);
  448. expect(parameters[@"location"][@"longitude"]).to.equal(200.5);
  449. }
  450. - (void)testSerializingToNull
  451. {
  452. RKTestUser *blake = [RKTestUser new];
  453. blake.name = @"Blake Watters";
  454. blake.website = nil;
  455. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  456. [mapping addAttributeMappingsFromArray:@[ @"name", @"website" ]];
  457. NSError *error = nil;
  458. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[RKTestUser class] rootKeyPath:nil method:RKRequestMethodAny];
  459. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:blake requestDescriptor:requestDescriptor error:&error];
  460. expect(error).to.beNil();
  461. expect(parameters).to.equal((@{ @"name": @"Blake Watters", @"website": [NSNull null] }));
  462. }
  463. - (void)testSerializingOmitsNullAttributesWhenAssignsDefaultValueForMissingAttributesIsFalse
  464. {
  465. RKTestUser *blake = [RKTestUser new];
  466. blake.name = @"Blake Watters";
  467. blake.website = nil;
  468. RKObjectMapping *mapping = [RKObjectMapping requestMapping];
  469. [mapping addAttributeMappingsFromArray:@[@"name", @"website"]];
  470. mapping.assignsDefaultValueForMissingAttributes = NO;
  471. NSError *error = nil;
  472. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[RKTestUser class] rootKeyPath:nil method:RKRequestMethodAny];
  473. NSDictionary *parameters = [RKObjectParameterization parametersWithObject:blake requestDescriptor:requestDescriptor error:&error];
  474. expect(error).to.beNil();
  475. expect(parameters).to.equal((@{@"name" : @"Blake Watters"}));
  476. }
  477. @end
  478. #pragma mark - Dynamic Request Paramterization
  479. typedef NS_ENUM(NSInteger, RKFlightSearchMode) {
  480. RKSearchByFlightNumberMode = 1,
  481. RKSearchByRouteMode = 2,
  482. RKSearcyByOtherMode
  483. } ;
  484. @interface RKDynamicParameterizationFlightSearch : NSObject
  485. @property (nonatomic, assign) RKFlightSearchMode mode;
  486. @property (nonatomic, copy) NSNumber *airlineID;
  487. @property (nonatomic, copy) NSNumber *flightNumber;
  488. @property (nonatomic, copy) NSNumber *departureAirportID;
  489. @property (nonatomic, copy) NSNumber *arrivalAirportID;
  490. @property (nonatomic, copy) NSDate *departureDate;
  491. @end
  492. @implementation RKDynamicParameterizationFlightSearch
  493. @end
  494. @interface RKDynamicParameterizationTest : RKTestCase
  495. @end
  496. @implementation RKDynamicParameterizationTest
  497. - (void)testParameterizationUsingDynamicMapping
  498. {
  499. NSDictionary *expectedFlightNumberParameters = @{ @"flight_search": @{ @"flight_number": @1234, @"airline_id": @5678 } };
  500. NSDictionary *expectedRouteParameters = @{ @"flight_search": @{ @"departure_airport_id": @25, @"arrival_airport_id": @66, @"airline_id": @5678 } };
  501. RKObjectMapping *flightNumberMapping = [RKObjectMapping requestMapping];
  502. [flightNumberMapping addAttributeMappingsFromDictionary:@{ @"flightNumber": @"flight_number", @"airlineID": @"airline_id" }];
  503. RKObjectMapping *routeMapping = [RKObjectMapping requestMapping];
  504. [routeMapping addAttributeMappingsFromDictionary:@{ @"airlineID": @"airline_id", @"departureAirportID": @"departure_airport_id", @"arrivalAirportID": @"arrival_airport_id" }];
  505. RKDynamicMapping *flightSearchMapping = [RKDynamicMapping new];
  506. [flightSearchMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"mode" expectedValue:@(RKSearchByFlightNumberMode) objectMapping:flightNumberMapping]];
  507. [flightSearchMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"mode" expectedValue:@(RKSearchByRouteMode) objectMapping:routeMapping]];
  508. RKDynamicParameterizationFlightSearch *flightSearch = [RKDynamicParameterizationFlightSearch new];
  509. flightSearch.airlineID = @5678;
  510. flightSearch.flightNumber = @1234;
  511. flightSearch.departureAirportID = @25;
  512. flightSearch.arrivalAirportID = @66;
  513. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:flightSearchMapping
  514. objectClass:[RKDynamicParameterizationFlightSearch class]
  515. rootKeyPath:@"flight_search"
  516. method:RKRequestMethodAny];
  517. NSError *error = nil;
  518. NSDictionary *parameters = nil;
  519. // Test generation of Flight Number parameters
  520. flightSearch.mode = RKSearchByFlightNumberMode;
  521. parameters = [RKObjectParameterization parametersWithObject:flightSearch requestDescriptor:requestDescriptor error:&error];
  522. expect(parameters).to.equal(expectedFlightNumberParameters);
  523. // Test generation of Route paramters
  524. flightSearch.mode = RKSearchByRouteMode;
  525. parameters = [RKObjectParameterization parametersWithObject:flightSearch requestDescriptor:requestDescriptor error:&error];
  526. expect(parameters).to.equal(expectedRouteParameters);
  527. // Test non-match
  528. flightSearch.mode = RKSearcyByOtherMode;
  529. parameters = [RKObjectParameterization parametersWithObject:flightSearch requestDescriptor:requestDescriptor error:&error];
  530. expect(parameters).to.beNil();
  531. expect(error).notTo.beNil();
  532. expect(error.code).to.equal(RKMappingErrorUnableToDetermineMapping);
  533. }
  534. - (void)testDynamicParameterizationIncludingADate
  535. {
  536. RKObjectMapping *concreteMapping = [RKObjectMapping requestMapping];
  537. [concreteMapping addAttributeMappingsFromDictionary:@{ @"departureDate": @"departure_date" }];
  538. RKDynamicMapping *flightSearchMapping = [RKDynamicMapping new];
  539. [flightSearchMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"mode" expectedValue:@(RKSearchByFlightNumberMode) objectMapping:concreteMapping]];
  540. RKDynamicParameterizationFlightSearch *flightSearch = [RKDynamicParameterizationFlightSearch new];
  541. flightSearch.airlineID = @5678;
  542. flightSearch.flightNumber = @1234;
  543. flightSearch.departureAirportID = @25;
  544. flightSearch.arrivalAirportID = @66;
  545. flightSearch.mode = RKSearchByFlightNumberMode;
  546. flightSearch.departureDate = [NSDate dateWithTimeIntervalSince1970:0];
  547. RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:flightSearchMapping
  548. objectClass:[RKDynamicParameterizationFlightSearch class]
  549. rootKeyPath:@"flight_search"
  550. method:RKRequestMethodAny];
  551. NSError *error = nil;
  552. NSDictionary *parameters = nil;
  553. // Test generation of Flight Number parameters
  554. parameters = [RKObjectParameterization parametersWithObject:flightSearch requestDescriptor:requestDescriptor error:&error];
  555. NSDictionary *expectedParameters = @{ @"flight_search": @{ @"departure_date": @"1970-01-01T00:00:00Z" }};
  556. expect(parameters).to.equal(expectedParameters);
  557. }
  558. - (void)testShouldSerializeHasOneRelatioshipsToJSON
  559. {
  560. RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
  561. [userMapping addAttributeMappingsFromArray:@[@"name"]];
  562. RKObjectMapping *addressMapping = [RKObjectMapping mappingForClass:[RKTestAddress class]];
  563. [addressMapping addAttributeMappingsFromArray:@[@"city", @"state"]];
  564. [userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"address" toKeyPath:@"address" withMapping:addressMapping]];
  565. RKTestUser *user = [RKTestUser new];
  566. user.name = @"Blake Watters";
  567. RKTestAddress *address = [RKTestAddress new];
  568. address.state = @"North Carolina";
  569. user.address = address;
  570. RKObjectMapping *serializationMapping = [userMapping inverseMapping];
  571. NSDictionary *params = [RKObjectParameterization parametersWithObject:user requestDescriptor:[RKRequestDescriptor requestDescriptorWithMapping:serializationMapping objectClass:[RKTestUser class] rootKeyPath:nil method:RKRequestMethodAny] error:nil];
  572. NSError *error = nil;
  573. NSData *JSON = [RKMIMETypeSerialization dataFromObject:params MIMEType:RKMIMETypeJSON error:nil];
  574. NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:JSON options:0 error:nil];
  575. assertThat(error, is(nilValue()));
  576. assertThat(jsonDictionary, is(equalTo(params)));
  577. }
  578. - (void)testShouldSerializeHasManyRelationshipsToJSON
  579. {
  580. RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
  581. [userMapping addAttributeMappingsFromArray:@[@"name"]];
  582. RKObjectMapping *addressMapping = [RKObjectMapping mappingForClass:[RKTestAddress class]];
  583. [addressMapping addAttributeMappingsFromArray:@[@"city", @"state"]];
  584. [userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"friends" toKeyPath:@"friends" withMapping:addressMapping]];
  585. RKTestUser *user = [RKTestUser new];
  586. user.name = @"Blake Watters";
  587. RKTestAddress *address1 = [RKTestAddress new];
  588. address1.city = @"Carrboro";
  589. RKTestAddress *address2 = [RKTestAddress new];
  590. address2.city = @"New York City";
  591. user.friends = @[address1, address2];
  592. RKObjectMapping *serializationMapping = [userMapping inverseMapping];
  593. NSDictionary *params = [RKObjectParameterization parametersWithObject:user requestDescriptor:[RKRequestDescriptor requestDescriptorWithMapping:serializationMapping objectClass:[RKTestUser class] rootKeyPath:nil method:RKRequestMethodAny] error:nil];
  594. NSError *error = nil;
  595. NSData *JSON = [RKMIMETypeSerialization dataFromObject:params MIMEType:RKMIMETypeJSON error:nil];
  596. NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:JSON options:0 error:nil];
  597. assertThat(error, is(nilValue()));
  598. assertThat(jsonDictionary, is(equalTo(params)));
  599. }
  600. - (void)testShouldSerializeManagedHasManyRelationshipsToJSON
  601. {
  602. RKManagedObjectStore *managedObjectStore = [RKTestFactory managedObjectStore];
  603. RKObjectMapping *humanMapping = [RKObjectMapping mappingForClass:[RKHuman class]];
  604. [humanMapping addAttributeMappingsFromArray:@[@"name"]];
  605. RKObjectMapping *catMapping = [RKObjectMapping mappingForClass:[RKCat class]];
  606. [catMapping addAttributeMappingsFromArray:@[@"name"]];
  607. [humanMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"cats" toKeyPath:@"cats" withMapping:catMapping]];
  608. RKHuman *blake = [NSEntityDescription insertNewObjectForEntityForName:@"Human" inManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];
  609. blake.name = @"Blake Watters";
  610. RKCat *asia = [NSEntityDescription insertNewObjectForEntityForName:@"Cat" inManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];
  611. asia.name = @"Asia";
  612. RKCat *roy = [NSEntityDescription insertNewObjectForEntityForName:@"Cat" inManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];
  613. roy.name = @"Roy";
  614. blake.cats = [NSSet setWithObjects:asia, roy, nil];
  615. RKObjectMapping *serializationMapping = [humanMapping inverseMapping];
  616. NSDictionary *params = [RKObjectParameterization parametersWithObject:blake requestDescriptor:[RKRequestDescriptor requestDescriptorWithMapping:serializationMapping objectClass:[RKHuman class] rootKeyPath:nil method:RKRequestMethodAny] error:nil];
  617. NSError *error = nil;
  618. NSDictionary *parsedJSON = [NSJSONSerialization JSONObjectWithData:[RKMIMETypeSerialization dataFromObject:params MIMEType:RKMIMETypeJSON error:nil] options:0 error:nil];
  619. assertThat(error, is(nilValue()));
  620. assertThat([parsedJSON valueForKey:@"name"], is(equalTo(@"Blake Watters")));
  621. NSArray *catNames = [[parsedJSON valueForKeyPath:@"cats.name"] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
  622. assertThat(catNames, is(equalTo(@[@"Asia", @"Roy"])));
  623. }
  624. - (void)testParameterizingHasManyRelationshipToNestedKeyPath
  625. {
  626. RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKTestUser class]];
  627. [userMapping addAttributeMappingsFromArray:@[@"name"]];
  628. RKObjectMapping *addressMapping = [RKObjectMapping mappingForClass:[RKTestAddress class]];
  629. [addressMapping addAttributeMappingsFromArray:@[@"city", @"state"]];
  630. [userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"friends" toKeyPath:@"friends" withMapping:addressMapping]];
  631. RKTestUser *user = [RKTestUser new];
  632. user.name = @"Blake Watters";
  633. RKTestAddress *address1 = [RKTestAddress new];
  634. address1.city = @"Carrboro";
  635. RKTestAddress *address2 = [RKTestAddress new];
  636. address2.city = @"New York City";
  637. user.friends = @[address1, address2];
  638. RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
  639. [requestMapping addAttributeMappingsFromArray:@[ @"name" ]];
  640. RKObjectMapping *cityMapping = [RKObjectMapping requestMapping];
  641. [cityMapping addAttributeMappingsFromArray:@[ @"city" ]];
  642. [requestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"friends" toKeyPath:@"cities.eastCoast" withMapping:cityMapping]];;
  643. NSDictionary *params = [RKObjectParameterization parametersWithObject:user requestDescriptor:[RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[RKTestUser class] rootKeyPath:nil method:RKRequestMethodAny] error:nil];
  644. NSError *error = nil;
  645. NSDictionary *parsedJSON = [NSJSONSerialization JSONObjectWithData:[RKMIMETypeSerialization dataFromObject:params MIMEType:RKMIMETypeJSON error:nil] options:0 error:nil];
  646. assertThat(error, is(nilValue()));
  647. assertThat(parsedJSON[@"name"], is(equalTo(@"Blake Watters")));
  648. assertThat([parsedJSON valueForKeyPath:@"cities.eastCoast.city"], hasItems(@"Carrboro", @"New York City", nil));
  649. }
  650. @end