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