FRANotificationsTableViewControllerTests.m revision 6a2ae9c7fb4d2c40d75cab0edaf940f22c18224f
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell/*
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * The contents of this file are subject to the terms of the Common Development and
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * Distribution License (the License). You may not use this file except in compliance with the
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * License.
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell *
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * specific language governing permission and limitations under the License.
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell *
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * When distributing Covered Software, include this CDDL Header Notice in each file and include
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * Header, with the fields enclosed by brackets [] replaced by your own identifying
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * information: "Portions copyright [year] [name of copyright owner]".
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell *
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell * Copyright 2016 ForgeRock AS.
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell */
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import <OCMock/OCMock.h>
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import <UIKit/UIKit.h>
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import <XCTest/XCTest.h>
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import "FRAApplicationAssembly.h"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import "FRAIdentityModel.h"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import "FRAIdentity.h"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import "FRANotification.h"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import "FRANotificationTableViewCell.h"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import "FRANotificationsTableViewController.h"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell#import "FRAPushMechanism.h"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnellstatic const NSInteger SECTIONS = 2;
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnellstatic const NSInteger PENDING_SECTION = 0;
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnellstatic const NSInteger COMPLETED_SECTION = 1;
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell@interface FRANotificationsTableViewControllerTests : XCTestCase
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell@end
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell@implementation FRANotificationsTableViewControllerTests {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationsTableViewController *viewController;
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRAPushMechanism *pushMechanism;
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)setUp {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [super setUp];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell pushMechanism = [FRAPushMechanism pushMechanismWithDatabase:nil identityModel:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // load notifications controller from storyboard
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell viewController = [storyboard instantiateViewControllerWithIdentifier:@"NotificationsTableViewController"];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell viewController.pushMechanism = pushMechanism;
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)tearDown {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateUnloadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [super tearDown];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testShowsNoNotificationsIfThereAreNone {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual([viewController numberOfSectionsInTableView:viewController.tableView], SECTIONS);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual([viewController tableView:viewController.tableView numberOfRowsInSection:PENDING_SECTION], 0);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual([viewController tableView:viewController.tableView numberOfRowsInSection:COMPLETED_SECTION], 0);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testShowsPendingNotificationsInFirstSection {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:[self pendingNotificationReceivedAt:[NSDate date]] error:nil];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:[self pendingNotificationReceivedAt:[NSDate date]] error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects([viewController tableView:viewController.tableView titleForHeaderInSection:PENDING_SECTION], @"");
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual([viewController tableView:viewController.tableView numberOfRowsInSection:PENDING_SECTION], 2);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual([viewController tableView:viewController.tableView numberOfRowsInSection:COMPLETED_SECTION], 0);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testShowsCompletedNotificationsInSecondSection {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:[self approvedNotificationReceivedAt:[NSDate date]] error:nil];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:[self deniedNotificationReceivedAt:[NSDate date]] error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects([viewController tableView:viewController.tableView titleForHeaderInSection:COMPLETED_SECTION], @"COMPLETED");
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual([viewController tableView:viewController.tableView numberOfRowsInSection:PENDING_SECTION], 0);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual([viewController tableView:viewController.tableView numberOfRowsInSection:COMPLETED_SECTION], 2);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testShowsDetailsOfPendingNotification {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotification *pendingNotification = [self pendingNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-15.0]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:pendingNotification error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell NSIndexPath *notificationIndexPath = [NSIndexPath indexPathForRow:0 inSection:PENDING_SECTION];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *cell = [self cellForRowAtIndexPath:notificationIndexPath];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(cell.status.text, @"Pending");
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(cell.time.text, [pendingNotification age]);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testCanSequeFromPendingNotificationToNotificationView {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:[self pendingNotificationReceivedAt:[NSDate date]] error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell NSIndexPath *notificationIndexPath = [NSIndexPath indexPathForRow:0 inSection:PENDING_SECTION];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *cell = [self cellForRowAtIndexPath:notificationIndexPath];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.selectionStyle, UITableViewCellSelectionStyleDefault);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.isUserInteractionEnabled, YES);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.accessoryType, UITableViewCellAccessoryDisclosureIndicator);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects([viewController tableView:viewController.tableView willSelectRowAtIndexPath:notificationIndexPath], notificationIndexPath);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testShowsDetailsOfApprovedNotification {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotification *approvedNotification = [self approvedNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-15.0]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:approvedNotification error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell NSIndexPath *notificationIndexPath = [NSIndexPath indexPathForRow:0 inSection:COMPLETED_SECTION];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *cell = [self cellForRowAtIndexPath:notificationIndexPath];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(cell.status.text, @"Approved");
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(cell.time.text, [approvedNotification age]);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testCannotSequeFromApprovedNotificationToNotificationView {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:[self approvedNotificationReceivedAt:[NSDate date]] error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell NSIndexPath *notificationIndexPath = [NSIndexPath indexPathForRow:0 inSection:COMPLETED_SECTION];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *cell = [self cellForRowAtIndexPath:notificationIndexPath];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.selectionStyle, UITableViewCellSelectionStyleNone);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.isUserInteractionEnabled, NO);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.accessoryType, UITableViewCellAccessoryNone);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects([viewController tableView:viewController.tableView willSelectRowAtIndexPath:notificationIndexPath], nil);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testShowsDetailsOfDeniedNotification {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotification *deniedNotification = [self deniedNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-15.0]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:deniedNotification error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell NSIndexPath *notificationIndexPath = [NSIndexPath indexPathForRow:0 inSection:COMPLETED_SECTION];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *cell = [self cellForRowAtIndexPath:notificationIndexPath];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(cell.status.text, @"Denied");
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(cell.time.text, [deniedNotification age]);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testCannotSequeFromDeniedNotificationToNotificationView {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:[self deniedNotificationReceivedAt:[NSDate date]] error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [self simulateLoadingOfView];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell NSIndexPath *notificationIndexPath = [NSIndexPath indexPathForRow:0 inSection:COMPLETED_SECTION];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *cell = [self cellForRowAtIndexPath:notificationIndexPath];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.selectionStyle, UITableViewCellSelectionStyleNone);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.isUserInteractionEnabled, NO);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqual(cell.accessoryType, UITableViewCellAccessoryNone);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects([viewController tableView:viewController.tableView willSelectRowAtIndexPath:notificationIndexPath], nil);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// FIXME: testSortsPendingNotificationsChronologically fails due to unmet assertions in UIKit
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell//- (void)testSortsPendingNotificationsChronologically {
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// // Given
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// FRANotification *firstNotification = [self pendingNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-15.0]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// FRANotification *secondNotification = [self pendingNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-240.0]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// FRANotification *thirdNotification = [self pendingNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-300.0]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// // NB. Add notifications out of order to confirm that they get sorted after retrieval from the push mechanism
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// [pushMechanism addNotification:secondNotification error:nil];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// [pushMechanism addNotification:thirdNotification error:nil];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// [pushMechanism addNotification:firstNotification error:nil];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell//
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// // When
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// FRANotificationTableViewCell *firstCell = [self cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:PENDING_SECTION]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// FRANotificationTableViewCell *secondCell = [self cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:PENDING_SECTION]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// FRANotificationTableViewCell *thirdCell = [self cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:PENDING_SECTION]];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell//
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// // Then
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// XCTAssertEqualObjects(firstCell.time.text, [firstNotification age]);
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// XCTAssertEqualObjects(secondCell.time.text, [secondNotification age]);
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell// XCTAssertEqualObjects(thirdCell.time.text, [thirdNotification age]);
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell//}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)testSortsCompletedNotificationsChronologically {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Given
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotification *firstNotification = [self approvedNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-15.0]];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotification *secondNotification = [self deniedNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-240.0]];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotification *thirdNotification = [self approvedNotificationReceivedAt:[NSDate dateWithTimeIntervalSinceNow:-300.0]];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // NB. Add notifications out of order to confirm that they get sorted after retrieval from the push mechanism
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:secondNotification error:nil];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:thirdNotification error:nil];
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell [pushMechanism addNotification:firstNotification error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // When
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *firstCell = [self cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:COMPLETED_SECTION]];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *secondCell = [self cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:COMPLETED_SECTION]];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotificationTableViewCell *thirdCell = [self cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:COMPLETED_SECTION]];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell // Then
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(firstCell.time.text, [firstNotification age]);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(secondCell.time.text, [secondNotification age]);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertEqualObjects(thirdCell.time.text, [thirdNotification age]);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig 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 }
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell XCTAssertNotNil(viewController.view);
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [viewController viewWillAppear:YES];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (void)simulateUnloadingOfView {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [viewController viewWillDisappear:YES];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (FRANotification *)pendingNotificationReceivedAt:(NSDate *)timeReceived {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell return [FRANotification notificationWithDatabase:nil
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell identityModel:nil
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell messageId:@"dummy"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell challenge:@"dummy"
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell timeReceived:timeReceived
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell timeToLive:120.0
ff2edace1e77f0e80bc2f5da30344d21c3274885Craig McDonnell loadBalancerCookieData:@"01"];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (FRANotification *)approvedNotificationReceivedAt:(NSDate *)timeReceived {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotification *notification = [self pendingNotificationReceivedAt:timeReceived];
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni [notification approveWithHandler:nil error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell return notification;
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (FRANotification *)deniedNotificationReceivedAt:(NSDate *)timeReceived {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell FRANotification *notification = [self pendingNotificationReceivedAt:timeReceived];
6a2ae9c7fb4d2c40d75cab0edaf940f22c18224fDiego Colantoni [notification denyWithHandler:nil error:nil];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell return notification;
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell- (FRANotificationTableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath {
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell return (FRANotificationTableViewCell *)
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell [viewController tableView:viewController.tableView cellForRowAtIndexPath:indexPath];
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell}
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell
a3970d0ea62388e4ede01470a6436eb5c6c92353Craig McDonnell@end