| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482 |
- // Copyright 2021 Google LLC
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- import Foundation
- import FirebaseFunctions
- import FirebaseFunctionsTestingSupport
- import XCTest
- /// This file was intitialized as a direct port of the Objective C
- /// FirebaseFunctions/Tests/Integration/FIRIntegrationTests.m
- ///
- /// The tests require the emulator to be running with `FirebaseFunctions/Backend/start.sh synchronous`
- /// The Firebase Functions called in the tests are implemented in `FirebaseFunctions/Backend/index.js`.
- class IntegrationTests: XCTestCase {
- let functions = FunctionsFake(
- projectID: "functions-integration-test",
- region: "us-central1",
- customDomain: nil,
- withToken: nil
- )
- let projectID = "functions-swift-integration-test"
- override func setUp() {
- super.setUp()
- functions.useLocalhost()
- }
- func testData() {
- let expectation = expectation(description: #function)
- let data = [
- "bool": true,
- "int": 2 as Int32,
- "long": 9_876_543_210,
- "string": "four",
- "array": [5 as Int32, 6 as Int32],
- "null": nil,
- ] as [String: Any?]
- let function = functions.httpsCallable("dataTest")
- XCTAssertNotNil(function)
- function.call(data) { result, error in
- do {
- XCTAssertNil(error)
- let data = try XCTUnwrap(result?.data as? [String: Any])
- let message = try XCTUnwrap(data["message"] as? String)
- let long = try XCTUnwrap(data["long"] as? Int64)
- let code = try XCTUnwrap(data["code"] as? Int32)
- XCTAssertEqual(message, "stub response")
- XCTAssertEqual(long, 420)
- XCTAssertEqual(code, 42)
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testDataAsync() async throws {
- let input = [
- "bool": true,
- "int": 2 as Int32,
- "long": 9_876_543_210,
- "string": "four",
- "array": [5 as Int32, 6 as Int32],
- "null": nil,
- ] as [String: Any?]
- let function = functions.httpsCallable("dataTest")
- XCTAssertNotNil(function)
- let result = try await function.call(input)
- let data = try XCTUnwrap(result.data as? [String: Any])
- let message = try XCTUnwrap(data["message"] as? String)
- let long = try XCTUnwrap(data["long"] as? Int64)
- let code = try XCTUnwrap(data["code"] as? Int32)
- XCTAssertEqual(message, "stub response")
- XCTAssertEqual(long, 420)
- XCTAssertEqual(code, 42)
- }
- #endif
- func testScalar() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("scalarTest")
- XCTAssertNotNil(function)
- function.call(17 as Int16) { result, error in
- do {
- XCTAssertNil(error)
- let data = try XCTUnwrap(result?.data as? Int)
- XCTAssertEqual(data, 76)
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testScalarAsync() async throws {
- let function = functions.httpsCallable("scalarTest")
- XCTAssertNotNil(function)
- let result = try await function.call(17 as Int16)
- let data = try XCTUnwrap(result.data as? Int)
- XCTAssertEqual(data, 76)
- }
- #endif
- func testToken() {
- // Recreate functions with a token.
- let functions = FunctionsFake(
- projectID: "functions-integration-test",
- region: "us-central1",
- customDomain: nil,
- withToken: "token"
- )
- functions.useLocalhost()
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("FCMTokenTest")
- XCTAssertNotNil(function)
- function.call([:]) { result, error in
- do {
- XCTAssertNil(error)
- let data = try XCTUnwrap(result?.data) as? [String: Int]
- XCTAssertEqual(data, [:])
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testTokenAsync() async throws {
- // Recreate functions with a token.
- let functions = FunctionsFake(
- projectID: "functions-integration-test",
- region: "us-central1",
- customDomain: nil,
- withToken: "token"
- )
- functions.useLocalhost()
- let function = functions.httpsCallable("FCMTokenTest")
- XCTAssertNotNil(function)
- let result = try await function.call([:])
- let data = try XCTUnwrap(result.data) as? [String: Int]
- XCTAssertEqual(data, [:])
- }
- #endif
- func testFCMToken() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("FCMTokenTest")
- XCTAssertNotNil(function)
- function.call([:]) { result, error in
- do {
- XCTAssertNil(error)
- let data = try XCTUnwrap(result?.data) as? [String: Int]
- XCTAssertEqual(data, [:])
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testFCMTokenAsync() async throws {
- let function = functions.httpsCallable("FCMTokenTest")
- XCTAssertNotNil(function)
- let result = try await function.call([:])
- let data = try XCTUnwrap(result.data) as? [String: Int]
- XCTAssertEqual(data, [:])
- }
- #endif
- func testNull() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("nullTest")
- XCTAssertNotNil(function)
- function.call(nil) { result, error in
- do {
- XCTAssertNil(error)
- let data = try XCTUnwrap(result?.data) as? NSNull
- XCTAssertEqual(data, NSNull())
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testNullAsync() async throws {
- let function = functions.httpsCallable("nullTest")
- XCTAssertNotNil(function)
- let result = try await function.call(nil)
- let data = try XCTUnwrap(result.data) as? NSNull
- XCTAssertEqual(data, NSNull())
- }
- #endif
- // No parameters to call should be the same as passing nil.
- func testParameterless() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("nullTest")
- XCTAssertNotNil(function)
- function.call { result, error in
- do {
- XCTAssertNil(error)
- let data = try XCTUnwrap(result?.data) as? NSNull
- XCTAssertEqual(data, NSNull())
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testParameterlessAsync() async throws {
- let function = functions.httpsCallable("nullTest")
- XCTAssertNotNil(function)
- let result = try await function.call()
- let data = try XCTUnwrap(result.data) as? NSNull
- XCTAssertEqual(data, NSNull())
- }
- #endif
- func testMissingResult() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("missingResultTest")
- XCTAssertNotNil(function)
- function.call(nil) { result, error in
- do {
- XCTAssertNotNil(error)
- let error = try XCTUnwrap(error) as NSError
- XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
- XCTAssertEqual("Response is missing data field.", error.localizedDescription)
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- XCTAssert(true)
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testMissingResultAsync() async throws {
- let function = functions.httpsCallable("missingResultTest")
- XCTAssertNotNil(function)
- do {
- _ = try await function.call(nil)
- } catch {
- let error = try XCTUnwrap(error) as NSError
- XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
- XCTAssertEqual("Response is missing data field.", error.localizedDescription)
- return
- }
- XCTAssertFalse(true, "Failed to throw error for missing result")
- }
- #endif
- func testUnhandledError() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("unhandledErrorTest")
- XCTAssertNotNil(function)
- function.call([]) { result, error in
- do {
- XCTAssertNotNil(error)
- let error = try XCTUnwrap(error! as NSError)
- XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
- XCTAssertEqual("INTERNAL", error.localizedDescription)
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- XCTAssert(true)
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testUnhandledErrorAsync() async throws {
- let function = functions.httpsCallable("unhandledErrorTest")
- XCTAssertNotNil(function)
- do {
- _ = try await function.call([])
- } catch {
- let error = try XCTUnwrap(error) as NSError
- XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
- XCTAssertEqual("INTERNAL", error.localizedDescription)
- return
- }
- XCTAssertFalse(true, "Failed to throw error for missing result")
- }
- #endif
- func testUnknownError() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("unknownErrorTest")
- XCTAssertNotNil(function)
- function.call([]) { result, error in
- do {
- XCTAssertNotNil(error)
- let error = try XCTUnwrap(error! as NSError)
- XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
- XCTAssertEqual("INTERNAL", error.localizedDescription)
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- XCTAssert(true)
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testUnknownErrorAsync() async throws {
- let function = functions.httpsCallable("unknownErrorTest")
- XCTAssertNotNil(function)
- do {
- _ = try await function.call([])
- } catch {
- let error = try XCTUnwrap(error) as NSError
- XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
- XCTAssertEqual("INTERNAL", error.localizedDescription)
- return
- }
- XCTAssertFalse(true, "Failed to throw error for missing result")
- }
- #endif
- func testExplicitError() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("explicitErrorTest")
- XCTAssertNotNil(function)
- function.call([]) { result, error in
- do {
- XCTAssertNotNil(error)
- let error = try XCTUnwrap(error! as NSError)
- XCTAssertEqual(FunctionsErrorCode.outOfRange.rawValue, error.code)
- XCTAssertEqual("explicit nope", error.localizedDescription)
- XCTAssertEqual(["start": 10 as Int32, "end": 20 as Int32, "long": 30],
- error.userInfo[FunctionsErrorDetailsKey] as! [String: Int32])
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- XCTAssert(true)
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testExplicitErrorAsync() async throws {
- let function = functions.httpsCallable("explicitErrorTest")
- XCTAssertNotNil(function)
- do {
- _ = try await function.call([])
- } catch {
- let error = try XCTUnwrap(error) as NSError
- XCTAssertEqual(FunctionsErrorCode.outOfRange.rawValue, error.code)
- XCTAssertEqual("explicit nope", error.localizedDescription)
- XCTAssertEqual(["start": 10 as Int32, "end": 20 as Int32, "long": 30],
- error.userInfo[FunctionsErrorDetailsKey] as! [String: Int32])
- return
- }
- XCTAssertFalse(true, "Failed to throw error for missing result")
- }
- #endif
- func testHttpError() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("httpErrorTest")
- XCTAssertNotNil(function)
- function.call([]) { result, error in
- do {
- XCTAssertNotNil(error)
- let error = try XCTUnwrap(error! as NSError)
- XCTAssertEqual(FunctionsErrorCode.invalidArgument.rawValue, error.code)
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- XCTAssert(true)
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testHttpErrorAsync() async throws {
- let function = functions.httpsCallable("httpErrorTest")
- XCTAssertNotNil(function)
- do {
- _ = try await function.call([])
- } catch {
- let error = try XCTUnwrap(error) as NSError
- XCTAssertEqual(FunctionsErrorCode.invalidArgument.rawValue, error.code)
- return
- }
- XCTAssertFalse(true, "Failed to throw error for missing result")
- }
- #endif
- func testTimeout() {
- let expectation = expectation(description: #function)
- let function = functions.httpsCallable("timeoutTest")
- XCTAssertNotNil(function)
- function.timeoutInterval = 0.05
- function.call([]) { result, error in
- do {
- XCTAssertNotNil(error)
- let error = try XCTUnwrap(error! as NSError)
- XCTAssertEqual(FunctionsErrorCode.deadlineExceeded.rawValue, error.code)
- XCTAssertEqual("DEADLINE EXCEEDED", error.localizedDescription)
- XCTAssertNil(error.userInfo[FunctionsErrorDetailsKey])
- expectation.fulfill()
- } catch {
- XCTAssert(false, "Failed to unwrap the function result: \(error)")
- }
- }
- XCTAssert(true)
- waitForExpectations(timeout: 5)
- }
- #if compiler(>=5.5) && canImport(_Concurrency)
- @available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
- func testTimeoutAsync() async throws {
- let function = functions.httpsCallable("timeoutTest")
- XCTAssertNotNil(function)
- function.timeoutInterval = 0.05
- do {
- _ = try await function.call([])
- } catch {
- let error = try XCTUnwrap(error) as NSError
- XCTAssertEqual(FunctionsErrorCode.deadlineExceeded.rawValue, error.code)
- XCTAssertEqual("DEADLINE EXCEEDED", error.localizedDescription)
- XCTAssertNil(error.userInfo[FunctionsErrorDetailsKey])
- return
- }
- XCTAssertFalse(true, "Failed to throw error for missing result")
- }
- #endif
- }
|