SignUpNewUserTests.swift 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
  18. class SignUpNewUserTests: RPCBaseTests {
  19. private let kEmailKey = "email"
  20. private let kTestEmail = "testgmail.com"
  21. private let kDisplayNameKey = "displayName"
  22. private let kTestDisplayName = "DisplayName"
  23. private let kPasswordKey = "password"
  24. private let kTestPassword = "Password"
  25. private let kReturnSecureTokenKey = "returnSecureToken"
  26. private let kExpectedAPIURL =
  27. "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=APIKey"
  28. /** @fn testSignUpNewUserRequestAnonymous
  29. @brief Tests the encoding of a sign up new user request when user is signed in anonymously.
  30. */
  31. func testSignUpNewUserRequestAnonymous() async throws {
  32. let request = makeSignUpNewUserRequestAnonymous()
  33. request.returnSecureToken = false
  34. try await checkRequest(
  35. request: request,
  36. expected: kExpectedAPIURL,
  37. key: kEmailKey,
  38. value: nil
  39. )
  40. let requestDictionary = try XCTUnwrap(rpcIssuer.decodedRequest as? [String: AnyHashable])
  41. XCTAssertNil(requestDictionary[kDisplayNameKey])
  42. XCTAssertNil(requestDictionary[kPasswordKey])
  43. XCTAssertNil(requestDictionary[kReturnSecureTokenKey])
  44. }
  45. /** @fn testSignUpNewUserRequestNotAnonymous
  46. @brief Tests the encoding of a sign up new user request when user is not signed in anonymously.
  47. */
  48. func testSignUpNewUserRequestNotAnonymous() async throws {
  49. let request = makeSignUpNewUserRequest()
  50. try await checkRequest(
  51. request: request,
  52. expected: kExpectedAPIURL,
  53. key: kEmailKey,
  54. value: kTestEmail
  55. )
  56. let requestDictionary = try XCTUnwrap(rpcIssuer.decodedRequest as? [String: AnyHashable])
  57. XCTAssertEqual(requestDictionary[kDisplayNameKey], kTestDisplayName)
  58. XCTAssertEqual(requestDictionary[kPasswordKey], kTestPassword)
  59. XCTAssertTrue(try XCTUnwrap(requestDictionary[kReturnSecureTokenKey] as? Bool))
  60. }
  61. /** @fn testSuccessfulSignUp
  62. @brief This test simulates a complete sign up flow with no errors.
  63. */
  64. func testSuccessfulSignUp() async throws {
  65. let kIDTokenKey = "idToken"
  66. let kTestIDToken = "ID_TOKEN"
  67. let kTestExpiresIn = "12345"
  68. let kTestRefreshToken = "REFRESH_TOKEN"
  69. let kExpiresInKey = "expiresIn"
  70. let kRefreshTokenKey = "refreshToken"
  71. rpcIssuer?.respondBlock = {
  72. try self.rpcIssuer?.respond(withJSON: [
  73. kIDTokenKey: kTestIDToken,
  74. kExpiresInKey: kTestExpiresIn,
  75. kRefreshTokenKey: kTestRefreshToken,
  76. ])
  77. }
  78. let rpcResponse = try await AuthBackend.call(with: makeSignUpNewUserRequest())
  79. XCTAssertEqual(rpcResponse.refreshToken, kTestRefreshToken)
  80. let expiresIn = try XCTUnwrap(rpcResponse.approximateExpirationDate?.timeIntervalSinceNow)
  81. XCTAssertEqual(expiresIn, 12345, accuracy: 0.1)
  82. }
  83. func testSignUpNewUserRequestErrors() async throws {
  84. let kEmailAlreadyInUseErrorMessage = "EMAIL_EXISTS"
  85. let kEmailSignUpNotAllowedErrorMessage = "OPERATION_NOT_ALLOWED"
  86. let kPasswordLoginDisabledErrorMessage = "PASSWORD_LOGIN_DISABLED:"
  87. let kInvalidEmailErrorMessage = "INVALID_EMAIL"
  88. let kWeakPasswordErrorMessage = "WEAK_PASSWORD : Password should be at least 6 characters"
  89. let kWeakPasswordClientErrorMessage = "Password should be at least 6 characters"
  90. try await checkBackendError(
  91. request: makeSignUpNewUserRequest(),
  92. message: kEmailAlreadyInUseErrorMessage,
  93. errorCode: AuthErrorCode.emailAlreadyInUse
  94. )
  95. try await checkBackendError(
  96. request: makeSignUpNewUserRequest(),
  97. message: kEmailSignUpNotAllowedErrorMessage,
  98. errorCode: AuthErrorCode.operationNotAllowed
  99. )
  100. try await checkBackendError(
  101. request: makeSignUpNewUserRequest(),
  102. message: kPasswordLoginDisabledErrorMessage,
  103. errorCode: AuthErrorCode.operationNotAllowed
  104. )
  105. try await checkBackendError(
  106. request: makeSignUpNewUserRequest(),
  107. message: kInvalidEmailErrorMessage,
  108. errorCode: AuthErrorCode.invalidEmail
  109. )
  110. try await checkBackendError(
  111. request: makeSignUpNewUserRequest(),
  112. message: kWeakPasswordErrorMessage,
  113. errorCode: AuthErrorCode.weakPassword,
  114. errorReason: kWeakPasswordClientErrorMessage
  115. )
  116. }
  117. /** @fn testSignUpNewUserRequestOptionalFields
  118. @brief Tests the encoding of a sign up new user request with optional fields.
  119. */
  120. func testSignUpNewUserRequestOptionalFields() async throws {
  121. let kEmailKey = "email"
  122. let kPasswordKey = "password"
  123. let kCaptchaResponseKey = "captchaResponse"
  124. let kTestCaptchaResponse = "testCaptchaResponse"
  125. let kClientTypeKey = "clientType"
  126. let kTestClientType = "testClientType"
  127. let kRecaptchaVersionKey = "recaptchaVersion"
  128. let kTestRecaptchaVersion = "testRecaptchaVersion"
  129. let request = makeSignUpNewUserRequest()
  130. request.captchaResponse = kTestCaptchaResponse
  131. request.clientType = kTestClientType
  132. request.recaptchaVersion = kTestRecaptchaVersion
  133. try await checkRequest(
  134. request: request,
  135. expected: kExpectedAPIURL,
  136. key: kEmailKey,
  137. value: kTestEmail
  138. )
  139. let requestDictionary = try XCTUnwrap(rpcIssuer.decodedRequest as? [String: AnyHashable])
  140. XCTAssertEqual(requestDictionary[kDisplayNameKey], kTestDisplayName)
  141. XCTAssertEqual(requestDictionary[kPasswordKey], kTestPassword)
  142. XCTAssertTrue(try XCTUnwrap(requestDictionary[kReturnSecureTokenKey] as? Bool))
  143. XCTAssertEqual(requestDictionary[kCaptchaResponseKey], kTestCaptchaResponse)
  144. XCTAssertEqual(requestDictionary[kClientTypeKey], kTestClientType)
  145. XCTAssertEqual(requestDictionary[kRecaptchaVersionKey], kTestRecaptchaVersion)
  146. }
  147. private func makeSignUpNewUserRequestAnonymous() -> SignUpNewUserRequest {
  148. return SignUpNewUserRequest(requestConfiguration: makeRequestConfiguration())
  149. }
  150. private func makeSignUpNewUserRequest() -> SignUpNewUserRequest {
  151. return SignUpNewUserRequest(email: kTestEmail,
  152. password: kTestPassword,
  153. displayName: kTestDisplayName,
  154. idToken: nil,
  155. requestConfiguration: makeRequestConfiguration())
  156. }
  157. }