Files
firebase-ios-sdk/Example/Auth/ApiTests/PhoneMultiFactorTests.swift
T

107 lines
4.9 KiB
Swift

/*
* 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)")
}
}
}