1*3d95647eSBen Roth#import <XCTest/XCTest.h>
2*3d95647eSBen Roth
3*3d95647eSBen Roth#import "EXAppLoader+Tests.h"
4*3d95647eSBen Roth#import "EXAppFetcherWithTimeout.h"
5*3d95647eSBen Roth#import "EXClientTestCase.h"
6*3d95647eSBen Roth#import "EXEnvironment.h"
7*3d95647eSBen Roth
8*3d95647eSBen Roth@interface EXAppFetcherWithTimeout (EXAppLoaderTests)
9*3d95647eSBen Roth
10*3d95647eSBen Roth@property (nonatomic, readonly) NSTimeInterval timeout;
11*3d95647eSBen Roth
12*3d95647eSBen Roth@end
13*3d95647eSBen Roth
14*3d95647eSBen Roth@interface EXAppLoaderConfigurationTests : EXClientTestCase
15*3d95647eSBen Roth
16*3d95647eSBen Roth@end
17*3d95647eSBen Roth
18*3d95647eSBen Roth@implementation EXAppLoaderConfigurationTests
19*3d95647eSBen Roth
20*3d95647eSBen Roth- (void)setUp
21*3d95647eSBen Roth{
22*3d95647eSBen Roth  [super setUp];
23*3d95647eSBen Roth
24*3d95647eSBen Roth  if ([EXEnvironment sharedEnvironment].testEnvironment == EXTestEnvironmentNone) {
25*3d95647eSBen Roth    [EXEnvironment sharedEnvironment].testEnvironment = EXTestEnvironmentLocal;
26*3d95647eSBen Roth  }
27*3d95647eSBen Roth}
28*3d95647eSBen Roth
29*3d95647eSBen Roth#pragma mark - app loader configuration in app.json
30*3d95647eSBen Roth
31*3d95647eSBen Roth- (void)testIsDefaultUpdatesConfigUsed
32*3d95647eSBen Roth{
33*3d95647eSBen Roth  NSDictionary *manifest = @{};
34*3d95647eSBen Roth  EXAppLoader *appLoader = [[EXAppLoader alloc] initWithManifestUrl:[NSURL URLWithString:@"exp://exp.host/@esamelson/test-fetch-update"]];
35*3d95647eSBen Roth  [appLoader _fetchBundleWithManifest:manifest];
36*3d95647eSBen Roth  XCTAssert([appLoader.appFetcher isKindOfClass:[EXAppFetcherWithTimeout class]], @"AppLoader should choose to use AppFetcherWithTimeout when fetching remotely");
37*3d95647eSBen Roth  XCTAssert([(EXAppFetcherWithTimeout *)appLoader.appFetcher timeout] == kEXAppLoaderDefaultTimeout, @"AppFetcherWithTimeout should have the correct user-specified timeout length");
38*3d95647eSBen Roth}
39*3d95647eSBen Roth
40*3d95647eSBen Roth- (void)testIsUpdateTimeoutConfigRespected
41*3d95647eSBen Roth{
42*3d95647eSBen Roth  NSDictionary *manifest = @{
43*3d95647eSBen Roth    @"updates": @{
44*3d95647eSBen Roth      @"fallbackToCacheTimeout": @1000,
45*3d95647eSBen Roth    }
46*3d95647eSBen Roth  };
47*3d95647eSBen Roth  EXAppLoader *appLoader = [[EXAppLoader alloc] initWithManifestUrl:[NSURL URLWithString:@"exp://exp.host/@esamelson/test-fetch-update"]];
48*3d95647eSBen Roth  [appLoader _fetchBundleWithManifest:manifest];
49*3d95647eSBen Roth  XCTAssert([appLoader.appFetcher isKindOfClass:[EXAppFetcherWithTimeout class]], @"AppLoader should choose to use AppFetcherWithTimeout when fetching remotely");
50*3d95647eSBen Roth  XCTAssert([(EXAppFetcherWithTimeout *)appLoader.appFetcher timeout] == 1.0f, @"AppFetcherWithTimeout should have the correct user-specified timeout length");
51*3d95647eSBen Roth}
52*3d95647eSBen Roth
53*3d95647eSBen Roth- (void)testIsOnErrorRecoveryIgnoredInExpoClient
54*3d95647eSBen Roth{
55*3d95647eSBen Roth  NSDictionary *manifest = @{
56*3d95647eSBen Roth    @"updates": @{
57*3d95647eSBen Roth      @"checkAutomatically": @"ON_ERROR_RECOVERY"
58*3d95647eSBen Roth    }
59*3d95647eSBen Roth  };
60*3d95647eSBen Roth  EXAppLoader *appLoader = [[EXAppLoader alloc] initWithManifestUrl:[NSURL URLWithString:@"exp://exp.host/@esamelson/test-fetch-update"]];
61*3d95647eSBen Roth  [appLoader _fetchBundleWithManifest:manifest];
62*3d95647eSBen Roth  XCTAssert([appLoader.appFetcher isKindOfClass:[EXAppFetcherWithTimeout class]], @"AppLoader should ignore ON_ERROR_RECOVERY in the Expo client");
63*3d95647eSBen Roth}
64*3d95647eSBen Roth
65*3d95647eSBen Roth@end
66