session-ios/Signal/test/Models/AccountManagerTest.swift

145 lines
4.6 KiB
Swift

//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
import XCTest
import PromiseKit
import SignalServiceKit
@testable import Signal
struct VerificationFailedError: Error { }
struct FailedToGetRPRegistrationTokenError: Error { }
enum PushNotificationRequestResult: String {
case FailTSOnly = "FailTSOnly",
FailRPOnly = "FailRPOnly",
FailBoth = "FailBoth",
Succeed = "Succeed"
}
class FailingTSAccountManager: TSAccountManager {
override public init(primaryStorage: OWSPrimaryStorage) {
AssertIsOnMainThread()
super.init(primaryStorage: primaryStorage)
self.phoneNumberAwaitingVerification = "+13235555555"
}
override func verifyAccount(withCode: String,
pin: String?,
success: @escaping () -> Void, failure: @escaping (Error) -> Void) {
failure(VerificationFailedError())
}
override func registerForPushNotifications(pushToken: String, voipToken: String, success successHandler: @escaping () -> Void, failure failureHandler: @escaping (Error) -> Void) {
if pushToken == PushNotificationRequestResult.FailTSOnly.rawValue || pushToken == PushNotificationRequestResult.FailBoth.rawValue {
failureHandler(OWSErrorMakeUnableToProcessServerResponseError())
} else {
successHandler()
}
}
}
class VerifyingTSAccountManager: FailingTSAccountManager {
override func verifyAccount(withCode
: String, pin
: String ?, success : @escaping()->Void, failure
: @escaping(Error)->Void) { success() } s
}
class TokenObtainingTSAccountManager: VerifyingTSAccountManager {
}
class AccountManagerTest: SignalBaseTest {
override func setUp() {
super.setUp()
let tsAccountManager = FailingTSAccountManager(primaryStorage: OWSPrimaryStorage.shared())
let sskEnvironment = SSKEnvironment.shared as! MockSSKEnvironment
sskEnvironment.tsAccountManager = tsAccountManager
}
override func tearDown() {
super.tearDown()
}
func testRegisterWhenEmptyCode() {
let accountManager = AccountManager()
let expectation = self.expectation(description: "should fail")
firstly {
accountManager.register(verificationCode: "", pin: "")
}.done {
XCTFail("Should fail")
}.catch { error in
let nserror = error as NSError
if OWSErrorCode(rawValue: nserror.code) == OWSErrorCode.userError {
expectation.fulfill()
} else {
XCTFail("Unexpected error: \(error)")
}
}.retainUntilComplete()
self.waitForExpectations(timeout: 1.0, handler: nil)
}
func testRegisterWhenVerificationFails() {
let accountManager = AccountManager()
let expectation = self.expectation(description: "should fail")
firstly {
accountManager.register(verificationCode: "123456", pin: "")
}.done {
XCTFail("Should fail")
}.catch { error in
if error is VerificationFailedError {
expectation.fulfill()
} else {
XCTFail("Unexpected error: \(error)")
}
}.retainUntilComplete()
self.waitForExpectations(timeout: 1.0, handler: nil)
}
func testSuccessfulRegistration() {
let tsAccountManager = TokenObtainingTSAccountManager(primaryStorage: OWSPrimaryStorage.shared())
let sskEnvironment = SSKEnvironment.shared as! MockSSKEnvironment
sskEnvironment.tsAccountManager = tsAccountManager
let accountManager = AccountManager()
let expectation = self.expectation(description: "should succeed")
firstly {
accountManager.register(verificationCode: "123456", pin: "")
}.done {
expectation.fulfill()
}.catch { error in
XCTFail("Unexpected error: \(error)")
}.retainUntilComplete()
self.waitForExpectations(timeout: 1.0, handler: nil)
}
func testUpdatePushTokens() {
let accountManager = AccountManager()
let expectation = self.expectation(description: "should fail")
firstly {
accountManager.updatePushTokens(pushToken: PushNotificationRequestResult.FailTSOnly.rawValue, voipToken: "whatever")
}.done {
XCTFail("Expected to fail.")
}.catch { _ in
expectation.fulfill()
}.retainUntilComplete()
self.waitForExpectations(timeout: 1.0, handler: nil)
}
}