12a38a11eSExponent GitHub Bot// Copyright 2015-present 650 Industries. All rights reserved.
22a38a11eSExponent GitHub Bot
3d5e9e21bSBen Roth#import "ExpoKit.h"
4*652b7dd7SBen Roth#import "EXKernel.h"
5*652b7dd7SBen Roth#import "EXKernelLinkingManager.h"
6d5e9e21bSBen Roth#import "EXRootViewController.h"
7*652b7dd7SBen Roth#import "EXShellManager.h"
89aa11ec8SBen Roth#import "EXTest.h"
9d5e9e21bSBen Roth
10d5e9e21bSBen Roth#import <React/RCTAssert.h>
11d5e9e21bSBen Roth#import <React/RCTUtils.h>
122a38a11eSExponent GitHub Bot
132a38a11eSExponent GitHub Bot#import <XCTest/XCTest.h>
142a38a11eSExponent GitHub Bot
152a38a11eSExponent GitHub Bot@interface ExponentIntegrationTests : XCTestCase
162a38a11eSExponent GitHub Bot
17d5e9e21bSBen Roth@property (nonatomic, strong) EXRootViewController *rootViewController;
189aa11ec8SBen Roth@property (nonatomic, strong) NSDictionary *jsTestSuiteResult;
19d5e9e21bSBen Roth
202a38a11eSExponent GitHub Bot@end
212a38a11eSExponent GitHub Bot
222a38a11eSExponent GitHub Bot@implementation ExponentIntegrationTests
232a38a11eSExponent GitHub Bot
242a38a11eSExponent GitHub Bot- (void)setUp
252a38a11eSExponent GitHub Bot{
262a38a11eSExponent GitHub Bot  [super setUp];
279aa11ec8SBen Roth
289aa11ec8SBen Roth  _jsTestSuiteResult = nil;
29d5e9e21bSBen Roth  _rootViewController = (EXRootViewController *)[ExpoKit sharedInstance].rootViewController;
30*652b7dd7SBen Roth  [[NSNotificationCenter defaultCenter] addObserver:self
31*652b7dd7SBen Roth                                           selector:@selector(_onKernelJSLoaded)
32*652b7dd7SBen Roth                                               name:kEXKernelJSIsLoadedNotification
33*652b7dd7SBen Roth                                             object:nil];
34*652b7dd7SBen Roth  [[NSNotificationCenter defaultCenter] addObserver:self
35*652b7dd7SBen Roth                                           selector:@selector(_onTestSuiteCompleted:)
36*652b7dd7SBen Roth                                               name:EXTestSuiteCompletedNotification object:nil];
372a38a11eSExponent GitHub Bot}
382a38a11eSExponent GitHub Bot
39d5e9e21bSBen Roth- (void)testDoesTestSuiteAppPassAllJSTests
402a38a11eSExponent GitHub Bot{
41d5e9e21bSBen Roth  [_rootViewController applicationWillEnterForeground];
422a38a11eSExponent GitHub Bot
439aa11ec8SBen Roth  // wait for JS
449aa11ec8SBen Roth  NSDate *dateToTimeOut = [NSDate dateWithTimeIntervalSinceNow:60];
459aa11ec8SBen Roth  while (dateToTimeOut.timeIntervalSinceNow > 0 && _jsTestSuiteResult == nil) {
46d5e9e21bSBen Roth    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
47d5e9e21bSBen Roth    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
48d5e9e21bSBen Roth  }
499aa11ec8SBen Roth  XCTAssert((_jsTestSuiteResult), @"Test suite timed out");
509aa11ec8SBen Roth  XCTAssert(([_jsTestSuiteResult[@"failed"] integerValue] == 0), @"Test suite failed: %@", _jsTestSuiteResult);
519aa11ec8SBen Roth}
529aa11ec8SBen Roth
539aa11ec8SBen Roth#pragma mark - internal
549aa11ec8SBen Roth
55*652b7dd7SBen Roth- (void)_onKernelJSLoaded
56*652b7dd7SBen Roth{
57*652b7dd7SBen Roth  // if test environment isn't configured for a shell app, override here
58*652b7dd7SBen Roth  // since clearly we're running tests
59*652b7dd7SBen Roth  if ([EXShellManager sharedInstance].testEnvironment == EXTestEnvironmentNone) {
60*652b7dd7SBen Roth    [EXShellManager sharedInstance].testEnvironment = EXTestEnvironmentLocal;
61*652b7dd7SBen Roth  }
62*652b7dd7SBen Roth  [[EXKernel sharedInstance].serviceRegistry.linkingManager openUrl:@"exp://localhost:19002" isUniversalLink:NO];
63*652b7dd7SBen Roth}
64*652b7dd7SBen Roth
659aa11ec8SBen Roth- (void)_onTestSuiteCompleted:(NSNotification *)notif
669aa11ec8SBen Roth{
679aa11ec8SBen Roth  _jsTestSuiteResult = notif.userInfo;
682a38a11eSExponent GitHub Bot}
692a38a11eSExponent GitHub Bot
702a38a11eSExponent GitHub Bot@end
71