1 // Copyright 2021-present 650 Industries. All rights reserved.
2 
3 import XCTest
4 
5 @testable import EXDevLauncher
6 
7 class EXDevLauncherURLHelperTests: XCTestCase {
8 
9   let encodedUrlString = "http%3A%2F%2Flocalhost%3A8081"
10 
testIsDevLauncherURLnull11   func testIsDevLauncherURL() {
12     let defaultUrl = "scheme://expo-development-client"
13     XCTAssertTrue(EXDevLauncherURLHelper.isDevLauncherURL(URL(string: defaultUrl)))
14     XCTAssertTrue(EXDevLauncherURLHelper.isDevLauncherURL(URL(string: defaultUrl + "?url=123")))
15     XCTAssertTrue(EXDevLauncherURLHelper.isDevLauncherURL(URL(string: "scheme://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081")))
16     XCTAssertFalse(EXDevLauncherURLHelper.isDevLauncherURL(URL(string: "scheme://not-expo-development-client")))
17   }
18 
testReplaceEXPSchemenull19   func testReplaceEXPScheme() {
20     let actual1 = EXDevLauncherURLHelper.replaceEXPScheme(URL(string: "exp://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081")!, to: "scheme")
21     XCTAssertEqual(URL(string: "scheme://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081"), actual1)
22 
23     let actual2 = EXDevLauncherURLHelper.replaceEXPScheme(URL(string: "http://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081")!, to: "scheme")
24     XCTAssertEqual(URL(string: "http://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081"), actual2)
25 
26     // should not crash if provided URL does not include scheme
27     let actual3 = EXDevLauncherURLHelper.replaceEXPScheme(URL(string: "192.168.0.12:8081")!, to: "scheme")
28     XCTAssertEqual(URL(string: "192.168.0.12:8081"), actual3)
29   }
30 
testDevLauncherUrlsnull31   func testDevLauncherUrls() {
32     // dev-client scheme with valid url param -> loadApp with specified url param
33     expectDevLauncherUrlToEqual(input:"scheme://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081%2Findex.bundle%3Fplatform%3Dios%26dev%3Dtrue",
34                          expected:"http://localhost:8081/index.bundle?platform=ios&dev=true")
35 
36     // non-dev-client scheme with valid url param -> defer loading to loaded app
37     expectDevLauncherUrlToEqual(input: "scheme://not-dev-client/?url=\(encodedUrlString)",
38                                 expected: "scheme://not-dev-client/?url=\(encodedUrlString)")
39 
40   }
41 
testDevLauncherUrlQueryParamsnull42   func testDevLauncherUrlQueryParams() {
43     let url = "scheme://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081&updateMessage=123"
44     let devLauncherUrl = EXDevLauncherUrl(URL(string:url)!)
45     let queryParams = devLauncherUrl.queryParams
46 
47     XCTAssertEqual(queryParams["updateMessage"], "123")
48     XCTAssertEqual(queryParams["url"], "http://localhost:8081")
49   }
50 
51   //  HELPER
expectDevLauncherUrlToEqualnull52   func expectDevLauncherUrlToEqual(input: String, expected: String) {
53     let devLauncherUrl = EXDevLauncherUrl(URL(string:input)!)
54     XCTAssertEqual(devLauncherUrl.url.absoluteString, expected)
55   }
56 }
57