6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell/*
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * The contents of this file are subject to the terms of the Common Development and
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * Distribution License (the License). You may not use this file except in compliance with the
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * License.
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell *
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * specific language governing permission and limitations under the License.
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell *
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * When distributing Covered Software, include this CDDL Header Notice in each file and include
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * Header, with the fields enclosed by brackets [] replaced by your own identifying
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * information: "Portions copyright [year] [name of copyright owner]".
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell *
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell * Copyright 2016 ForgeRock AS.
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell */
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell#import <OCMock/OCMock.h>
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell#import <UIKit/UIKit.h>
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell#import <XCTest/XCTest.h>
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
276472a0a89338dbd378365164e34cba81a395d2Craig McDonnell#import "FRAIdentity.h"
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell#import "FRALAContextFactory.h"
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell#import "FRANotification.h"
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell#import "FRANotificationViewController.h"
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell#import "FRAPushMechanism.h"
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell@interface FRANotificationViewControllerTests : XCTestCase
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell@end
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell@implementation FRANotificationViewControllerTests {
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell FRANotificationViewController *viewController;
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell id identity;
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell id mechanism;
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell id notification;
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell FRALAContextFactory *authContextFactory;
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell}
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell- (void)setUp {
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell [super setUp];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
276472a0a89338dbd378365164e34cba81a395d2Craig McDonnell identity = OCMClassMock([FRAIdentity class]);
276472a0a89338dbd378365164e34cba81a395d2Craig McDonnell mechanism = OCMClassMock([FRAPushMechanism class]);
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell notification = OCMClassMock([FRANotification class]);
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell authContextFactory = OCMClassMock([FRALAContextFactory class]);
276472a0a89338dbd378365164e34cba81a395d2Craig McDonnell OCMStub([notification parent]).andReturn(mechanism);
276472a0a89338dbd378365164e34cba81a395d2Craig McDonnell OCMStub([mechanism parent]).andReturn(identity);
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell // load notification controller from storyboard
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell viewController = [storyboard instantiateViewControllerWithIdentifier:FRANotificationViewControllerStoryboardIdentifer];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell viewController.notification = notification;
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell viewController.authContextFactory = authContextFactory;
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell}
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell- (void)tearDown {
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell [self simulateUnloadingOfView];
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell [identity stopMocking];
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell [mechanism stopMocking];
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell [notification stopMocking];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell [super tearDown];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell}
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell- (void)testIfTouchIDUnavailableThenUserShouldBeShownSliderToApproveAndButtonToDenyAuthentication {
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell // Given
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell id authContext = OCMClassMock([LAContext class]);
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell OCMStub([authContextFactory newLAContext]).andReturn(authContext);
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell // When
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell [self simulateLoadingOfView];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell // Then
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell OCMVerifyAll(authContext);
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell XCTAssertEqual(viewController.authorizeSlider.hidden, NO, "slider should be shown if Touch ID unavailable");
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell XCTAssertEqual(viewController.denyButton.hidden, NO, "deny button should be shown if Touch ID unavailable");
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell}
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell- (void)testTouchIDShouldBeUsedIfAvailable {
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell // Given
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell id authContext = OCMClassMock([LAContext class]);
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell OCMStub([authContextFactory newLAContext]).andReturn(authContext);
276472a0a89338dbd378365164e34cba81a395d2Craig McDonnell OCMStub([identity issuer]).andReturn(@"Umbrella Corp");
276472a0a89338dbd378365164e34cba81a395d2Craig McDonnell OCMStub([identity accountName]).andReturn(@"alice");
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell OCMExpect([authContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell error:[OCMArg anyObjectRef]]).andReturn(YES);
12579b0c3fcfd4a0ed1ab1598fea93ddb7a584bcCraig McDonnell OCMExpect([authContext evaluatePolicy:LAPolicyDeviceOwnerAuthentication
276472a0a89338dbd378365164e34cba81a395d2Craig McDonnell localizedReason:@"Log in to Umbrella Corp as alice using Touch ID" reply:[OCMArg any]]);
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell // When
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell [self simulateLoadingOfView];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell // Then
1680db67c31badf9127409069c107fbbeb386fa0Craig McDonnell OCMVerifyAll(authContext);
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell XCTAssertEqual(viewController.authorizeSlider.hidden, YES, "slider should not be shown if Touch ID is available");
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell XCTAssertEqual(viewController.denyButton.hidden, YES, "deny button should not be shown if Touch ID is available");
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell}
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell- (void)simulateLoadingOfView {
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_8_4) {
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [viewController view]; // force IBOutlets etc to be initialized
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell } else {
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [viewController loadViewIfNeeded]; // force IBOutlets etc to be initialized
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell }
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell XCTAssertNotNil(viewController.view);
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell [viewController viewWillAppear:YES];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell}
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell- (void)simulateUnloadingOfView {
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell [viewController viewWillDisappear:YES];
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell}
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell
6d34df76ea55353d972de9caf3585e04714b2780Craig McDonnell@end