| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /*
- * Copyright 2019 Google
- *
- * 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 XCTest
- let kNoSecondFactorUserEmail = "iosapitests+no_second_factor@gmail.com"
- let kNoSecondFactorUserPassword = "aaaaaa"
- let kPhoneSecondFactorPhoneNumber = "+16509999999"
- let kPhoneSecondFactorVerificationCode = "123456"
- let kPhoneSecondFactorDisplayName = "phone1"
- let kOneSecondFactorUserEmail = "iosapitests+one_phone_second_factor@gmail.com"
- let kOneSecondFactorUserPassword = "aaaaaa"
- class PhoneMultiFactorTests: FIRAuthApiTestsBase {
- func testEnrollUnenroll() {
- let enrollExpectation = expectation(description: "Enroll phone multi factor finished.")
- let unenrollExpectation = expectation(description: "Unenroll phone multi factor finished.")
- Auth.auth().signIn(withEmail: kNoSecondFactorUserEmail, password: kNoSecondFactorUserPassword) { result, error in
- XCTAssertNil(error, "User normal sign in failed. Error: \(error!.localizedDescription)")
- // Enroll
- guard let user = result?.user else {
- XCTFail("No valid user after attempted sign-in.")
- }
- user.multiFactor.getSessionWithCompletion { session, error in
- XCTAssertNil(error, "Get multi factor session failed. Error: \(error!.localizedDescription)")
- PhoneAuthProvider.provider().verifyPhoneNumber(
- kPhoneSecondFactorPhoneNumber,
- uiDelegate: nil,
- multiFactorSession: session
- ) { verificationId, error in
- XCTAssertNil(error, "Verify phone number failed. Error: \(error!.localizedDescription)")
- let credential = PhoneAuthProvider.provider().credential(
- withVerificationID: verificationId!,
- verificationCode: kPhoneSecondFactorVerificationCode
- )
- let assertion = PhoneMultiFactorGenerator.assertion(with: credential)
- user?.multiFactor.enroll(with: assertion, displayName: kPhoneSecondFactorDisplayName) { error in
- XCTAssertNil(error, "Phone multi factor enroll failed. Error: \(error!.localizedDescription)")
- XCTAssertEqual(Auth.auth().currentUser?.multiFactor.enrolledFactors.first?.displayName, kPhoneSecondFactorDisplayName)
- enrollExpectation.fulfill()
- // Unenroll
- user = Auth.auth().currentUser
- user?.multiFactor.unenroll(with: (user?.multiFactor.enrolledFactors.first)!, completion: { error in
- XCTAssertNil(error, "Phone multi factor unenroll failed. Error: \(error!.localizedDescription)")
- XCTAssertEqual(Auth.auth().currentUser?.multiFactor.enrolledFactors.count, 0)
- unenrollExpectation.fulfill()
- })
- }
- }
- }
- }
- waitForExpectations(timeout: 30) { error in
- XCTAssertNil(error, "Failed to wait for enroll and unenroll phone multi factor finished. Error: \(error!.localizedDescription)")
- }
- }
- func testSignInWithSecondFactor() {
- let signInExpectation = expectation(description: "Sign in with phone multi factor finished.")
- Auth.auth().signIn(withEmail: kOneSecondFactorUserEmail, password: kOneSecondFactorUserPassword) { result, error in
- // SignIn
- guard let error = error, error.code == AuthErrorCode.secondFactorRequired.rawValue else {
- XCTFail("User sign in returns wrong error. Error: \(error!.localizedDescription)")
- }
- let resolver = error.userInfo["FIRAuthErrorUserInfoMultiFactorResolverKey"] as! MultiFactorResolver
- let hint = resolver.hints.first as! PhoneMultiFactorInfo
- PhoneAuthProvider.provider().verifyPhoneNumber(
- with: hint,
- uiDelegate: nil,
- multiFactorSession: resolver.session
- ) { verificationId, error in
- XCTAssertNil(error, "Failed to verify phone number. Error: \(error!.localizedDescription)")
- let credential = PhoneAuthProvider.provider().credential(
- withVerificationID: verificationId!,
- verificationCode: kPhoneSecondFactorVerificationCode
- )
- let assertion = PhoneMultiFactorGenerator.assertion(with: credential)
- resolver.resolveSignIn(with: assertion) { authResult, error in
- XCTAssertNil(error, "Failed to sign in with phone multi factor. Error: \(error!.localizedDescription)")
- signInExpectation.fulfill()
- }
- }
- }
- waitForExpectations(timeout: 300) { error in
- XCTAssertNil(error, "Failed to wait for enroll and unenroll phone multi factor finished. Error: \(error!.localizedDescription)")
- }
- }
- }
|