1#import "EXEnvironment.h"
2#import "EXEnvironment+Tests.h"
3#import "EXEnvironmentMocks.h"
4
5#import <XCTest/XCTest.h>
6
7@interface EXEnvironmentTests : XCTestCase
8
9@property (nonatomic, weak) EXEnvironment *environment;
10
11@end
12
13@implementation EXEnvironmentTests
14
15- (void)setUp
16{
17  [super setUp];
18
19  _environment = [EXEnvironment sharedEnvironment];
20  if (_environment.testEnvironment == EXTestEnvironmentNone) {
21    _environment.testEnvironment = EXTestEnvironmentLocal;
22  }
23}
24
25- (void)testIsServiceConfigRespected
26{
27  [EXEnvironmentMocks loadProdServiceConfig];
28  NSDictionary *expectedShellConfig = [EXEnvironmentMocks shellConfig];
29  NSString *expectedUrlScheme = [EXEnvironmentMocks prodUrlScheme];
30  NSDictionary *expectedEmbeddedManifest = [EXEnvironmentMocks embeddedManifest];
31  XCTAssert(_environment.isDetached, @"EXEnvironment should indicate isDetached == true when a valid standalone config is provided");
32  XCTAssert([_environment.standaloneManifestUrl isEqualToString:expectedShellConfig[@"manifestUrl"]], @"EXEnvironment should adopt the manifest url specified in the config");
33  XCTAssert([_environment.releaseChannel isEqualToString:@"default"], @"EXEnvironment should use default release channel when none is specified");
34  XCTAssert([_environment.urlScheme isEqualToString:expectedUrlScheme], @"EXEnvironment should adopt url scheme %@ when configured", expectedUrlScheme);
35  XCTAssert([_environment.embeddedBundleUrl isEqualToString:expectedEmbeddedManifest[@"bundleUrl"]], @"EXEnvironment should adopt the bundle url specified in the embedded manifest");
36}
37
38- (void)testIsDevDetachConfigRespected
39{
40  [EXEnvironmentMocks loadDevDetachConfig];
41  NSString *expectedUrl = [EXEnvironmentMocks expoKitDevUrl];
42  NSString *expectedUrlScheme = [EXEnvironmentMocks prodUrlScheme];
43  NSDictionary *expectedEmbeddedManifest = [EXEnvironmentMocks embeddedManifest];
44  XCTAssert(_environment.isDetached, @"EXEnvironment should indicate isDetached == true when a dev detach config is provided");
45  XCTAssert([_environment.standaloneManifestUrl isEqualToString:expectedUrl], @"EXEnvironment should adopt the local dev url when a dev detach config is provided");
46  XCTAssert([_environment.releaseChannel isEqualToString:@"default"], @"EXEnvironment should use default release channel when a dev detach config is provided");
47  XCTAssert([_environment.urlScheme isEqualToString:expectedUrlScheme], @"EXEnvironment should adopt url scheme %@ when configured", expectedUrlScheme);
48  XCTAssert([_environment.embeddedBundleUrl isEqualToString:expectedEmbeddedManifest[@"bundleUrl"]], @"EXEnvironment should adopt the bundle url specified in the embedded manifest");
49}
50
51- (void)testIsAllManifestUrlsPropertyCorrect
52{
53  [EXEnvironmentMocks loadProdServiceConfig];
54  NSString *expectedProdUrl = [EXEnvironmentMocks shellConfig][@"manifestUrl"];
55  XCTAssert(_environment.allManifestUrls.count == 1, @"Service standalone app should only have one manifest url");
56  XCTAssert([_environment.allManifestUrls.firstObject isEqualToString:expectedProdUrl], @"Service standalone app's `allManifestUrls` should contain the prod manifest url");
57
58  [EXEnvironmentMocks loadDevDetachConfig];
59  NSString *expectedDevUrl = [EXEnvironmentMocks expoKitDevUrl];
60  XCTAssert(_environment.allManifestUrls.count == 2, @"Dev detached app should have one local, and one prod, manifest url");
61  XCTAssert([_environment.allManifestUrls containsObject:expectedProdUrl], @"Dev detached app's `allManifestUrls` should contain the prod manifest url");
62  XCTAssert([_environment.allManifestUrls containsObject:expectedDevUrl], @"Dev detached app's `allManifestUrls` should contain the dev manifest url");
63}
64
65- (void)testDoesMissingDevDetachUrlThrow
66{
67  // local dev detach with nil dev url
68  XCTAssertThrows(
69                  [_environment _loadShellConfig:[EXEnvironmentMocks shellConfig]
70                                   withInfoPlist:[EXEnvironmentMocks infoPlist]
71                               withExpoKitDevUrl:nil
72                            withEmbeddedManifest:[EXEnvironmentMocks embeddedManifest]
73                                      isDetached:YES
74                              isDebugXCodeScheme:YES
75                                    isUserDetach:YES]
76                  , @"Configuring EXEnvironment as a local detached project in Debug mode should throw if no development url is provided");
77}
78
79- (void)testDoesProdDetachUseProdUrl
80{
81  NSDictionary *expectedShellConfig = [EXEnvironmentMocks shellConfig];
82  [_environment _loadShellConfig:expectedShellConfig
83                   withInfoPlist:[EXEnvironmentMocks infoPlist]
84               withExpoKitDevUrl:[EXEnvironmentMocks expoKitDevUrl]
85            withEmbeddedManifest:[EXEnvironmentMocks embeddedManifest]
86                      isDetached:YES
87              isDebugXCodeScheme:NO
88                    isUserDetach:YES];
89  XCTAssert([_environment.standaloneManifestUrl isEqualToString:expectedShellConfig[@"manifestUrl"]], @"EXEnvironment should ignore the ExpoKit dev url when using a prod build scheme");
90}
91
92- (void)testDoesDefaultConfigRespectXcodeScheme
93{
94  [_environment _loadDefaultConfig];
95#if DEBUG
96  XCTAssert(_environment.isDebugXCodeScheme, @"Default EXEnvironment config should respect Debug Xcode scheme");
97#else
98  XCTAssert(!(_environment.isDebugXCodeScheme), @"Default EXEnvironment config should respect Release Xcode scheme");
99#endif
100}
101
102@end
103
104