| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- // Copyright 2022 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 FirebaseCore
- @testable import FirebaseFunctions
- import FirebaseAppCheckInterop
- import FirebaseAuthInterop
- import FirebaseMessagingInterop
- import SharedTestUtilities
- import XCTest
- class ContextProviderTests: XCTestCase {
- let appCheckFake = FIRAppCheckFake()
- let appCheckTokenError = FIRAppCheckTokenResultFake(token: "dummy token",
- error: NSError(
- domain: "testAppCheckError",
- code: -1,
- userInfo: nil
- ))
- let appCheckLimitedUseTokenError = FIRAppCheckTokenResultFake(token: "limited use token",
- error: NSError(
- domain: "testAppCheckError",
- code: -1,
- userInfo: nil
- ))
- let appCheckTokenSuccess = FIRAppCheckTokenResultFake(token: "valid_token", error: nil)
- let messagingFake = FIRMessagingInteropFake()
- func testAsyncContextWithAuth() async throws {
- let auth = FIRAuthInteropFake(token: "token", userID: "userID", error: nil)
- let provider = FunctionsContextProvider(auth: auth, messaging: messagingFake, appCheck: nil)
- let context = try await provider.context(options: nil)
- XCTAssertNotNil(context)
- XCTAssertEqual(context.authToken, "token")
- XCTAssertEqual(context.fcmToken, messagingFake.fcmToken)
- }
- func testContextWithAuth() async throws {
- let auth = FIRAuthInteropFake(token: "token", userID: "userID", error: nil)
- let provider = FunctionsContextProvider(auth: auth, messaging: messagingFake, appCheck: nil)
- let context = try await provider.context(options: nil)
- XCTAssertEqual(context.authToken, "token")
- XCTAssertEqual(context.fcmToken, messagingFake.fcmToken)
- }
- func testAsyncContextWithAuthError() async {
- let authError = NSError(domain: "com.functions.tests", code: 4, userInfo: nil)
- let auth = FIRAuthInteropFake(token: nil, userID: "userID", error: authError)
- let provider = FunctionsContextProvider(auth: auth, messaging: messagingFake, appCheck: nil)
- do {
- _ = try await provider.context(options: nil)
- XCTFail("Expected an error")
- } catch {
- XCTAssertEqual(error as NSError, authError)
- }
- }
- func testContextWithAuthError() async throws {
- let authError = NSError(domain: "com.functions.tests", code: 4, userInfo: nil)
- let auth = FIRAuthInteropFake(token: nil, userID: "userID", error: authError)
- let provider = FunctionsContextProvider(auth: auth, messaging: messagingFake, appCheck: nil)
- do {
- _ = try await provider.context(options: nil)
- XCTFail("Expected an error")
- } catch {
- XCTAssertEqual(error as NSError?, authError)
- }
- }
- func testAsyncContextWithoutAuth() async throws {
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: nil)
- let context = try await provider.context(options: nil)
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- }
- func testContextWithoutAuth() async throws {
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: nil)
- let context = try await provider.context(options: nil)
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- }
- func testAsyncContextWithAppCheckOnlySuccess() async throws {
- appCheckFake.tokenResult = appCheckTokenSuccess
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: appCheckFake)
- let context = try await provider.context(options: nil)
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- XCTAssertEqual(context.appCheckToken, appCheckTokenSuccess.token)
- }
- func testContextWithAppCheckOnlySuccess() async throws {
- appCheckFake.tokenResult = appCheckTokenSuccess
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: appCheckFake)
- let context = try await provider.context(options: nil)
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- XCTAssertEqual(context.appCheckToken, appCheckTokenSuccess.token)
- }
- func testAsyncContextWithAppCheckOnlyError() async throws {
- appCheckFake.tokenResult = appCheckTokenError
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: appCheckFake)
- let context = try await provider.context(options: nil)
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- // Expect placeholder token in the case of App Check error.
- XCTAssertEqual(context.appCheckToken, appCheckFake.tokenResult.token)
- }
- func testAsyncContextWithAppCheckOnlyError_LimitedUseToken() async throws {
- appCheckFake.limitedUseTokenResult = appCheckLimitedUseTokenError
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: appCheckFake)
- let context = try await provider.context(options: .init(requireLimitedUseAppCheckTokens: true))
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- // Expect placeholder token in the case of App Check error.
- XCTAssertEqual(context.limitedUseAppCheckToken, appCheckFake.limitedUseTokenResult.token)
- }
- func testContextWithAppCheckOnlyError() async throws {
- appCheckFake.tokenResult = appCheckTokenError
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: appCheckFake)
- let context = try await provider.context(options: nil)
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- // Expect placeholder token in the case of App Check error.
- XCTAssertEqual(context.appCheckToken, appCheckFake.tokenResult.token)
- }
- func testContextWithAppCheckOnlyError_LimitedUseToken() async throws {
- appCheckFake.limitedUseTokenResult = appCheckLimitedUseTokenError
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: appCheckFake)
- let context = try await provider
- .context(options: HTTPSCallableOptions(requireLimitedUseAppCheckTokens: true))
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- // Expect placeholder token in the case of App Check error.
- XCTAssertEqual(context.limitedUseAppCheckToken, appCheckFake.limitedUseTokenResult.token)
- }
- func testAsyncContextWithAppCheckWithoutOptionalMethods() async throws {
- let appCheck = AppCheckFakeWithoutOptionalMethods(tokenResult: appCheckTokenSuccess)
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: appCheck)
- let context = try await provider.context(options: .init(requireLimitedUseAppCheckTokens: true))
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- XCTAssertNil(context.appCheckToken)
- // If the method for limited-use tokens is not implemented, the value should be `nil`:
- XCTAssertNil(context.limitedUseAppCheckToken)
- }
- func testContextWithAppCheckWithoutOptionalMethods() async throws {
- let appCheck = AppCheckFakeWithoutOptionalMethods(tokenResult: appCheckTokenSuccess)
- let provider = FunctionsContextProvider(auth: nil, messaging: nil, appCheck: appCheck)
- let context = try await provider.context(options: .init(requireLimitedUseAppCheckTokens: true))
- XCTAssertNil(context.authToken)
- XCTAssertNil(context.fcmToken)
- XCTAssertNil(context.appCheckToken)
- // If the method for limited-use tokens is not implemented, the value should be `nil`:
- XCTAssertNil(context.limitedUseAppCheckToken)
- }
- func testAsyncAllContextsAvailableSuccess() async throws {
- appCheckFake.tokenResult = appCheckTokenSuccess
- let auth = FIRAuthInteropFake(token: "token", userID: "userID", error: nil)
- let provider = FunctionsContextProvider(
- auth: auth,
- messaging: messagingFake,
- appCheck: appCheckFake
- )
- let context = try await provider.context(options: nil)
- XCTAssertEqual(context.authToken, "token")
- XCTAssertEqual(context.fcmToken, messagingFake.fcmToken)
- XCTAssertEqual(context.appCheckToken, appCheckTokenSuccess.token)
- }
- func testAllContextsAvailableSuccess() async throws {
- appCheckFake.tokenResult = appCheckTokenSuccess
- let auth = FIRAuthInteropFake(token: "token", userID: "userID", error: nil)
- let provider = FunctionsContextProvider(
- auth: auth,
- messaging: messagingFake,
- appCheck: appCheckFake
- )
- let context = try await provider.context(options: nil)
- XCTAssertEqual(context.authToken, "token")
- XCTAssertEqual(context.fcmToken, messagingFake.fcmToken)
- XCTAssertEqual(context.appCheckToken, appCheckTokenSuccess.token)
- }
- func testAsyncAllContextsAuthAndAppCheckError() async {
- appCheckFake.tokenResult = appCheckTokenError
- let authError = NSError(domain: "com.functions.tests", code: 4, userInfo: nil)
- let auth = FIRAuthInteropFake(token: nil, userID: "userID", error: authError)
- let provider = FunctionsContextProvider(
- auth: auth,
- messaging: messagingFake,
- appCheck: appCheckFake
- )
- do {
- _ = try await provider.context(options: nil)
- XCTFail("Expected an error")
- } catch {
- XCTAssertEqual(error as NSError, authError)
- }
- }
- func testAllContextsAuthAndAppCheckError() async throws {
- appCheckFake.tokenResult = appCheckTokenError
- let authError = NSError(domain: "com.functions.tests", code: 4, userInfo: nil)
- let auth = FIRAuthInteropFake(token: nil, userID: "userID", error: authError)
- let provider = FunctionsContextProvider(
- auth: auth,
- messaging: messagingFake,
- appCheck: appCheckFake
- )
- do {
- _ = try await provider.context(options: nil)
- XCTFail("Expected an error")
- } catch {
- XCTAssertEqual(error as NSError?, authError)
- }
- }
- func testAllContextsAuthAndAppCheckError_LimitedUseToken() async throws {
- appCheckFake.limitedUseTokenResult = appCheckLimitedUseTokenError
- let authError = NSError(domain: "com.functions.tests", code: 4, userInfo: nil)
- let auth = FIRAuthInteropFake(token: nil, userID: "userID", error: authError)
- let provider = FunctionsContextProvider(
- auth: auth,
- messaging: messagingFake,
- appCheck: appCheckFake
- )
- do {
- _ = try await provider.context(options: .init(requireLimitedUseAppCheckTokens: true))
- XCTFail("Expected an error")
- } catch {
- XCTAssertEqual(error as NSError?, authError)
- }
- }
- }
- // MARK: - Utilities
- private class AppCheckFakeWithoutOptionalMethods: NSObject, AppCheckInterop {
- let tokenResult: FIRAppCheckTokenResultInterop
- init(tokenResult: FIRAppCheckTokenResultInterop) {
- self.tokenResult = tokenResult
- }
- func getToken(forcingRefresh: Bool, completion handler: @escaping AppCheckTokenHandlerInterop) {
- handler(tokenResult)
- }
- func tokenDidChangeNotificationName() -> String { "AppCheckFakeTokenDidChangeNotification" }
- func notificationTokenKey() -> String { "AppCheckFakeTokenNotificationKey" }
- func notificationAppNameKey() -> String { "AppCheckFakeAppNameNotificationKey" }
- }
|