secant-ios-wallet/secantTests/AppTests/AppTests.swift

189 lines
6.4 KiB
Swift

//
// AppTests.swift
// secantTests
//
// Created by Lukáš Korba on 12.04.2022.
//
import XCTest
@testable import secant_testnet
import ComposableArchitecture
class AppTests: XCTestCase {
static let testScheduler = DispatchQueue.test
let testEnvironment = AppEnvironment(
audioServices: .silent,
databaseFiles: .throwing,
deeplinkHandler: .live,
derivationTool: .live(),
diskSpaceChecker: .mockEmptyDisk,
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: TestWrappedSDKSynchronizer(),
walletStorage: .throwing,
zcashSDKEnvironment: .mainnet
)
func testWalletInitializationState_Uninitialized() throws {
let uninitializedEnvironment = AppEnvironment(
audioServices: .silent,
databaseFiles: .throwing,
deeplinkHandler: .live,
derivationTool: .live(),
diskSpaceChecker: .mockEmptyDisk,
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: DispatchQueue.test.eraseToAnyScheduler(),
SDKSynchronizer: TestWrappedSDKSynchronizer(),
walletStorage: .throwing,
zcashSDKEnvironment: .mainnet
)
let walletState = AppReducer.walletInitializationState(uninitializedEnvironment)
XCTAssertEqual(walletState, .uninitialized)
}
func testWalletInitializationState_FilesPresentKeysMissing() throws {
let wfmMock = WrappedFileManager(
url: { _, _, _, _ in URL(fileURLWithPath: "") },
fileExists: { _ in return true },
removeItem: { _ in }
)
let keysMissingEnvironment = AppEnvironment(
audioServices: .silent,
databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)),
deeplinkHandler: .live,
derivationTool: .live(),
diskSpaceChecker: .mockEmptyDisk,
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: Self.testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: TestWrappedSDKSynchronizer(),
walletStorage: .throwing,
zcashSDKEnvironment: .mainnet
)
let walletState = AppReducer.walletInitializationState(keysMissingEnvironment)
XCTAssertEqual(walletState, .keysMissing)
}
func testWalletInitializationState_FilesMissingKeysMissing() throws {
let wfmMock = WrappedFileManager(
url: { _, _, _, _ in URL(fileURLWithPath: "") },
fileExists: { _ in return false },
removeItem: { _ in }
)
let keysMissingEnvironment = AppEnvironment(
audioServices: .silent,
databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)),
deeplinkHandler: .live,
derivationTool: .live(),
diskSpaceChecker: .mockEmptyDisk,
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: Self.testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: TestWrappedSDKSynchronizer(),
walletStorage: .throwing,
zcashSDKEnvironment: .testnet
)
let walletState = AppReducer.walletInitializationState(keysMissingEnvironment)
XCTAssertEqual(walletState, .uninitialized)
}
// TODO [#231]: - Implement testWalletInitializationState_FilesMissing when WalletStorage mock is available (https://github.com/zcash/secant-ios-wallet/issues/231)
// TODO [#231]: - Implement testWalletInitializationState_Initialized when WalletStorage mock is available (https://github.com/zcash/secant-ios-wallet/issues/231)
func testRespondToWalletInitializationState_Uninitialized() throws {
let store = TestStore(
initialState: .placeholder,
reducer: AppReducer.default,
environment: testEnvironment
)
store.send(.respondToWalletInitializationState(.uninitialized))
Self.testScheduler.advance(by: 3)
store.receive(.updateRoute(.onboarding)) {
$0.route = .onboarding
$0.appInitializationState = .uninitialized
}
}
func testRespondToWalletInitializationState_KeysMissing() throws {
let store = TestStore(
initialState: .placeholder,
reducer: AppReducer.default,
environment: testEnvironment
)
store.send(.respondToWalletInitializationState(.keysMissing)) { state in
state.appInitializationState = .keysMissing
}
}
func testRespondToWalletInitializationState_FilesMissing() throws {
let store = TestStore(
initialState: .placeholder,
reducer: AppReducer.default,
environment: testEnvironment
)
store.send(.respondToWalletInitializationState(.filesMissing)) { state in
state.appInitializationState = .filesMissing
}
store.receive(.initializeSDK) { state in
// failed is expected because environment is throwing errors
state.appInitializationState = .failed
}
store.receive(.checkBackupPhraseValidation)
}
func testRespondToWalletInitializationState_Initialized() throws {
let store = TestStore(
initialState: .placeholder,
reducer: AppReducer.default,
environment: testEnvironment
)
store.send(.respondToWalletInitializationState(.initialized))
store.receive(.initializeSDK) { state in
// failed is expected because environment is throwing errors
state.appInitializationState = .failed
}
store.receive(.checkBackupPhraseValidation)
}
func testWalletEventReplyTo_validAddress() throws {
let store = TestStore(
initialState: .placeholder,
reducer: AppReducer.default,
environment: testEnvironment
)
let address = "t1gXqfSSQt6WfpwyuCU3Wi7sSVZ66DYQ3Po"
store.send(.home(.walletEvents(.replyTo(address))))
if let url = URL(string: "zcash:\(address)") {
store.receive(.deeplink(url))
}
}
}