SignUpNewUserTests.swift 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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() throws {
  32. let request = makeSignUpNewUserRequestAnonymous()
  33. request.returnSecureToken = false
  34. let issuer = try checkRequest(
  35. request: request,
  36. expected: kExpectedAPIURL,
  37. key: kEmailKey,
  38. value: nil
  39. )
  40. let requestDictionary = try XCTUnwrap(issuer.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() throws {
  49. let request = makeSignUpNewUserRequest()
  50. let issuer = try checkRequest(
  51. request: request,
  52. expected: kExpectedAPIURL,
  53. key: kEmailKey,
  54. value: kTestEmail
  55. )
  56. let requestDictionary = try XCTUnwrap(issuer.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() 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. var callbackInvoked = false
  72. var rpcResponse: SignUpNewUserResponse?
  73. var rpcError: NSError?
  74. AuthBackend.post(with: makeSignUpNewUserRequest()) { response, error in
  75. callbackInvoked = true
  76. rpcResponse = response
  77. rpcError = error as? NSError
  78. }
  79. _ = try rpcIssuer?.respond(withJSON: [
  80. kIDTokenKey: kTestIDToken,
  81. kExpiresInKey: kTestExpiresIn,
  82. kRefreshTokenKey: kTestRefreshToken,
  83. ])
  84. XCTAssert(callbackInvoked)
  85. XCTAssertNil(rpcError)
  86. XCTAssertEqual(rpcResponse?.refreshToken, kTestRefreshToken)
  87. let expiresIn = try XCTUnwrap(rpcResponse?.approximateExpirationDate?.timeIntervalSinceNow)
  88. XCTAssertEqual(expiresIn, 12345, accuracy: 0.1)
  89. }
  90. func testSignUpNewUserRequestErrors() throws {
  91. let kEmailAlreadyInUseErrorMessage = "EMAIL_EXISTS"
  92. let kEmailSignUpNotAllowedErrorMessage = "OPERATION_NOT_ALLOWED"
  93. let kPasswordLoginDisabledErrorMessage = "PASSWORD_LOGIN_DISABLED:"
  94. let kInvalidEmailErrorMessage = "INVALID_EMAIL"
  95. let kWeakPasswordErrorMessage = "WEAK_PASSWORD : Password should be at least 6 characters"
  96. let kWeakPasswordClientErrorMessage = "Password should be at least 6 characters"
  97. try checkBackendError(
  98. request: makeSignUpNewUserRequest(),
  99. message: kEmailAlreadyInUseErrorMessage,
  100. errorCode: AuthErrorCode.emailAlreadyInUse
  101. )
  102. try checkBackendError(
  103. request: makeSignUpNewUserRequest(),
  104. message: kEmailSignUpNotAllowedErrorMessage,
  105. errorCode: AuthErrorCode.operationNotAllowed
  106. )
  107. try checkBackendError(
  108. request: makeSignUpNewUserRequest(),
  109. message: kPasswordLoginDisabledErrorMessage,
  110. errorCode: AuthErrorCode.operationNotAllowed
  111. )
  112. try checkBackendError(
  113. request: makeSignUpNewUserRequest(),
  114. message: kInvalidEmailErrorMessage,
  115. errorCode: AuthErrorCode.invalidEmail
  116. )
  117. try checkBackendError(
  118. request: makeSignUpNewUserRequest(),
  119. message: kWeakPasswordErrorMessage,
  120. errorCode: AuthErrorCode.weakPassword,
  121. errorReason: kWeakPasswordClientErrorMessage
  122. )
  123. }
  124. private func makeSignUpNewUserRequestAnonymous() -> SignUpNewUserRequest {
  125. return SignUpNewUserRequest(requestConfiguration: makeRequestConfiguration())
  126. }
  127. private func makeSignUpNewUserRequest() -> SignUpNewUserRequest {
  128. return SignUpNewUserRequest(email: kTestEmail,
  129. password: kTestPassword,
  130. displayName: kTestDisplayName,
  131. requestConfiguration: makeRequestConfiguration())
  132. }
  133. }