Skip to content

Commit 18087af

Browse files
author
Blake Watters
committed
Fix issues with request descriptor matching and add battery of explicit tests for descriptor precedence lookup. closes RestKit#1513
1 parent 4144dfc commit 18087af

File tree

2 files changed

+79
-10
lines changed

2 files changed

+79
-10
lines changed

Code/Network/RKObjectManager.m

+8-10
Original file line numberDiff line numberDiff line change
@@ -70,24 +70,22 @@
7070
@param object The object to find a matching request descriptor for.
7171
@return An `RKRequestDescriptor` object matching the given object, or `nil` if none could be found.
7272
*/
73-
static RKRequestDescriptor *RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(NSArray *requestDescriptors, id object, RKRequestMethod requestMethod)
73+
RKRequestDescriptor *RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(NSArray *requestDescriptors, id object, RKRequestMethod requestMethod);
74+
RKRequestDescriptor *RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(NSArray *requestDescriptors, id object, RKRequestMethod requestMethod)
7475
{
75-
RKRequestDescriptor *descriptor;
7676
Class searchClass = [object class];
7777
do {
7878
for (RKRequestDescriptor *requestDescriptor in requestDescriptors) {
79-
if ([object isMemberOfClass:requestDescriptor.objectClass] && (requestMethod == requestDescriptor.method)) descriptor = requestDescriptor;
79+
if ([requestDescriptor.objectClass isEqual:searchClass] && (requestMethod == requestDescriptor.method)) return requestDescriptor;
8080
}
81-
} while ((searchClass = [searchClass superclass]));
82-
83-
searchClass = [object class];
84-
do {
81+
8582
for (RKRequestDescriptor *requestDescriptor in requestDescriptors) {
86-
if ([object isMemberOfClass:requestDescriptor.objectClass] && (requestMethod & requestDescriptor.method)) descriptor = requestDescriptor;
83+
if ([requestDescriptor.objectClass isEqual:searchClass] && (requestMethod & requestDescriptor.method)) return requestDescriptor;
8784
}
88-
} while ((searchClass = [searchClass superclass]));
85+
searchClass = [searchClass superclass];
86+
} while (searchClass);
8987

90-
return descriptor;
88+
return nil;
9189
}
9290

9391
extern NSString *RKStringDescribingRequestMethod(RKRequestMethod method);

Tests/Logic/ObjectMapping/RKObjectManagerTest.m

+71
Original file line numberDiff line numberDiff line change
@@ -1550,3 +1550,74 @@ - (void)testThatResponseDescriptorExactMethodMatchFavoredOverRKRequestMethodAny
15501550
}
15511551

15521552
@end
1553+
1554+
RKRequestDescriptor *RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(NSArray *requestDescriptors, id object, RKRequestMethod requestMethod);
1555+
1556+
@interface RKRequestDescriptorFromArrayMatchingObjectAndRequestMethodTest : RKTestCase
1557+
1558+
@property (nonatomic, strong) RKRequestDescriptor *exactClassAndExactMethodDescriptor;
1559+
@property (nonatomic, strong) RKRequestDescriptor *exactClassAndBitwiseMethodDescriptor;
1560+
@property (nonatomic, strong) RKRequestDescriptor *superclassAndExactMethodDescriptor;
1561+
@property (nonatomic, strong) RKRequestDescriptor *superclassAndBitwiseMethodDescriptor;
1562+
@property (nonatomic, strong) RKRequestDescriptor *nonMatchingClassAndExactMethodDescriptor;
1563+
@end
1564+
1565+
@implementation RKRequestDescriptorFromArrayMatchingObjectAndRequestMethodTest
1566+
1567+
- (void)setUp
1568+
{
1569+
RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
1570+
1571+
// Exact
1572+
_exactClassAndExactMethodDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[RKSubclassedTestModel class] rootKeyPath:nil method:RKRequestMethodPOST];
1573+
_exactClassAndBitwiseMethodDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[RKSubclassedTestModel class] rootKeyPath:nil method:RKRequestMethodPOST | RKRequestMethodPUT];
1574+
1575+
// Superclass
1576+
_superclassAndExactMethodDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[RKObjectMapperTestModel class] rootKeyPath:@"superclass" method:RKRequestMethodPOST];
1577+
_superclassAndBitwiseMethodDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[RKObjectMapperTestModel class] rootKeyPath:@"superclass" method:RKRequestMethodPOST | RKRequestMethodPUT];
1578+
1579+
// Non-matching
1580+
_nonMatchingClassAndExactMethodDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[RKTestUser class] rootKeyPath:@"subclassed" method:RKRequestMethodPOST];
1581+
}
1582+
1583+
- (void)testExactClassAndExactMethodMatchHasHighestPrecedence
1584+
{
1585+
RKSubclassedTestModel *object = [RKSubclassedTestModel new];
1586+
NSArray *descriptors = @[ _exactClassAndExactMethodDescriptor, _exactClassAndBitwiseMethodDescriptor, _superclassAndExactMethodDescriptor, _superclassAndBitwiseMethodDescriptor, _nonMatchingClassAndExactMethodDescriptor ];
1587+
RKRequestDescriptor *requestDescriptor = RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(descriptors, object, RKRequestMethodPOST);
1588+
expect(requestDescriptor).to.equal(_exactClassAndExactMethodDescriptor);
1589+
}
1590+
1591+
- (void)testExactClassAndBitwiseMethodMatchHasSecondHighestPrecedence
1592+
{
1593+
RKSubclassedTestModel *object = [RKSubclassedTestModel new];
1594+
NSArray *descriptors = @[ _exactClassAndBitwiseMethodDescriptor, _superclassAndExactMethodDescriptor, _superclassAndBitwiseMethodDescriptor, _nonMatchingClassAndExactMethodDescriptor ];
1595+
RKRequestDescriptor *requestDescriptor = RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(descriptors, object, RKRequestMethodPOST);
1596+
expect(requestDescriptor).to.equal(_exactClassAndBitwiseMethodDescriptor);
1597+
}
1598+
1599+
- (void)testSuperclassAndExactMethodMatchHasThirdHighestPrecedence
1600+
{
1601+
RKSubclassedTestModel *object = [RKSubclassedTestModel new];
1602+
NSArray *descriptors = @[ _superclassAndExactMethodDescriptor, _superclassAndBitwiseMethodDescriptor, _nonMatchingClassAndExactMethodDescriptor ];
1603+
RKRequestDescriptor *requestDescriptor = RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(descriptors, object, RKRequestMethodPOST);
1604+
expect(requestDescriptor).to.equal(_superclassAndExactMethodDescriptor);
1605+
}
1606+
1607+
- (void)testSuperclassAndBitwiseMethodMatchHasThirdHighestPrecedence
1608+
{
1609+
RKSubclassedTestModel *object = [RKSubclassedTestModel new];
1610+
NSArray *descriptors = @[ _superclassAndBitwiseMethodDescriptor, _nonMatchingClassAndExactMethodDescriptor ];
1611+
RKRequestDescriptor *requestDescriptor = RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(descriptors, object, RKRequestMethodPOST);
1612+
expect(requestDescriptor).to.equal(_superclassAndBitwiseMethodDescriptor);
1613+
}
1614+
1615+
- (void)testThatNonmatchingClassesReturnNil
1616+
{
1617+
RKSubclassedTestModel *object = [RKSubclassedTestModel new];
1618+
NSArray *descriptors = @[ _nonMatchingClassAndExactMethodDescriptor ];
1619+
RKRequestDescriptor *requestDescriptor = RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(descriptors, object, RKRequestMethodPOST);
1620+
expect(requestDescriptor).to.beNil();
1621+
}
1622+
1623+
@end

0 commit comments

Comments
 (0)