FRAIdentityTests.m revision 721bb987c406979bcfe705fa1ca8d54497d40fcb
321N/A/*
321N/A * The contents of this file are subject to the terms of the Common Development and
321N/A * Distribution License (the License). You may not use this file except in compliance with the
321N/A * License.
940N/A *
940N/A * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
178N/A * specific language governing permission and limitations under the License.
178N/A *
178N/A * When distributing Covered Software, include this CDDL Header Notice in each file and include
224N/A * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
295N/A * Header, with the fields enclosed by brackets [] replaced by your own identifying
295N/A * information: "Portions copyright [year] [name of copyright owner]".
295N/A *
824N/A * Copyright 2016 ForgeRock AS.
824N/A */
824N/A
824N/A#import <OCMock/OCMock.h>
824N/A#import <XCTest/XCTest.h>
824N/A
824N/A#import "FRAIdentity.h"
824N/A#import "FRAIdentityDatabase.h"
824N/A#import "FRAIdentityDatabaseSQLiteOperations.h"
824N/A#import "FRAMechanism.h"
824N/A#import "FRAOathMechanism.h"
824N/A#import "FRAPushMechanism.h"
824N/A
824N/A@interface FRAIdentityTests : XCTestCase
824N/A
824N/A@end
824N/A
824N/A@implementation FRAIdentityTests {
824N/A id mockSqlOperations;
824N/A id databaseObserverMock;
178N/A FRAIdentityDatabase *database;
178N/A FRAIdentity* identity;
178N/A NSString* issuer;
178N/A NSString* accountName;
224N/A NSURL* image;
179N/A}
183N/A
183N/A- (void)setUp {
183N/A [super setUp];
183N/A mockSqlOperations = OCMClassMock([FRAIdentityDatabaseSQLiteOperations class]);
183N/A database = [[FRAIdentityDatabase alloc] initWithSqlOperations:mockSqlOperations];
366N/A issuer = @"ForgeRock";
366N/A accountName = @"joe.bloggs";
366N/A image = [NSURL URLWithString:@"https://forgerock.org/ico/favicon-32x32.png"];
366N/A identity = [FRAIdentity identityWithDatabase:database accountName:accountName issuer:issuer image:image backgroundColor:nil];
366N/A databaseObserverMock = OCMObserverMock();
366N/A}
366N/A
366N/A- (void)tearDown {
366N/A [mockSqlOperations stopMocking];
366N/A [super tearDown];
366N/A}
366N/A
366N/A- (void)testCanInitIdentityWithLabelIssuerImage {
222N/A XCTAssertEqualObjects(identity.issuer, issuer);
222N/A XCTAssertEqualObjects(identity.accountName, accountName);
222N/A XCTAssertEqualObjects([identity.image absoluteString], [image description]);
222N/A}
222N/A
222N/A- (void)testCanAddMechanism {
222N/A // Given
222N/A FRAPushMechanism *pushMechanism = [[FRAPushMechanism alloc] initWithDatabase:database];
222N/A
222N/A // When
222N/A BOOL mechanismAdded = [identity addMechanism:pushMechanism error:nil];
222N/A
222N/A // Then
222N/A XCTAssertTrue(mechanismAdded);
222N/A XCTAssertEqual(pushMechanism.parent, identity);
222N/A XCTAssertTrue([[identity mechanisms] containsObject:pushMechanism]);
222N/A}
222N/A
222N/A- (void)testSavedIdentityAutomaticallySavesAddedMechanismToDatabase {
222N/A // Given
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertIdentity:identity error:nil]).andReturn(YES);
222N/A [database insertIdentity:identity error:nil];
222N/A FRAPushMechanism *pushMechanism = [[FRAPushMechanism alloc] initWithDatabase:database];
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertMechanism:pushMechanism error:nil]).andReturn(YES);
222N/A
222N/A // When
222N/A BOOL mechanismAdded = [identity addMechanism:pushMechanism error:nil];
222N/A
366N/A // Then
222N/A XCTAssertTrue(mechanismAdded);
222N/A XCTAssertTrue([pushMechanism isStored]);
222N/A OCMVerify([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertMechanism:pushMechanism error:nil]);
222N/A}
222N/A
222N/A- (void)testBroadcastsOneChangeNotificationWhenMechanismIsAutomaticallySavedToDatabase {
222N/A // Given
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertIdentity:identity error:nil]).andReturn(YES);
222N/A [database insertIdentity:identity error:nil];
222N/A FRAPushMechanism *pushMechanism = [[FRAPushMechanism alloc] initWithDatabase:database];
222N/A [[NSNotificationCenter defaultCenter] addMockObserver:databaseObserverMock name:FRAIdentityDatabaseChangedNotification object:database];
222N/A [[databaseObserverMock expect] notificationWithName:FRAIdentityDatabaseChangedNotification object:database userInfo:[OCMArg any]];
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertMechanism:pushMechanism error:nil]).andReturn(YES);
222N/A
222N/A // When
222N/A BOOL mechanismAdded = [identity addMechanism:pushMechanism error:nil];
222N/A
222N/A // Then
222N/A XCTAssertTrue(mechanismAdded);
222N/A OCMVerifyAll(databaseObserverMock);
222N/A}
222N/A
222N/A- (void)testCanRemoveMechanism {
222N/A // Given
222N/A FRAPushMechanism *pushMechanism = [[FRAPushMechanism alloc] initWithDatabase:database];
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertMechanism:pushMechanism error:nil]).andReturn(YES);
222N/A [identity addMechanism:pushMechanism error:nil];
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations deleteMechanism:pushMechanism error:nil]).andReturn(YES);
222N/A
366N/A // When
222N/A BOOL mechanismRemoved = [identity removeMechanism:pushMechanism error:nil];
222N/A
222N/A // Then
222N/A XCTAssertTrue(mechanismRemoved);
222N/A XCTAssertEqual(pushMechanism.parent, nil);
222N/A XCTAssertFalse([[identity mechanisms] containsObject:pushMechanism]);
222N/A}
222N/A
222N/A- (void)testSavedIdentityAutomaticallyRemovesMechanismFromDatabase {
222N/A // Given
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertIdentity:identity error:nil]).andReturn(YES);
222N/A [database insertIdentity:identity error:nil];
222N/A FRAPushMechanism *pushMechanism = [[FRAPushMechanism alloc] initWithDatabase:database];
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertMechanism:pushMechanism error:nil]).andReturn(YES);
222N/A [identity addMechanism:pushMechanism error:nil];
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations deleteMechanism:pushMechanism error:nil]).andReturn(YES);
222N/A
222N/A // When
222N/A BOOL mechanismRemoved = [identity removeMechanism:pushMechanism error:nil];
222N/A
222N/A // Then
222N/A XCTAssertTrue(mechanismRemoved);
222N/A XCTAssertFalse([pushMechanism isStored]);
222N/A OCMVerify([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations deleteMechanism:pushMechanism error:nil]);
222N/A}
222N/A
222N/A- (void)testBroadcastsOneChangeNotificationWhenMechanismIsAutomaticallyRemovedFromDatabase {
222N/A // Given
222N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertIdentity:identity error:nil]).andReturn(YES);
366N/A [database insertIdentity:identity error:nil];
222N/A FRAPushMechanism *pushMechanism = [[FRAPushMechanism alloc] initWithDatabase:database];
289N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertMechanism:pushMechanism error:nil]).andReturn(YES);
289N/A [identity addMechanism:pushMechanism error:nil];
289N/A [[NSNotificationCenter defaultCenter] addMockObserver:databaseObserverMock name:FRAIdentityDatabaseChangedNotification object:database];
289N/A [[databaseObserverMock expect] notificationWithName:FRAIdentityDatabaseChangedNotification object:database userInfo:[OCMArg any]];
289N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations deleteMechanism:pushMechanism error:nil]).andReturn(YES);
289N/A
289N/A // When
289N/A BOOL mechanismRemoved = [identity removeMechanism:pushMechanism error:nil];
289N/A
289N/A // Then
289N/A XCTAssertTrue(mechanismRemoved);
289N/A OCMVerifyAll(databaseObserverMock);
289N/A}
289N/A
289N/A- (void)testCanQueryForMechanismByType {
289N/A // Given
321N/A FRAOathMechanism *oathMechanism = [[FRAOathMechanism alloc] initWithDatabase:database];
321N/A FRAPushMechanism *pushMechanism = [[FRAPushMechanism alloc] initWithDatabase:database];
321N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertMechanism:oathMechanism error:nil]).andReturn(YES);
321N/A OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertMechanism:pushMechanism error:nil]).andReturn(YES);
321N/A
321N/A // When
321N/A BOOL oathMechanismAdded = [identity addMechanism:oathMechanism error:nil];
321N/A BOOL pushMechanismAdded = [identity addMechanism:pushMechanism error:nil];
321N/A
321N/A // Then
321N/A XCTAssertTrue(oathMechanismAdded);
321N/A XCTAssertTrue(pushMechanismAdded);
321N/A XCTAssertEqualObjects([identity mechanismOfClass:[FRAOathMechanism class]], oathMechanism);
321N/A XCTAssertEqualObjects([identity mechanismOfClass:[FRAPushMechanism class]], pushMechanism);
321N/A}
321N/A
321N/A@end
321N/A