secant-ios-wallet/secant/Stubs/MockServices.swift

175 lines
4.6 KiB
Swift

//
// MockServices.swift
// secant
//
// Created by Francisco Gindre on 8/6/21.
//
// TODO: Move this to different Target when real functionality is developed.
import Foundation
// swiftlint:disable line_length
class MockServices: Services {
var networkProvider: ZcashNetworkProvider = MockNetworkProvider()
var seedHandler: MnemonicSeedPhraseHandling = MockMnemonicPhraseHandling()
var keyStorage: KeyStoring = MockKeyStoring()
}
class MockNetworkProvider: ZcashNetworkProvider {
func currentNetwork() -> ZcashNetwork {
ZcashMainnet()
}
}
class MockMnemonicPhraseHandling: MnemonicSeedPhraseHandling {
class TestSeed {
/**
Test account: "still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread"
*/
let seedString = Data(
base64Encoded: "9VDVOZZZOWWHpZtq1Ebridp3Qeux5C+HwiRR0g7Oi7HgnMs8Gfln83+/Q1NnvClcaSwM4ADFL1uZHxypEWlWXg=="
)!// swiftlint:disable:this force_unwrapping
func seed() -> [UInt8] {
[UInt8](seedString)
}
}
func randomMnemonic() throws -> String {
"still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread"
}
func randomMnemonicWords() throws -> [String] {
"still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread"
.components(separatedBy: " ")
}
func toSeed(mnemonic: String) throws -> [UInt8] {
TestSeed().seed()
}
func asWords(mnemonic: String) throws -> [String] {
"still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread"
.components(separatedBy: " ")
}
func isValid(mnemonic: String) throws {}
}
class KeysPresentStub: KeyStoring {
init(returnBlock: @escaping () throws -> Bool) {
self.returnBlock = returnBlock
}
var returnBlock: () throws -> Bool
var called = false
func areKeysPresent() throws -> Bool {
called = true
return try returnBlock()
}
var birthday: BlockHeight?
var phrase: String?
func importBirthday(_ height: BlockHeight) throws {
guard birthday == nil else {
throw KeyStoringError.alreadyImported
}
birthday = height
}
func exportBirthday() throws -> BlockHeight {
guard let birthday = birthday else {
throw KeyStoringError.uninitializedWallet
}
return birthday
}
func importPhrase(bip39 phrase: String) throws {
guard self.phrase == nil else {
throw KeyStoringError.alreadyImported
}
self.phrase = phrase
}
func exportPhrase() throws -> String {
guard let phrase = self.phrase else {
throw KeyStoringError.uninitializedWallet
}
return phrase
}
var keysPresent: Bool {
return self.phrase != nil && self.birthday != nil
}
func nukePhrase() {
self.phrase = nil
}
func nukeBirthday() {
self.birthday = nil
}
func nukeWallet() {
nukePhrase()
nukeBirthday()
}
}
class MockKeyStoring: KeyStoring {
var birthday: BlockHeight?
var phrase: String?
var keysPresent: Bool {
return self.phrase != nil && self.birthday != nil
}
func areKeysPresent() throws -> Bool {
false
}
func importBirthday(_ height: BlockHeight) throws {
guard birthday == nil else {
throw KeyStoringError.alreadyImported
}
birthday = height
}
func exportBirthday() throws -> BlockHeight {
guard let birthday = birthday else {
throw KeyStoringError.uninitializedWallet
}
return birthday
}
func importPhrase(bip39 phrase: String) throws {
guard self.phrase == nil else {
throw KeyStoringError.alreadyImported
}
self.phrase = phrase
}
func exportPhrase() throws -> String {
guard let phrase = self.phrase else {
throw KeyStoringError.uninitializedWallet
}
return phrase
}
func nukePhrase() {
self.phrase = nil
}
func nukeBirthday() {
self.birthday = nil
}
func nukeWallet() {
nukePhrase()
nukeBirthday()
}
}