StartMFAEnrollmentRequestTests.swift 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright 2023 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. import Foundation
  15. import XCTest
  16. @testable import FirebaseAuth
  17. /** @class StartMFAEnrollmentRequestTests
  18. @brief Tests for @c StartMFAEnrollmentRequest
  19. */
  20. @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
  21. class StartMFAEnrollmentRequestTests: RPCBaseTests {
  22. let kAPIKey = "APIKey"
  23. let kIDToken = "idToken"
  24. let kTOTPEnrollmentInfo = "totpEnrollmentInfo"
  25. let kPhoneEnrollmentInfo = "enrollmentInfo"
  26. let kPhoneNumber = "phoneNumber"
  27. let kReCAPTCHAToken = "recaptchaToken"
  28. let kCaptchaResponse = "captchaResponse"
  29. let kRecaptchaVersion = "recaptchaVersion"
  30. /**
  31. @fn testTOTPStartMFAEnrollmentRequest
  32. @brief Tests the Start MFA Enrollment using TOTP request.
  33. */
  34. func testTOTPStartMFAEnrollmentRequest() async throws {
  35. let kIDToken = "idToken"
  36. let kTOTPEnrollmentInfo = "totpEnrollmentInfo"
  37. let kPhoneEnrollmentInfo = "enrollmentInfo"
  38. let requestConfiguration = AuthRequestConfiguration(apiKey: kAPIKey, appID: "appID")
  39. let requestInfo = AuthProtoStartMFATOTPEnrollmentRequestInfo()
  40. let request = StartMFAEnrollmentRequest(idToken: kIDToken,
  41. totpEnrollmentInfo: requestInfo,
  42. requestConfiguration: requestConfiguration)
  43. let expectedURL =
  44. "https://identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start?key=\(kAPIKey)"
  45. do {
  46. try await checkRequest(
  47. request: request,
  48. expected: expectedURL,
  49. key: kIDToken,
  50. value: kIDToken
  51. )
  52. } catch {
  53. // Ignore error from missing users array in fake JSON return.
  54. return
  55. }
  56. let requestDictionary = try XCTUnwrap(rpcIssuer.decodedRequest as? [String: AnyHashable])
  57. let totpInfo = try XCTUnwrap(requestDictionary[kTOTPEnrollmentInfo] as? [String: String])
  58. XCTAssertEqual(totpInfo, [:])
  59. XCTAssertNil(requestDictionary[kPhoneEnrollmentInfo])
  60. }
  61. /**
  62. @fn testPhoneStartMFAEnrollmentRequest
  63. @brief Tests the Start MFA Enrollment using SMS request.
  64. */
  65. func testPhoneStartMFAEnrollmentInjectRecaptchaFields() async throws {
  66. // created a base startMFAEnrollment Request
  67. let testPhoneNumber = "1234567890"
  68. let testRecaptchaToken = "RECAPTCHA_FAKE_TOKEN"
  69. let requestConfiguration = AuthRequestConfiguration(apiKey: kAPIKey, appID: "appID")
  70. let smsEnrollmentInfo = AuthProtoStartMFAPhoneRequestInfo(
  71. phoneNumber: testPhoneNumber,
  72. codeIdentity: CodeIdentity.recaptcha(testRecaptchaToken)
  73. )
  74. let request = StartMFAEnrollmentRequest(idToken: kIDToken,
  75. enrollmentInfo: smsEnrollmentInfo,
  76. requestConfiguration: requestConfiguration)
  77. // inject reCAPTCHA response
  78. let testRecaptchaResponse = "RECAPTCHA_FAKE_RESPONSE"
  79. let testRecaptchaVersion = "RECAPTCHA_FAKE_ENTERPRISE"
  80. request.injectRecaptchaFields(
  81. recaptchaResponse: testRecaptchaResponse,
  82. recaptchaVersion: testRecaptchaVersion
  83. )
  84. let expectedURL =
  85. "https://identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start?key=\(kAPIKey)"
  86. do {
  87. try await checkRequest(
  88. request: request,
  89. expected: expectedURL,
  90. key: kIDToken,
  91. value: kIDToken
  92. )
  93. } catch {
  94. // Ignore error from missing users array in fake JSON return.
  95. return
  96. }
  97. let requestDictionary = try XCTUnwrap(rpcIssuer.decodedRequest as? [String: AnyHashable])
  98. let smsInfo = try XCTUnwrap(requestDictionary["phoneEnrollmentInfo"] as? [String: String])
  99. XCTAssertEqual(smsInfo[kPhoneNumber], testPhoneNumber)
  100. XCTAssertEqual(smsInfo[kReCAPTCHAToken], testRecaptchaToken)
  101. XCTAssertEqual(smsInfo[kRecaptchaVersion], kRecaptchaVersion)
  102. XCTAssertEqual(smsInfo[kCaptchaResponse], testRecaptchaResponse)
  103. XCTAssertNil(requestDictionary[kTOTPEnrollmentInfo])
  104. }
  105. }