2022-04-12 04:12:07 -07:00
|
|
|
//
|
2022-12-20 23:37:08 -08:00
|
|
|
// RootTests.swift
|
2022-04-12 04:12:07 -07:00
|
|
|
// secantTests
|
|
|
|
//
|
|
|
|
// Created by Lukáš Korba on 12.04.2022.
|
|
|
|
//
|
|
|
|
|
|
|
|
import XCTest
|
|
|
|
@testable import secant_testnet
|
|
|
|
import ComposableArchitecture
|
|
|
|
|
2022-12-20 23:37:08 -08:00
|
|
|
class RootTests: XCTestCase {
|
2022-04-12 04:12:07 -07:00
|
|
|
static let testScheduler = DispatchQueue.test
|
|
|
|
|
|
|
|
func testWalletInitializationState_Uninitialized() throws {
|
2022-12-07 04:32:06 -08:00
|
|
|
let walletState = RootReducer.walletInitializationState(
|
2022-11-17 03:25:55 -08:00
|
|
|
databaseFiles: .noOp,
|
|
|
|
walletStorage: .noOp,
|
2022-11-10 09:26:03 -08:00
|
|
|
zcashSDKEnvironment: .testnet
|
2022-04-12 04:12:07 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
XCTAssertEqual(walletState, .uninitialized)
|
|
|
|
}
|
|
|
|
|
2022-04-14 04:12:09 -07:00
|
|
|
func testWalletInitializationState_FilesPresentKeysMissing() throws {
|
2022-11-17 03:25:55 -08:00
|
|
|
let wfmMock = FileManagerClient(
|
|
|
|
url: { _, _, _, _ in .emptyURL },
|
2022-04-12 04:12:07 -07:00
|
|
|
fileExists: { _ in return true },
|
|
|
|
removeItem: { _ in }
|
|
|
|
)
|
|
|
|
|
2022-12-07 04:32:06 -08:00
|
|
|
let walletState = RootReducer.walletInitializationState(
|
2022-04-12 04:12:07 -07:00
|
|
|
databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)),
|
2022-11-17 03:25:55 -08:00
|
|
|
walletStorage: .noOp,
|
2022-11-10 09:26:03 -08:00
|
|
|
zcashSDKEnvironment: .testnet
|
2022-04-12 04:12:07 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
XCTAssertEqual(walletState, .keysMissing)
|
|
|
|
}
|
|
|
|
|
2022-04-14 04:12:09 -07:00
|
|
|
func testWalletInitializationState_FilesMissingKeysMissing() throws {
|
2022-11-17 03:25:55 -08:00
|
|
|
let wfmMock = FileManagerClient(
|
|
|
|
url: { _, _, _, _ in .emptyURL },
|
2022-04-14 04:12:09 -07:00
|
|
|
fileExists: { _ in return false },
|
|
|
|
removeItem: { _ in }
|
|
|
|
)
|
|
|
|
|
2022-12-07 04:32:06 -08:00
|
|
|
let walletState = RootReducer.walletInitializationState(
|
2022-04-14 04:12:09 -07:00
|
|
|
databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)),
|
2022-11-17 03:25:55 -08:00
|
|
|
walletStorage: .noOp,
|
2022-04-13 06:52:31 -07:00
|
|
|
zcashSDKEnvironment: .testnet
|
2022-04-14 04:12:09 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
XCTAssertEqual(walletState, .uninitialized)
|
|
|
|
}
|
2022-12-20 23:37:08 -08:00
|
|
|
|
|
|
|
func testWalletInitializationState_FilesMissing() throws {
|
|
|
|
let wfmMock = FileManagerClient(
|
|
|
|
url: { _, _, _, _ in .emptyURL },
|
|
|
|
fileExists: { _ in return false },
|
|
|
|
removeItem: { _ in }
|
|
|
|
)
|
|
|
|
|
|
|
|
var walletStorage = WalletStorageClient.noOp
|
|
|
|
walletStorage.areKeysPresent = { true }
|
|
|
|
|
|
|
|
let walletState = RootReducer.walletInitializationState(
|
|
|
|
databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)),
|
|
|
|
walletStorage: walletStorage,
|
|
|
|
zcashSDKEnvironment: .testnet
|
|
|
|
)
|
|
|
|
|
|
|
|
XCTAssertEqual(walletState, .filesMissing)
|
|
|
|
}
|
|
|
|
|
|
|
|
func testWalletInitializationState_Initialized() throws {
|
|
|
|
let wfmMock = FileManagerClient(
|
|
|
|
url: { _, _, _, _ in .emptyURL },
|
|
|
|
fileExists: { _ in return true },
|
|
|
|
removeItem: { _ in }
|
|
|
|
)
|
2022-04-14 04:12:09 -07:00
|
|
|
|
2022-12-20 23:37:08 -08:00
|
|
|
var walletStorage = WalletStorageClient.noOp
|
|
|
|
walletStorage.areKeysPresent = { true }
|
|
|
|
|
|
|
|
let walletState = RootReducer.walletInitializationState(
|
|
|
|
databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)),
|
|
|
|
walletStorage: walletStorage,
|
|
|
|
zcashSDKEnvironment: .testnet
|
|
|
|
)
|
2022-04-12 04:12:07 -07:00
|
|
|
|
2022-12-20 23:37:08 -08:00
|
|
|
XCTAssertEqual(walletState, .initialized)
|
|
|
|
}
|
2022-04-12 04:12:07 -07:00
|
|
|
|
|
|
|
func testRespondToWalletInitializationState_Uninitialized() throws {
|
|
|
|
let store = TestStore(
|
|
|
|
initialState: .placeholder,
|
2022-12-07 04:32:06 -08:00
|
|
|
reducer: RootReducer()
|
2023-02-28 09:02:31 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
store.dependencies.mainQueue = Self.testScheduler.eraseToAnyScheduler()
|
2022-11-17 03:25:55 -08:00
|
|
|
|
2022-12-07 05:47:42 -08:00
|
|
|
store.send(.initialization(.respondToWalletInitializationState(.uninitialized)))
|
2022-04-12 04:12:07 -07:00
|
|
|
|
|
|
|
Self.testScheduler.advance(by: 3)
|
|
|
|
|
2022-12-07 05:47:42 -08:00
|
|
|
store.receive(.destination(.updateDestination(.onboarding))) {
|
|
|
|
$0.destinationState.destination = .onboarding
|
2022-04-12 04:12:07 -07:00
|
|
|
$0.appInitializationState = .uninitialized
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func testRespondToWalletInitializationState_KeysMissing() throws {
|
|
|
|
let store = TestStore(
|
|
|
|
initialState: .placeholder,
|
2022-12-07 04:32:06 -08:00
|
|
|
reducer: RootReducer()
|
2022-04-12 04:12:07 -07:00
|
|
|
)
|
|
|
|
|
2022-12-07 05:47:42 -08:00
|
|
|
store.send(.initialization(.respondToWalletInitializationState(.keysMissing))) { state in
|
2022-04-12 04:12:07 -07:00
|
|
|
state.appInitializationState = .keysMissing
|
2023-03-02 00:02:24 -08:00
|
|
|
state.alert = AlertState(
|
|
|
|
title: TextState("Wallet initialisation failed."),
|
|
|
|
message: TextState("App initialisation state: keysMissing."),
|
|
|
|
dismissButton: .default(TextState("Ok"), action: .send(.dismissAlert))
|
|
|
|
)
|
2022-04-12 04:12:07 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func testRespondToWalletInitializationState_FilesMissing() throws {
|
2023-03-02 00:02:24 -08:00
|
|
|
let walletStorageError: Error = "export failed"
|
|
|
|
|
2022-04-12 04:12:07 -07:00
|
|
|
let store = TestStore(
|
|
|
|
initialState: .placeholder,
|
2022-12-07 04:32:06 -08:00
|
|
|
reducer: RootReducer()
|
2022-11-18 02:34:33 -08:00
|
|
|
) { dependencies in
|
|
|
|
dependencies.walletStorage = .noOp
|
2023-03-02 00:02:24 -08:00
|
|
|
dependencies.walletStorage.exportWallet = { throw walletStorageError }
|
2022-11-18 02:34:33 -08:00
|
|
|
}
|
2022-11-17 03:25:55 -08:00
|
|
|
|
2022-12-07 05:47:42 -08:00
|
|
|
store.send(.initialization(.respondToWalletInitializationState(.filesMissing))) { state in
|
2022-04-12 04:12:07 -07:00
|
|
|
state.appInitializationState = .filesMissing
|
|
|
|
}
|
2022-11-22 02:32:48 -08:00
|
|
|
|
2022-12-07 05:47:42 -08:00
|
|
|
store.receive(.initialization(.initializeSDK)) { state in
|
2022-04-13 06:52:31 -07:00
|
|
|
// failed is expected because environment is throwing errors
|
|
|
|
state.appInitializationState = .failed
|
2023-03-02 00:02:24 -08:00
|
|
|
state.alert = AlertState(
|
|
|
|
title: TextState("Failed to initialize the SDK"),
|
|
|
|
message: TextState("Error: \(walletStorageError.localizedDescription)"),
|
|
|
|
dismissButton: .default(TextState("Ok"), action: .send(.dismissAlert))
|
|
|
|
)
|
2022-04-13 06:52:31 -07:00
|
|
|
}
|
|
|
|
|
2023-03-02 00:02:24 -08:00
|
|
|
store.receive(.initialization(.checkBackupPhraseValidation)) { state in
|
|
|
|
state.alert = AlertState(
|
|
|
|
title: TextState("Wallet initialisation failed."),
|
|
|
|
message: TextState("Can't load seed phrase from local storage."),
|
|
|
|
dismissButton: .default(TextState("Ok"), action: .send(.dismissAlert))
|
|
|
|
)
|
|
|
|
}
|
2022-04-12 04:12:07 -07:00
|
|
|
}
|
2022-11-22 02:32:48 -08:00
|
|
|
|
2022-04-12 04:12:07 -07:00
|
|
|
func testRespondToWalletInitializationState_Initialized() throws {
|
2023-03-02 00:02:24 -08:00
|
|
|
let walletStorageError: Error = "export failed"
|
2022-04-12 04:12:07 -07:00
|
|
|
let store = TestStore(
|
|
|
|
initialState: .placeholder,
|
2022-12-07 04:32:06 -08:00
|
|
|
reducer: RootReducer()
|
2022-11-18 02:34:33 -08:00
|
|
|
) { dependencies in
|
|
|
|
dependencies.walletStorage = .noOp
|
2023-03-02 00:02:24 -08:00
|
|
|
dependencies.walletStorage.exportWallet = { throw walletStorageError }
|
2022-11-18 02:34:33 -08:00
|
|
|
}
|
2022-11-22 02:32:48 -08:00
|
|
|
|
2022-12-07 05:47:42 -08:00
|
|
|
store.send(.initialization(.respondToWalletInitializationState(.initialized)))
|
2022-11-22 02:32:48 -08:00
|
|
|
|
2022-12-07 05:47:42 -08:00
|
|
|
store.receive(.initialization(.initializeSDK)) { state in
|
2022-04-13 06:52:31 -07:00
|
|
|
// failed is expected because environment is throwing errors
|
|
|
|
state.appInitializationState = .failed
|
2023-03-02 00:02:24 -08:00
|
|
|
state.alert = AlertState(
|
|
|
|
title: TextState("Failed to initialize the SDK"),
|
|
|
|
message: TextState("Error: \(walletStorageError.localizedDescription)"),
|
|
|
|
dismissButton: .default(TextState("Ok"), action: .send(.dismissAlert))
|
|
|
|
)
|
2022-04-13 06:52:31 -07:00
|
|
|
}
|
2022-04-28 03:22:31 -07:00
|
|
|
|
2023-03-02 00:02:24 -08:00
|
|
|
store.receive(.initialization(.checkBackupPhraseValidation)) { state in
|
|
|
|
state.alert = AlertState(
|
|
|
|
title: TextState("Wallet initialisation failed."),
|
|
|
|
message: TextState("Can't load seed phrase from local storage."),
|
|
|
|
dismissButton: .default(TextState("Ok"), action: .send(.dismissAlert))
|
|
|
|
)
|
|
|
|
}
|
2022-04-12 04:12:07 -07:00
|
|
|
}
|
2022-06-28 00:38:08 -07:00
|
|
|
|
|
|
|
func testWalletEventReplyTo_validAddress() throws {
|
|
|
|
let store = TestStore(
|
|
|
|
initialState: .placeholder,
|
2022-12-07 04:32:06 -08:00
|
|
|
reducer: RootReducer()
|
2022-06-28 00:38:08 -07:00
|
|
|
)
|
|
|
|
|
2023-02-13 11:32:50 -08:00
|
|
|
let address = "t1gXqfSSQt6WfpwyuCU3Wi7sSVZ66DYQ3Po".redacted
|
2022-06-28 00:38:08 -07:00
|
|
|
store.send(.home(.walletEvents(.replyTo(address))))
|
|
|
|
|
|
|
|
if let url = URL(string: "zcash:\(address)") {
|
2022-12-07 05:47:42 -08:00
|
|
|
store.receive(.destination(.deeplink(url)))
|
2022-06-28 00:38:08 -07:00
|
|
|
}
|
|
|
|
}
|
2022-04-12 04:12:07 -07:00
|
|
|
}
|