91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott/*
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * The contents of this file are subject to the terms of the Common Development and
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * Distribution License (the License). You may not use this file except in compliance with the
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * License.
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott *
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * specific language governing permission and limitations under the License.
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott *
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * When distributing Covered Software, include this CDDL Header Notice in each file and include
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * Header, with the fields enclosed by brackets [] replaced by your own identifying
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * information: "Portions copyright [year] [name of copyright owner]".
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott *
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott * Copyright 2016 ForgeRock AS.
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott */
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#import <OCMock/OCMock.h>
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott#import <XCTest/XCTest.h>
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#import "FRAIdentityDatabase.h"
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#import "FRAIdentityDatabaseSQLiteOperations.h"
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni#import "FRAIdentityModel.h"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings#import "FRAMessageUtils.h"
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott#import "FRANotification.h"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings#import "FRAPushMechanism.h"
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott@interface FRANotificationTest : XCTestCase
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott@end
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott@implementation FRANotificationTest {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott id mockSqlOperations;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni id mockIdentityModel;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott id databaseObserverMock;
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell FRAIdentityDatabase *database;
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott FRANotification* notification;
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings id messageUtilsMock;
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings FRAPushMechanism *mechanism;
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott- (void)setUp {
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott [super setUp];
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell mockSqlOperations = OCMClassMock([FRAIdentityDatabaseSQLiteOperations class]);
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni mockIdentityModel = OCMClassMock([FRAIdentityModel class]);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell database = [[FRAIdentityDatabase alloc] initWithSqlOperations:mockSqlOperations];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell NSTimeInterval timeToLive = 120.0;
f877f6ca2428244a6d0954a1dbef471577b32c60Diego Colantoni mechanism = [[FRAPushMechanism alloc] initWithDatabase:database identityModel:mockIdentityModel authEndpoint:@"http://service.endpoint" secret:@"secret"];
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings notification = [[FRANotification alloc] initWithDatabase:database identityModel:mockIdentityModel messageId:@"messageId" challenge:@"challenge" timeReceived:[NSDate date] timeToLive:timeToLive loadBalancerCookieData:@"amlbcookie=03"];
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings OCMStub([(FRAIdentityDatabaseSQLiteOperations *)mockSqlOperations insertNotification:notification error:nil]).andReturn(YES);
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings OCMStub([(FRAIdentityDatabaseSQLiteOperations *)mockSqlOperations updateNotification:notification error:nil]).andReturn(YES);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell databaseObserverMock = OCMObserverMock();
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings messageUtilsMock = OCMClassMock([FRAMessageUtils class]);
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings [notification setParent:mechanism];
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott- (void)tearDown {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [mockSqlOperations stopMocking];
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings [messageUtilsMock stopMocking];
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott [super tearDown];
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott- (void)testInitialStateOfNotification {
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // Given
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // When
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // Then
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott XCTAssertEqual([notification isPending], YES);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott XCTAssertEqual([notification isApproved], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([notification isDenied], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([notification isExpired], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni}
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni- (void)testShouldSetTimeExpired {
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // Given
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni NSDate *timeReceived = [NSDate date];
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni NSTimeInterval timeToLive = 120.0;
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings FRANotification *expiringNotification = [[FRANotification alloc] initWithDatabase:database identityModel:mockIdentityModel messageId:@"messageId" challenge:@"challenge" timeReceived:timeReceived timeToLive:timeToLive loadBalancerCookieData:@"amlbcookie=03"];
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // When
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // Then
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqualObjects([expiringNotification timeExpired], [timeReceived dateByAddingTimeInterval:timeToLive]);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott- (void)testShouldApproveNotification {
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // Given
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // When
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni [notification approveWithHandler:nil error:nil];
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // Then
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott XCTAssertEqual([notification isPending], NO);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott XCTAssertEqual([notification isApproved], YES);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([notification isDenied], NO);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings- (void)testApproveNotificationSendsMessageToService {
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings // Given
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings [database insertNotification:notification error:nil];
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings OCMExpect([messageUtilsMock respondWithEndpoint:@"http://service.endpoint"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings base64Secret:@"secret"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings messageId:@"messageId"
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings loadBalancerCookieData:@"amlbcookie=03"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings data:@{@"response":[FRAMessageUtils generateChallengeResponse:@"challenge"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings secret:@"secret"]}
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings handler:[OCMArg any]]);
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings // When
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni [notification approveWithHandler:nil error:nil];
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings // Then
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings OCMVerifyAll(messageUtilsMock);
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings}
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott- (void)testShouldDenyNotification {
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // Given
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // When
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni [notification denyWithHandler:nil error:nil];
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott // Then
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott XCTAssertEqual([notification isPending], NO);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott XCTAssertEqual([notification isApproved], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([notification isDenied], YES);
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell- (void)testDenyNotificationSendsMessageToService {
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell // Given
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell [database insertNotification:notification error:nil];
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell NSDictionary *expectedData = @{
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell @"response":[FRAMessageUtils generateChallengeResponse:@"challenge" secret:@"secret"],
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell @"deny": @YES
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell };
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell OCMExpect([messageUtilsMock respondWithEndpoint:@"http://service.endpoint"
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings base64Secret:@"secret"
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings messageId:@"messageId"
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings loadBalancerCookieData:@"amlbcookie=03"
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings data:expectedData
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings handler:[OCMArg any]]);
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell // When
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni [notification denyWithHandler:nil error:nil];
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell // Then
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell OCMVerifyAll(messageUtilsMock);
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell}
cc2ae888007384c94072d7864e53548dd2840d33Craig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell- (void)testSavedNotificationAutomaticallySavesItselfToDatabaseWhenApproved {
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // Given
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertNotification:notification error:nil]).andReturn(YES);
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [database insertNotification:notification error:nil];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations updateNotification:notification error:nil]).andReturn(YES);
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings OCMStub([messageUtilsMock respondWithEndpoint:@"http://service.endpoint"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings base64Secret:@"secret"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings messageId:@"messageId"
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings loadBalancerCookieData:@"amlbcookie=03"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings data:@{@"response":[FRAMessageUtils generateChallengeResponse:@"challenge"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings secret:@"secret"]}
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings handler:[OCMArg any]]);
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // When
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni BOOL notificationApproved = [notification approveWithHandler:nil error:nil];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // Then
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott XCTAssertTrue(notificationApproved);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell- (void)testSavedNotificationAutomaticallySavesItselfToDatabaseWhenDenied {
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // Given
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertNotification:notification error:nil]).andReturn(YES);
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [database insertNotification:notification error:nil];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations updateNotification:notification error:nil]).andReturn(YES);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // When
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni BOOL notificationDenied = [notification denyWithHandler:nil error:nil];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // Then
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott XCTAssertTrue(notificationDenied);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell- (void)testBroadcastsOneChangeNotificationWhenNotificationUpdateIsAutomaticallySavedToDatabase {
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // Given
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations insertNotification:notification error:nil]).andReturn(YES);
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [database insertNotification:notification error:nil];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott OCMStub([(FRAIdentityDatabaseSQLiteOperations*)mockSqlOperations updateNotification:notification error:nil]).andReturn(YES);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell [[NSNotificationCenter defaultCenter] addMockObserver:databaseObserverMock name:FRAIdentityDatabaseChangedNotification object:database];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell [[databaseObserverMock expect] notificationWithName:FRAIdentityDatabaseChangedNotification object:database userInfo:[OCMArg any]];
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings OCMStub([messageUtilsMock respondWithEndpoint:@"http://service.endpoint"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings base64Secret:@"secret"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings messageId:@"messageId"
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings loadBalancerCookieData:@"amlbcookie=03"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings data:@{@"response":[FRAMessageUtils generateChallengeResponse:@"challenge"
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings secret:@"secret"]}
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen Stubbings handler:[OCMArg any]]);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // When
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni BOOL notificationApproved = [notification approveWithHandler:nil error:nil];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell // Then
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott XCTAssertTrue(notificationApproved);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell OCMVerifyAll(databaseObserverMock);
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni- (void)testIsExpiredReturnsYesIfNotificationHasExpired {
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // Given
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings FRANotification *expiredNotification = [[FRANotification alloc] initWithDatabase:database identityModel:mockIdentityModel messageId:@"messageId" challenge:@"challenge" timeReceived:[NSDate date] timeToLive:-10.0 loadBalancerCookieData:@"amlbcookie=03"];
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // When
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // Then
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([expiredNotification isExpired], YES);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([expiredNotification isPending], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([expiredNotification isApproved], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([expiredNotification isDenied], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni}
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni- (void)testIsExpiredReturnsNoIfNotificationHasNotExpired {
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // Given
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings FRANotification *expiredNotification = [[FRANotification alloc] initWithDatabase:database identityModel:mockIdentityModel messageId:@"messageId" challenge:@"challenge" timeReceived:[NSDate date] timeToLive:120.0 loadBalancerCookieData:@"amlbcookie=03"];
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // When
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni // Then
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([expiredNotification isExpired], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([expiredNotification isPending], YES);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([expiredNotification isApproved], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni XCTAssertEqual([expiredNotification isDenied], NO);
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni}
3cb6a584a87fa8fec140b0bb20dd91731d13e751Diego Colantoni
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott@end
91f0e3cb60de3eba8cbb70c7e36cc0df22d71f5bRobert Wapshott