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