Antidote/local_pod_repo/objcTox/Tests/OCTSubmanagerFriendsImplTests.m
2024-02-22 21:43:11 +02:00

482 lines
17 KiB
Objective-C

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#import <Foundation/Foundation.h>
#import <OCMock/OCMock.h>
#import "OCTRealmTests.h"
#import "OCTSubmanagerFriendsImpl.h"
#import "OCTSubmanagerDataSource.h"
#import "OCTTox.h"
#import "OCTFriendRequest.h"
static const OCTToxFriendNumber kFriendNumber = 5;
static NSString *const kPublicKey = @"kPublicKey";
static NSString *const kName = @"kName";
static NSString *const kStatusMessage = @"kStatusMessage";
static const OCTToxUserStatus kStatus = OCTToxUserStatusAway;
static const OCTToxConnectionStatus kConnectionStatus = OCTToxConnectionStatusUDP;
static const BOOL kIsTyping = YES;
static NSDate *sLastSeenOnline;
static NSString *const kMessage = @"kMessage";
@interface OCTSubmanagerFriendsImplTests : OCTRealmTests
@property (strong, nonatomic) OCTSubmanagerFriendsImpl *submanager;
@property (strong, nonatomic) id dataSource;
@property (strong, nonatomic) id tox;
@end
@implementation OCTSubmanagerFriendsImplTests
- (void)setUp
{
[super setUp];
sLastSeenOnline = [NSDate date];
self.dataSource = OCMProtocolMock(@protocol(OCTSubmanagerDataSource));
OCMStub([self.dataSource managerGetRealmManager]).andReturn(self.realmManager);
self.tox = OCMClassMock([OCTTox class]);
OCMStub([self.dataSource managerGetTox]).andReturn(self.tox);
self.submanager = [OCTSubmanagerFriendsImpl new];
self.submanager.dataSource = self.dataSource;
}
- (void)tearDown
{
self.dataSource = nil;
self.tox = nil;
self.submanager = nil;
[super tearDown];
}
- (void)testConfigure
{
OCTFriend *friend = [self createFriendWithFriendNumber:5];
friend.status = OCTToxUserStatusBusy;
friend.isConnected = YES;
friend.connectionStatus = OCTToxConnectionStatusUDP;
friend.isTyping = YES;
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:5 error:[OCMArg anyObjectRef]]).andReturn(publicKey);
NSArray *array = @[@(5)];
OCMStub([self.tox friendsArray]).andReturn(array);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
[self.submanager configure];
XCTAssertEqual(friend.status, OCTToxUserStatusNone);
XCTAssertFalse(friend.isConnected);
XCTAssertEqual(friend.connectionStatus, OCTToxConnectionStatusNone);
XCTAssertFalse(friend.isTyping);
}
- (void)testConfigure2
{
OCTFriend *friend = [self createFriendWithFriendNumber:99];
// This one should be removed.
OCTFriend *unboundedFriend = [self createFriendWithFriendNumber:33];
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm addObject:unboundedFriend];
[self.realmManager.realm commitWriteTransaction];
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:99 error:[OCMArg anyObjectRef]]).andReturn(publicKey);
NSArray *array = @[@(99), @(kFriendNumber)];
OCMStub([self.tox friendsArray]).andReturn(array);
[self stubFriendMethodsInTox];
[self.submanager configure];
RLMResults *objects = [OCTFriend allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 2);
OCTFriend *first = objects[0];
OCTFriend *second = objects[1];
XCTAssertEqualObjects(friend, first);
[self verifyFriend:second];
}
#pragma mark - Public
- (void)testSendFriendRequestSuccess
{
[self stubFriendMethodsInTox];
OCMExpect([self.tox addFriendWithAddress:kPublicKey message:@"message" error:nil]).andReturn(kFriendNumber);
BOOL result = [self.submanager sendFriendRequestToAddress:kPublicKey message:@"message" error:nil];
XCTAssertTrue(result);
OCMVerify([self.dataSource managerSaveTox]);
OCMVerifyAll(self.tox);
RLMResults *objects = [OCTFriend allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 1);
OCTFriend *friend = [objects firstObject];
[self verifyFriend:friend];
}
- (void)testSendFriendRequestFailure
{
NSError *error;
NSError *error2 = [NSError new];
[[self.dataSource reject] managerSaveTox];
OCMExpect([self.tox addFriendWithAddress:kPublicKey message:@"message" error:[OCMArg setTo:error2]]).andReturn(kOCTToxFriendNumberFailure);
BOOL result = [self.submanager sendFriendRequestToAddress:kPublicKey message:@"message" error:&error];
XCTAssertFalse(result);
XCTAssertEqualObjects(error, error2);
}
- (void)testApproveFriendRequestSuccess
{
[self stubFriendMethodsInTox];
OCTFriendRequest *friendRequest = [OCTFriendRequest new];
friendRequest.publicKey = kPublicKey;
friendRequest.message = @"message";
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friendRequest];
[self.realmManager.realm commitWriteTransaction];
OCMExpect([self.tox addFriendWithNoRequestWithPublicKey:kPublicKey error:nil]).andReturn(kFriendNumber);
BOOL result = [self.submanager approveFriendRequest:friendRequest error:nil];
XCTAssertTrue(result);
OCMVerify([self.dataSource managerSaveTox]);
OCMVerifyAll(self.tox);
RLMResults *objects = [OCTFriendRequest allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 0);
objects = [OCTFriend allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 1);
OCTFriend *friend = [objects firstObject];
[self verifyFriend:friend];
}
- (void)testApproveFriendRequestFailure
{
OCTFriendRequest *friendRequest = [OCTFriendRequest new];
friendRequest.publicKey = kPublicKey;
friendRequest.message = @"message";
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friendRequest];
[self.realmManager.realm commitWriteTransaction];
NSError *error;
NSError *error2 = [NSError new];
[[self.dataSource reject] managerSaveTox];
OCMExpect([self.tox addFriendWithNoRequestWithPublicKey:kPublicKey error:[OCMArg setTo:error2]]).andReturn(kOCTToxFriendNumberFailure);
BOOL result = [self.submanager approveFriendRequest:friendRequest error:&error];
XCTAssertFalse(result);
XCTAssertEqualObjects(error, error2);
RLMResults *objects = [OCTFriendRequest allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 1);
XCTAssertEqualObjects(friendRequest, [objects firstObject]);
}
- (void)testRemoveFriendRequest
{
OCTFriendRequest *friendRequest = [OCTFriendRequest new];
friendRequest.publicKey = kPublicKey;
friendRequest.message = @"message";
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friendRequest];
[self.realmManager.realm commitWriteTransaction];
[self.submanager removeFriendRequest:friendRequest];
RLMResults *objects = [OCTFriendRequest allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 0);
}
- (void)testRemoveFriendSuccess
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
OCMExpect([self.tox deleteFriendWithFriendNumber:kFriendNumber error:nil]).andReturn(YES);
BOOL result = [self.submanager removeFriend:friend error:nil];
XCTAssertTrue(result);
OCMVerify([self.dataSource managerSaveTox]);
RLMResults *objects = [OCTFriend allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 0);
}
- (void)testRemoveFriendFailure
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
NSError *error;
NSError *error2 = [NSError new];
[[self.dataSource reject] managerSaveTox];
OCMExpect([self.tox deleteFriendWithFriendNumber:kFriendNumber error:[OCMArg setTo:error2]]).andReturn(NO);
BOOL result = [self.submanager removeFriend:friend error:&error];
XCTAssertFalse(result);
RLMResults *objects = [OCTFriend allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 1);
XCTAssertEqualObjects([objects firstObject], friend);
}
#pragma mark - OCTToxDelegate
- (void)testFriendRequestWithMessage
{
[self.submanager tox:self.tox friendRequestWithMessage:kMessage publicKey:kPublicKey];
RLMResults *objects = [OCTFriendRequest allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 1);
OCTFriendRequest *request = [objects firstObject];
XCTAssertEqualObjects(request.publicKey, kPublicKey);
XCTAssertEqualObjects(request.message, kMessage);
XCTAssertTrue(([[NSDate date] timeIntervalSince1970] - request.dateInterval) < 0.1);
}
- (void)testFriendRequestWithMessageDuplicate
{
// trying to add same friend request twice
[self.submanager tox:self.tox friendRequestWithMessage:kMessage publicKey:kPublicKey];
[self.submanager tox:self.tox friendRequestWithMessage:kMessage publicKey:kPublicKey];
RLMResults *objects = [OCTFriendRequest allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 1);
OCTFriendRequest *request = [objects firstObject];
XCTAssertEqualObjects(request.publicKey, kPublicKey);
XCTAssertEqualObjects(request.message, kMessage);
XCTAssertTrue(([[NSDate date] timeIntervalSince1970] - request.dateInterval) < 0.1);
}
- (void)testFriendRequestWithMessageFriendExists
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
friend.publicKey = kPublicKey;
friend.status = OCTToxUserStatusBusy;
friend.isConnected = YES;
friend.connectionStatus = OCTToxConnectionStatusUDP;
friend.isTyping = YES;
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
[self.submanager tox:self.tox friendRequestWithMessage:kMessage publicKey:kPublicKey];
RLMResults *objects = [OCTFriendRequest allObjectsInRealm:self.realmManager.realm];
XCTAssertEqual(objects.count, 0);
}
- (void)testFriendNameUpdate
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
friend.publicKey = kPublicKey;
friend.nickname = kPublicKey;
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
[self.submanager tox:self.tox friendNameUpdate:@"" friendNumber:kFriendNumber];
XCTAssertEqualObjects(friend.name, @"");
XCTAssertEqualObjects(friend.nickname, kPublicKey);
[self.submanager tox:self.tox friendNameUpdate:kName friendNumber:kFriendNumber];
XCTAssertEqualObjects(friend.name, kName);
XCTAssertEqualObjects(friend.nickname, kName);
}
- (void)testStatusMessageUpdate
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
[self.submanager tox:self.tox friendStatusMessageUpdate:kStatusMessage friendNumber:kFriendNumber];
XCTAssertEqualObjects(friend.statusMessage, kStatusMessage);
}
- (void)testStatusUpdate
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
[self.submanager tox:self.tox friendStatusUpdate:kStatus friendNumber:kFriendNumber];
XCTAssertEqual(friend.status, kStatus);
}
- (void)testLastSeenDate
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
friend.lastSeenOnlineInterval = 0;
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
XCTAssertNil([friend lastSeenOnline]);
[self.submanager tox:self.tox friendConnectionStatusChanged:OCTToxConnectionStatusTCP friendNumber:kFriendNumber];
XCTAssertNil([friend lastSeenOnline]);
XCTAssertEqual(friend.lastSeenOnlineInterval, 0);
[self stubFriendMethodsInTox];
[self.submanager tox:self.tox friendConnectionStatusChanged:OCTToxConnectionStatusNone friendNumber:kFriendNumber];
XCTAssertEqual(friend.lastSeenOnlineInterval, [sLastSeenOnline timeIntervalSince1970]);
}
- (void)testIsTypingUpdate
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
[self.submanager tox:self.tox friendIsTypingUpdate:kIsTyping friendNumber:kFriendNumber];
XCTAssertEqual(friend.isTyping, kIsTyping);
}
- (void)testFriendConnectionStatusChanged
{
OCTFriend *friend = [self createFriendWithFriendNumber:kFriendNumber];
NSString *publicKey = friend.publicKey;
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(publicKey);
[self.realmManager.realm beginWriteTransaction];
[self.realmManager.realm addObject:friend];
[self.realmManager.realm commitWriteTransaction];
[self.submanager tox:self.tox friendConnectionStatusChanged:OCTToxConnectionStatusUDP friendNumber:kFriendNumber];
XCTAssertEqual(friend.connectionStatus, OCTToxConnectionStatusUDP);
XCTAssertTrue(friend.isConnected);
[self.submanager tox:self.tox friendConnectionStatusChanged:OCTToxConnectionStatusNone friendNumber:kFriendNumber];
XCTAssertEqual(friend.connectionStatus, OCTToxConnectionStatusNone);
XCTAssertFalse(friend.isConnected);
[self.submanager tox:self.tox friendConnectionStatusChanged:OCTToxConnectionStatusTCP friendNumber:kFriendNumber];
XCTAssertEqual(friend.connectionStatus, OCTToxConnectionStatusTCP);
XCTAssertTrue(friend.isConnected);
NSNotificationCenter *center = [[NSNotificationCenter alloc] init];
OCMStub([self.dataSource managerGetNotificationCenter]).andReturn(center);
XCTestExpectation *expect = [self expectationWithDescription:@""];
[center addObserverForName:kOCTFriendConnectionStatusChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
if ([note.object friendNumber] == kFriendNumber) {
[expect fulfill];
}
}];
[self.submanager tox:self.tox friendConnectionStatusChanged:OCTToxConnectionStatusUDP friendNumber:kFriendNumber];
[self waitForExpectationsWithTimeout:0.0 handler:nil];
}
#pragma mark - Helper methods
- (void)stubFriendMethodsInTox
{
OCMStub([self.tox publicKeyFromFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(kPublicKey);
OCMStub([self.tox friendNameWithFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(kName);
OCMStub([self.tox friendStatusMessageWithFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(kStatusMessage);
OCMStub([self.tox friendStatusWithFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(kStatus);
OCMStub([self.tox friendConnectionStatusWithFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(kConnectionStatus);
OCMStub([self.tox friendGetLastOnlineWithFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(sLastSeenOnline);
OCMStub([self.tox isFriendTypingWithFriendNumber:kFriendNumber error:[OCMArg anyObjectRef]]).andReturn(kIsTyping);
}
- (void)verifyFriend:(OCTFriend *)friend
{
XCTAssertEqual(friend.friendNumber, kFriendNumber);
XCTAssertEqualObjects(friend.nickname, kName);
XCTAssertEqualObjects(friend.publicKey, kPublicKey);
XCTAssertEqualObjects(friend.name, kName);
XCTAssertEqualObjects(friend.statusMessage, kStatusMessage);
XCTAssertEqual(friend.status, kStatus);
XCTAssertEqual(friend.isConnected, YES);
XCTAssertEqual(friend.connectionStatus, kConnectionStatus);
XCTAssertEqual(friend.lastSeenOnlineInterval, [sLastSeenOnline timeIntervalSince1970]);
XCTAssertEqual(friend.isTyping, kIsTyping);
}
@end