Skip to content

Commit

Permalink
Allow mocking of ARTPaginatedResult by passing responsibility of prop…
Browse files Browse the repository at this point in the history
…erty initialisation to any subclassing parties
  • Loading branch information
lawrence-forooghian authored and umair-ably committed Oct 7, 2024
1 parent 63e6f00 commit 9cf4125
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 9 deletions.
66 changes: 58 additions & 8 deletions Source/ARTPaginatedResult.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,17 @@
#import "ARTInternalLog.h"

@implementation ARTPaginatedResult {
ARTRestInternal *_rest;
dispatch_queue_t _userQueue;
dispatch_queue_t _queue;
NSMutableURLRequest *_relFirst;
NSMutableURLRequest *_relCurrent;
NSMutableURLRequest *_relNext;
ARTPaginatedResultResponseProcessor _responseProcessor;
ARTQueuedDealloc *_dealloc;
BOOL _initializedViaInit;

// All of the below instance variables are non-nil if and only if _initializedViaInit is NO
ARTRestInternal *_Nullable _rest;
_Nullable dispatch_queue_t _userQueue;
_Nullable dispatch_queue_t _queue;
NSMutableURLRequest *_Nullable _relFirst;
NSMutableURLRequest *_Nullable _relCurrent;
NSMutableURLRequest *_Nullable _relNext;
_Nullable ARTPaginatedResultResponseProcessor _responseProcessor;
ARTQueuedDealloc *_Nullable _dealloc;
}

@synthesize rest = _rest;
Expand All @@ -25,6 +28,17 @@ @implementation ARTPaginatedResult {
@synthesize relFirst = _relFirst;
@synthesize relCurrent = _relCurrent;
@synthesize relNext = _relNext;
@synthesize hasNext = _hasNext;
@synthesize isLast = _isLast;
@synthesize items = _items;

- (instancetype)init {
if (self = [super init]) {
_initializedViaInit = YES;
}

return self;
}

- (instancetype)initWithItems:(NSArray *)items
rest:(ARTRestInternal *)rest
Expand All @@ -34,6 +48,8 @@ - (instancetype)initWithItems:(NSArray *)items
responseProcessor:(ARTPaginatedResultResponseProcessor)responseProcessor
logger:(ARTInternalLog *)logger {
if (self = [super init]) {
_initializedViaInit = NO;

_items = items;

_relFirst = relFirst;
Expand Down Expand Up @@ -67,7 +83,37 @@ - (instancetype)initWithItems:(NSArray *)items
return self;
}



- (BOOL)hasNext {
if (_initializedViaInit) {
[NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"];
}

return _hasNext;
}

- (BOOL)isLast {
if (_initializedViaInit) {
[NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"];
}

return _isLast;
}

- (NSArray<id> *)items {
if (_initializedViaInit) {
[NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"];
}

return _items;
}

- (void)first:(void (^)(ARTPaginatedResult<id> *_Nullable result, ARTErrorInfo *_Nullable error))callback {
if (_initializedViaInit) {
[NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"];
}

if (callback) {
void (^userCallback)(ARTPaginatedResult<id> *_Nullable result, ARTErrorInfo *_Nullable error) = callback;
callback = ^(ARTPaginatedResult<id> *_Nullable result, ARTErrorInfo *_Nullable error) {
Expand All @@ -81,6 +127,10 @@ - (void)first:(void (^)(ARTPaginatedResult<id> *_Nullable result, ARTErrorInfo *
}

- (void)next:(void (^)(ARTPaginatedResult<id> *_Nullable result, ARTErrorInfo *_Nullable error))callback {
if (_initializedViaInit) {
[NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"];
}

if (callback) {
void (^userCallback)(ARTPaginatedResult<id> *_Nullable result, ARTErrorInfo *_Nullable error) = callback;
callback = ^(ARTPaginatedResult<id> *_Nullable result, ARTErrorInfo *_Nullable error) {
Expand Down
3 changes: 2 additions & 1 deletion Source/include/Ably/ARTPaginatedResult.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ NS_SWIFT_SENDABLE
@property (nonatomic, readonly) BOOL isLast;

/// :nodoc:
- (instancetype)init UNAVAILABLE_ATTRIBUTE;
/// If you use this initializer, trying to call any of the methods or properties in ARTPaginatedResult will throw an exception; you must provide your own implementation in a subclass. This initializer exists purely to allow you to provide a mock implementation of this class in your tests.
- (instancetype)init;

/**
* Returns a new `ARTPaginatedResult` for the first page of results.
Expand Down

0 comments on commit 9cf4125

Please sign in to comment.