[222] Tests for the initialisation check and process (#334)

- recovery phrase randomizer & wrapper
- did finish launching -> initialized wallet test
- cleanup of static dependencies
- did finish launching -> keys missing integration test
- did finish launching -> uninitialized integration test
- database files were missing, mocked to behave like it's available
- key missing test fix, the database files were missing too => mocked to act like being present
This commit is contained in:
Lukas Korba 2022-06-03 20:21:51 +02:00 committed by GitHub
parent 9e2ac0c6aa
commit 6026aebc9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 382 additions and 74 deletions

View File

@ -83,7 +83,6 @@
66D50668271D9B6100E51F0D /* NavigationButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66D50667271D9B6100E51F0D /* NavigationButtonStyle.swift */; };
66DC733F271D88CC0053CBB6 /* StandardButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66DC733E271D88CC0053CBB6 /* StandardButtonStyle.swift */; };
9E01F8202833861A000EFC57 /* WrappedCaptureDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E01F81F2833861A000EFC57 /* WrappedCaptureDevice.swift */; };
9E01F8222833BFAE000EFC57 /* URIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E01F8212833BFAE000EFC57 /* URIParser.swift */; };
9E01F8242833C0D8000EFC57 /* WrappedURIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E01F8232833C0D8000EFC57 /* WrappedURIParser.swift */; };
9E01F8282833CDA0000EFC57 /* ScanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E01F8272833CDA0000EFC57 /* ScanTests.swift */; };
9E02B56A27FED43E005B809B /* WrappedFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E02B56927FED43E005B809B /* WrappedFileManager.swift */; };
@ -91,7 +90,6 @@
9E02B5C3280458D2005B809B /* WrappedDerivationTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E02B5C2280458D2005B809B /* WrappedDerivationTool.swift */; };
9E2AC0FF27D8EC120042AA47 /* MnemonicSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 9E2AC0FE27D8EC120042AA47 /* MnemonicSwift */; };
9E2AC10127D8EF0B0042AA47 /* WrappedMnemonic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2AC10027D8EF0B0042AA47 /* WrappedMnemonic.swift */; };
9E2AC10327DA28200042AA47 /* WalletStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2AC10227DA28200042AA47 /* WalletStorage.swift */; };
9E2DF99C27CF704D00649636 /* ImportWalletStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99827CF704D00649636 /* ImportWalletStore.swift */; };
9E2DF99D27CF704D00649636 /* ImportSeedEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99A27CF704D00649636 /* ImportSeedEditor.swift */; };
9E2DF99E27CF704D00649636 /* ImportWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99B27CF704D00649636 /* ImportWalletView.swift */; };
@ -104,6 +102,14 @@
9E39112E283F91600073DD9A /* ZatoshiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E39112D283F91600073DD9A /* ZatoshiTests.swift */; };
9E3911392848AD500073DD9A /* HomeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911382848AD500073DD9A /* HomeTests.swift */; };
9E39113B2848D5180073DD9A /* WrappedNumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E39113A2848D5180073DD9A /* WrappedNumberFormatter.swift */; };
9E391132284644580073DD9A /* AppInitializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E391131284644580073DD9A /* AppInitializationTests.swift */; };
9E39113F2848EC360073DD9A /* WrappedRecoveryPhraseRandomizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E39113E2848EC350073DD9A /* WrappedRecoveryPhraseRandomizer.swift */; };
9E3911482848EEB90073DD9A /* RecoveryPhraseRandomizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911422848EEB90073DD9A /* RecoveryPhraseRandomizer.swift */; };
9E3911492848EEB90073DD9A /* URIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911432848EEB90073DD9A /* URIParser.swift */; };
9E39114A2848EEB90073DD9A /* UserPreferencesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */; };
9E39114B2848EEB90073DD9A /* ZCashSDKEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911452848EEB90073DD9A /* ZCashSDKEnvironment.swift */; };
9E39114C2848EEB90073DD9A /* DatabaseFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911462848EEB90073DD9A /* DatabaseFiles.swift */; };
9E39114D2848EEB90073DD9A /* WalletStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911472848EEB90073DD9A /* WalletStorage.swift */; };
9E4DC6E027C409A100E657F4 /* NeumorphicDesignModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4DC6DF27C409A100E657F4 /* NeumorphicDesignModifier.swift */; };
9E4DC6E227C4C6B700E657F4 /* SecantButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4DC6E127C4C6B700E657F4 /* SecantButtonStyles.swift */; };
9E5BF63F2819542C00BA3F17 /* TransactionHistoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF63E2819542C00BA3F17 /* TransactionHistoryTests.swift */; };
@ -128,19 +134,16 @@
9E7FE0EE282E7E8700C374E8 /* SendFlowTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0D0282D26BD00C374E8 /* SendFlowTransaction.swift */; };
9E7FE0F628327F6F00C374E8 /* ScanUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */; };
9E7FE0F92832824C00C374E8 /* QRCodeScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F82832824C00C374E8 /* QRCodeScanView.swift */; };
9E80B47227E4B34B008FF493 /* UserPreferencesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E80B47127E4B34B008FF493 /* UserPreferencesStorage.swift */; };
9E87ADF128363DE400122FCC /* WrappedAudioServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E87ADF028363DE400122FCC /* WrappedAudioServices.swift */; };
9EAFEB822805793200199FC9 /* AppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB812805793200199FC9 /* AppTests.swift */; };
9EAFEB84280597B700199FC9 /* WrappedSecItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB83280597B700199FC9 /* WrappedSecItem.swift */; };
9EAFEB862805A23100199FC9 /* WrappedSecItemTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB852805A23100199FC9 /* WrappedSecItemTests.swift */; };
9EAFEB882806E5AE00199FC9 /* WrappedSDKSynchronizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB872806E5AE00199FC9 /* WrappedSDKSynchronizer.swift */; };
9EAFEB8A2806F48100199FC9 /* ZCashSDKEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB892806F48100199FC9 /* ZCashSDKEnvironment.swift */; };
9EAFEB8F2808183D00199FC9 /* SandboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8D2808183D00199FC9 /* SandboxView.swift */; };
9EAFEB902808183D00199FC9 /* SandboxStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8E2808183D00199FC9 /* SandboxStore.swift */; };
9EAFEB9128081E9400199FC9 /* HomeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874ED273C4DE200F0E875 /* HomeStore.swift */; };
9EAFEB9228081E9400199FC9 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874EF273C4DE200F0E875 /* HomeView.swift */; };
9EBEF87A27CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EBEF87927CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift */; };
9ECAE56827FC713C0089A0EF /* DatabaseFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ECAE56727FC713C0089A0EF /* DatabaseFiles.swift */; };
9EDDEAA22829610D00B4100C /* CurrencySelectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDDEA9F2829610D00B4100C /* CurrencySelectionTests.swift */; };
9EDDEAA32829610D00B4100C /* TransactionAmountInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDDEAA02829610D00B4100C /* TransactionAmountInputTests.swift */; };
9EDDEAA42829610D00B4100C /* TransactionAddressInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDDEAA12829610D00B4100C /* TransactionAddressInputTests.swift */; };
@ -276,14 +279,12 @@
66D50667271D9B6100E51F0D /* NavigationButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationButtonStyle.swift; sourceTree = "<group>"; };
66DC733E271D88CC0053CBB6 /* StandardButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardButtonStyle.swift; sourceTree = "<group>"; };
9E01F81F2833861A000EFC57 /* WrappedCaptureDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedCaptureDevice.swift; sourceTree = "<group>"; };
9E01F8212833BFAE000EFC57 /* URIParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URIParser.swift; sourceTree = "<group>"; };
9E01F8232833C0D8000EFC57 /* WrappedURIParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedURIParser.swift; sourceTree = "<group>"; };
9E01F8272833CDA0000EFC57 /* ScanTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanTests.swift; sourceTree = "<group>"; };
9E02B56927FED43E005B809B /* WrappedFileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedFileManager.swift; sourceTree = "<group>"; };
9E02B56B27FED475005B809B /* DatabaseFilesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseFilesTests.swift; sourceTree = "<group>"; };
9E02B5C2280458D2005B809B /* WrappedDerivationTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedDerivationTool.swift; sourceTree = "<group>"; };
9E2AC10027D8EF0B0042AA47 /* WrappedMnemonic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedMnemonic.swift; sourceTree = "<group>"; };
9E2AC10227DA28200042AA47 /* WalletStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletStorage.swift; sourceTree = "<group>"; };
9E2DF99827CF704D00649636 /* ImportWalletStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportWalletStore.swift; sourceTree = "<group>"; };
9E2DF99A27CF704D00649636 /* ImportSeedEditor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportSeedEditor.swift; sourceTree = "<group>"; };
9E2DF99B27CF704D00649636 /* ImportWalletView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportWalletView.swift; sourceTree = "<group>"; };
@ -296,6 +297,14 @@
9E39112D283F91600073DD9A /* ZatoshiTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZatoshiTests.swift; sourceTree = "<group>"; };
9E3911382848AD500073DD9A /* HomeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTests.swift; sourceTree = "<group>"; };
9E39113A2848D5180073DD9A /* WrappedNumberFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedNumberFormatter.swift; sourceTree = "<group>"; };
9E391131284644580073DD9A /* AppInitializationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInitializationTests.swift; sourceTree = "<group>"; };
9E39113E2848EC350073DD9A /* WrappedRecoveryPhraseRandomizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WrappedRecoveryPhraseRandomizer.swift; sourceTree = "<group>"; };
9E3911422848EEB90073DD9A /* RecoveryPhraseRandomizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseRandomizer.swift; sourceTree = "<group>"; };
9E3911432848EEB90073DD9A /* URIParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URIParser.swift; sourceTree = "<group>"; };
9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorage.swift; sourceTree = "<group>"; };
9E3911452848EEB90073DD9A /* ZCashSDKEnvironment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZCashSDKEnvironment.swift; sourceTree = "<group>"; };
9E3911462848EEB90073DD9A /* DatabaseFiles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseFiles.swift; sourceTree = "<group>"; };
9E3911472848EEB90073DD9A /* WalletStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStorage.swift; sourceTree = "<group>"; };
9E4DC6DF27C409A100E657F4 /* NeumorphicDesignModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NeumorphicDesignModifier.swift; sourceTree = "<group>"; };
9E4DC6E127C4C6B700E657F4 /* SecantButtonStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecantButtonStyles.swift; sourceTree = "<group>"; };
9E5BF63B2818305D00BA3F17 /* TransactionState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionState.swift; sourceTree = "<group>"; };
@ -320,17 +329,14 @@
9E7FE0E7282E7B7C00C374E8 /* WrappedDatabaseFiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedDatabaseFiles.swift; sourceTree = "<group>"; };
9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanUIView.swift; sourceTree = "<group>"; };
9E7FE0F82832824C00C374E8 /* QRCodeScanView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeScanView.swift; sourceTree = "<group>"; };
9E80B47127E4B34B008FF493 /* UserPreferencesStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorage.swift; sourceTree = "<group>"; };
9E87ADF028363DE400122FCC /* WrappedAudioServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedAudioServices.swift; sourceTree = "<group>"; };
9EAFEB812805793200199FC9 /* AppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTests.swift; sourceTree = "<group>"; };
9EAFEB83280597B700199FC9 /* WrappedSecItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedSecItem.swift; sourceTree = "<group>"; };
9EAFEB852805A23100199FC9 /* WrappedSecItemTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedSecItemTests.swift; sourceTree = "<group>"; };
9EAFEB872806E5AE00199FC9 /* WrappedSDKSynchronizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrappedSDKSynchronizer.swift; sourceTree = "<group>"; };
9EAFEB892806F48100199FC9 /* ZCashSDKEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZCashSDKEnvironment.swift; sourceTree = "<group>"; };
9EAFEB8D2808183D00199FC9 /* SandboxView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SandboxView.swift; sourceTree = "<group>"; };
9EAFEB8E2808183D00199FC9 /* SandboxStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SandboxStore.swift; sourceTree = "<group>"; };
9EBEF87927CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseValidationFlowView.swift; sourceTree = "<group>"; };
9ECAE56727FC713C0089A0EF /* DatabaseFiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseFiles.swift; sourceTree = "<group>"; };
9EDDEA9F2829610D00B4100C /* CurrencySelectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrencySelectionTests.swift; sourceTree = "<group>"; };
9EDDEAA02829610D00B4100C /* TransactionAmountInputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionAmountInputTests.swift; sourceTree = "<group>"; };
9EDDEAA12829610D00B4100C /* TransactionAddressInputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionAddressInputTests.swift; sourceTree = "<group>"; };
@ -734,6 +740,7 @@
9E01F8232833C0D8000EFC57 /* WrappedURIParser.swift */,
9E87ADF028363DE400122FCC /* WrappedAudioServices.swift */,
9E39113A2848D5180073DD9A /* WrappedNumberFormatter.swift */,
9E39113E2848EC350073DD9A /* WrappedRecoveryPhraseRandomizer.swift */,
);
path = Wrappers;
sourceTree = "<group>";
@ -854,11 +861,12 @@
9E7FE0BD282D1DE100C374E8 /* Dependencies */ = {
isa = PBXGroup;
children = (
9E2AC10227DA28200042AA47 /* WalletStorage.swift */,
9EAFEB892806F48100199FC9 /* ZCashSDKEnvironment.swift */,
9E80B47127E4B34B008FF493 /* UserPreferencesStorage.swift */,
9ECAE56727FC713C0089A0EF /* DatabaseFiles.swift */,
9E01F8212833BFAE000EFC57 /* URIParser.swift */,
9E3911462848EEB90073DD9A /* DatabaseFiles.swift */,
9E3911422848EEB90073DD9A /* RecoveryPhraseRandomizer.swift */,
9E3911432848EEB90073DD9A /* URIParser.swift */,
9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */,
9E3911472848EEB90073DD9A /* WalletStorage.swift */,
9E3911452848EEB90073DD9A /* ZCashSDKEnvironment.swift */,
);
path = Dependencies;
sourceTree = "<group>";
@ -949,6 +957,7 @@
isa = PBXGroup;
children = (
9EAFEB812805793200199FC9 /* AppTests.swift */,
9E391131284644580073DD9A /* AppInitializationTests.swift */,
);
path = AppTests;
sourceTree = "<group>";
@ -1285,6 +1294,7 @@
660558F8270C862F009D6954 /* XCAssets+Generated.swift in Sources */,
9EAFEB902808183D00199FC9 /* SandboxStore.swift in Sources */,
0D35CC46277A36E00074316A /* ScrollableWhenScaled.swift in Sources */,
9E39114A2848EEB90073DD9A /* UserPreferencesStorage.swift in Sources */,
F96B41E9273B501F0021B49A /* TransactionHistoryFlowView.swift in Sources */,
9E01F8202833861A000EFC57 /* WrappedCaptureDevice.swift in Sources */,
2EDA07A027EDE18C00D6F09B /* TCATextField.swift in Sources */,
@ -1292,13 +1302,11 @@
2EB7758727FC67FD00269373 /* TransactionAmountTextFieldStore.swift in Sources */,
669FDAE9272C23B3007B9422 /* CircularFrame.swift in Sources */,
9EF8136027F043CC0075AF48 /* AppDelegate.swift in Sources */,
9E80B47227E4B34B008FF493 /* UserPreferencesStorage.swift in Sources */,
F96B41E8273B501F0021B49A /* TransactionDetailView.swift in Sources */,
9E02B56A27FED43E005B809B /* WrappedFileManager.swift in Sources */,
663FABA2271D876C00E495F8 /* SecondaryButton.swift in Sources */,
0DC487C32772574C00BE6A63 /* RecoveryPhraseBackupSucceededView.swift in Sources */,
2EB1C5E827D77F6100BC43D7 /* TCATextFieldStore.swift in Sources */,
9EAFEB8A2806F48100199FC9 /* ZCashSDKEnvironment.swift in Sources */,
9E5BF648282277BE00BA3F17 /* WrappedNotificationCenter.swift in Sources */,
0D8A43C4272AEEDE005A6414 /* SecantTextStyles.swift in Sources */,
9E5BF641281FD7B600BA3F17 /* TransactionFailedView.swift in Sources */,
@ -1319,6 +1327,7 @@
0D6D628B276A528E002FB4CC /* DropDelegate.swift in Sources */,
9E2DF99D27CF704D00649636 /* ImportSeedEditor.swift in Sources */,
F9971A5327680DD000A2DB75 /* ProfileStore.swift in Sources */,
9E39114D2848EEB90073DD9A /* WalletStorage.swift in Sources */,
669FDAEB272C23C2007B9422 /* CircularFrameBadge.swift in Sources */,
9E39113B2848D5180073DD9A /* WrappedNumberFormatter.swift in Sources */,
2E8719CD27FB0D3B0082C926 /* CurrencySelectionView.swift in Sources */,
@ -1329,6 +1338,7 @@
F93673D62742CB840099C6AF /* Previews.swift in Sources */,
0D18581B272728D60046B928 /* PhraseChip.swift in Sources */,
9E7FE0F92832824C00C374E8 /* QRCodeScanView.swift in Sources */,
9E3911482848EEB90073DD9A /* RecoveryPhraseRandomizer.swift in Sources */,
0DF482BA2787ADA800EB37D6 /* ConditionalModifier.swift in Sources */,
9E7FE0EC282E7D9400C374E8 /* TransactionState.swift in Sources */,
9E2F1C8F280EDE09004E65FE /* Drawer.swift in Sources */,
@ -1342,7 +1352,9 @@
0D7CE63427349B5D0020E050 /* View+WhenDraggable.swift in Sources */,
0D3D04082728B3440032ABC1 /* RecoveryPhraseDisplayView.swift in Sources */,
F9971A5F27680DF600A2DB75 /* ScanView.swift in Sources */,
9E39114C2848EEB90073DD9A /* DatabaseFiles.swift in Sources */,
F9971A4E27680DC400A2DB75 /* AppView.swift in Sources */,
9E3911492848EEB90073DD9A /* URIParser.swift in Sources */,
9E87ADF128363DE400122FCC /* WrappedAudioServices.swift in Sources */,
2EA11F5B27467EF800709571 /* OnboardingFooterView.swift in Sources */,
66D50668271D9B6100E51F0D /* NavigationButtonStyle.swift in Sources */,
@ -1367,9 +1379,8 @@
9E02B5C3280458D2005B809B /* WrappedDerivationTool.swift in Sources */,
F9C165C02740403600592F76 /* TransactionConfirmationView.swift in Sources */,
0DF2DC5427235E3E00FA31E2 /* View+InnerShadow.swift in Sources */,
9E39113F2848EC360073DD9A /* WrappedRecoveryPhraseRandomizer.swift in Sources */,
9EAFEB84280597B700199FC9 /* WrappedSecItem.swift in Sources */,
9E2AC10327DA28200042AA47 /* WalletStorage.swift in Sources */,
9ECAE56827FC713C0089A0EF /* DatabaseFiles.swift in Sources */,
9E5BF6462821028C00BA3F17 /* WrappedUserDefaults.swift in Sources */,
F9971A6B27680E1000A2DB75 /* WalletInfoStore.swift in Sources */,
9E7FE0F628327F6F00C374E8 /* ScanUIView.swift in Sources */,
@ -1391,13 +1402,13 @@
F96B41EB273B50520021B49A /* Strings.swift in Sources */,
2EDA07A227EDE1AE00D6F09B /* TextFieldFooter.swift in Sources */,
F9971A5427680DD000A2DB75 /* ProfileView.swift in Sources */,
9E01F8222833BFAE000EFC57 /* URIParser.swift in Sources */,
F9971A6027680DF600A2DB75 /* ScanStore.swift in Sources */,
9EF8139127F191BF0075AF48 /* WrappedWalletStorage.swift in Sources */,
0DFE93E1272C9ECB000FCCA5 /* RecoveryPhraseBackupView.swift in Sources */,
9E69A24D27FB002800A55317 /* WelcomeStore.swift in Sources */,
F9C165CB2741AB5D00592F76 /* SendFlowView.swift in Sources */,
9E7FE0DD282D298900C374E8 /* ValidationWord.swift in Sources */,
9E39114B2848EEB90073DD9A /* ZCashSDKEnvironment.swift in Sources */,
0D0781C4278750E30083ACD7 /* WelcomeView.swift in Sources */,
F9971A6527680DFE00A2DB75 /* SettingsStore.swift in Sources */,
9EF8139C27F47AED0075AF48 /* InitializationState.swift in Sources */,
@ -1423,6 +1434,7 @@
9E5BF644281FEC9900BA3F17 /* SendTests.swift in Sources */,
0D1C1AA327611EFD0004AF6A /* RecoveryPhraseDisplayReducerTests.swift in Sources */,
9EAFEB822805793200199FC9 /* AppTests.swift in Sources */,
9E391132284644580073DD9A /* AppInitializationTests.swift in Sources */,
9E391124283E4CAC0073DD9A /* ImportWalletTests.swift in Sources */,
9E5BF63F2819542C00BA3F17 /* TransactionHistoryTests.swift in Sources */,
0D4E7A1B26B364180058B01E /* secantTests.swift in Sources */,

View File

@ -0,0 +1,28 @@
//
// RecoveryPhraseRandomizer.swift
// secant-testnet
//
// Created by Lukáš Korba on 01.06.2022.
//
import Foundation
struct RecoveryPhraseRandomizer {
func random(phrase: RecoveryPhrase) -> RecoveryPhraseValidationFlowState {
let missingIndices = randomIndices()
let missingWordChipKind = phrase.words(fromMissingIndices: missingIndices).shuffled()
return RecoveryPhraseValidationFlowState(
phrase: phrase,
missingIndices: missingIndices,
missingWordChips: missingWordChipKind,
validationWords: []
)
}
func randomIndices() -> [Int] {
return (0..<RecoveryPhraseValidationFlowState.phraseChunks).map { _ in
Int.random(in: 0 ..< RecoveryPhraseValidationFlowState.wordGroupSize)
}
}
}

View File

@ -65,6 +65,7 @@ struct AppEnvironment {
let derivationTool: WrappedDerivationTool
let feedbackGenerator: WrappedFeedbackGenerator
let mnemonic: WrappedMnemonic
let recoveryPhraseRandomizer: WrappedRecoveryPhraseRandomizer
let scheduler: AnySchedulerOf<DispatchQueue>
let SDKSynchronizer: WrappedSDKSynchronizer
let walletStorage: WrappedWalletStorage
@ -78,6 +79,7 @@ extension AppEnvironment {
derivationTool: .live(),
feedbackGenerator: .haptic,
mnemonic: .live,
recoveryPhraseRandomizer: .live,
scheduler: DispatchQueue.main.eraseToAnyScheduler(),
SDKSynchronizer: LiveWrappedSDKSynchronizer(),
walletStorage: .live(),
@ -90,6 +92,7 @@ extension AppEnvironment {
derivationTool: .live(derivationTool: DerivationTool(networkType: .mainnet)),
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: DispatchQueue.main.eraseToAnyScheduler(),
SDKSynchronizer: LiveWrappedSDKSynchronizer(),
walletStorage: .live(),
@ -199,7 +202,7 @@ extension AppReducer {
let recoveryPhrase = RecoveryPhrase(words: phraseWords)
state.phraseDisplayState.phrase = recoveryPhrase
state.phraseValidationState = RecoveryPhraseValidationFlowState.random(phrase: recoveryPhrase)
state.phraseValidationState = environment.recoveryPhraseRandomizer.random(recoveryPhrase)
landingRoute = .phraseDisplay
} catch {
// TODO: - merge with issue 201 (https://github.com/zcash/secant-ios-wallet/issues/201) and its Error States
@ -226,7 +229,7 @@ extension AppReducer {
let randomPhraseWords = try environment.mnemonic.asWords(randomPhrase)
let recoveryPhrase = RecoveryPhrase(words: randomPhraseWords)
state.phraseDisplayState.phrase = recoveryPhrase
state.phraseValidationState = RecoveryPhraseValidationFlowState.random(phrase: recoveryPhrase)
state.phraseValidationState = environment.recoveryPhraseRandomizer.random(recoveryPhrase)
return .concatenate(
Effect(value: .initializeSDK),
@ -340,7 +343,15 @@ extension AppReducer {
private static let phraseValidationReducer: AppReducer = RecoveryPhraseValidationFlowReducer.default.pullback(
state: \AppState.phraseValidationState,
action: /AppAction.phraseValidation,
environment: { _ in RecoveryPhraseValidationFlowEnvironment.demo }
environment: { environment in
RecoveryPhraseValidationFlowEnvironment(
scheduler: environment.scheduler,
newPhrase: { Effect(value: .init(words: RecoveryPhrase.placeholder.words)) },
pasteboard: .test,
feedbackGenerator: .silent,
recoveryPhraseRandomizer: environment.recoveryPhraseRandomizer
)
}
)
private static let phraseDisplayReducer: AppReducer = RecoveryPhraseDisplayReducer.default.pullback(
@ -448,7 +459,7 @@ extension AppState {
onboardingState: .init(
importWalletState: .placeholder
),
phraseValidationState: RecoveryPhraseValidationFlowState.placeholder,
phraseValidationState: .placeholder,
phraseDisplayState: RecoveryPhraseDisplayState(
phrase: .placeholder
),

View File

@ -38,11 +38,6 @@ struct RecoveryPhraseDisplayEnvironment {
}
extension RecoveryPhraseDisplayEnvironment {
private struct DemoPasteboard {
static var general = Self()
var string: String?
}
static let demo = Self(
scheduler: DispatchQueue.main.eraseToAnyScheduler(),
newPhrase: { Effect(value: .init(words: RecoveryPhrase.placeholder.words)) },

View File

@ -45,22 +45,6 @@ struct RecoveryPhraseValidationFlowState: Equatable {
}
}
extension RecoveryPhraseValidationFlowState {
/// creates an initial `RecoveryPhraseValidationState` with no completions and random missing indices.
/// - Note: Use this function to create a random validation puzzle for a given phrase.
static func random(phrase: RecoveryPhrase) -> Self {
let missingIndices = Self.randomIndices()
let missingWordChipKind = phrase.words(fromMissingIndices: missingIndices).shuffled()
return RecoveryPhraseValidationFlowState(
phrase: phrase,
missingIndices: missingIndices,
missingWordChips: missingWordChipKind,
validationWords: []
)
}
}
extension RecoveryPhraseValidationFlowState {
/// Given an array of RecoveryPhraseStepCompletion, missing indices, original phrase and the number of groups it was split into,
/// assembly the resulting phrase. This comes up with the "proposed solution" for the recovery phrase validation challenge.
@ -95,12 +79,6 @@ extension RecoveryPhraseValidationFlowState {
return words
}
static func randomIndices() -> [Int] {
return (0..<phraseChunks).map { _ in
Int.random(in: 0 ..< wordGroupSize)
}
}
}
extension RecoveryPhrase.Group {
@ -137,26 +115,24 @@ struct RecoveryPhraseValidationFlowEnvironment {
let newPhrase: () -> Effect<RecoveryPhrase, RecoveryPhraseError>
let pasteboard: WrappedPasteboard
let feedbackGenerator: WrappedFeedbackGenerator
let recoveryPhraseRandomizer: WrappedRecoveryPhraseRandomizer
}
extension RecoveryPhraseValidationFlowEnvironment {
private struct DemoPasteboard {
static var general = Self()
var string: String?
}
static let demo = Self(
scheduler: DispatchQueue.main.eraseToAnyScheduler(),
newPhrase: { Effect(value: .init(words: RecoveryPhrase.placeholder.words)) },
pasteboard: .test,
feedbackGenerator: .silent
feedbackGenerator: .silent,
recoveryPhraseRandomizer: .live
)
static let live = Self(
scheduler: DispatchQueue.main.eraseToAnyScheduler(),
newPhrase: { Effect(value: .init(words: RecoveryPhrase.placeholder.words)) },
pasteboard: .live,
feedbackGenerator: .haptic
feedbackGenerator: .haptic,
recoveryPhraseRandomizer: .live
)
}
@ -166,7 +142,7 @@ extension RecoveryPhraseValidationFlowReducer {
static let `default` = RecoveryPhraseValidationFlowReducer { state, action, environment in
switch action {
case .reset:
state = RecoveryPhraseValidationFlowState.random(phrase: state.phrase)
state = environment.recoveryPhraseRandomizer.random(state.phrase)
state.route = .validation
// FIXME: Resetting causes route to be nil = preamble screen, hence setting the .validation. The transition back is not animated though (issue 186)
@ -207,7 +183,7 @@ extension RecoveryPhraseValidationFlowReducer {
case .updateRoute(let route):
guard let route = route else {
state = RecoveryPhraseValidationFlowState.random(phrase: state.phrase)
state = environment.recoveryPhraseRandomizer.random(state.phrase)
return .none
}
state.route = route
@ -267,7 +243,18 @@ extension RecoveryPhraseValidationFlowViewStore {
// MARK: - Placeholders
extension RecoveryPhraseValidationFlowState {
static let placeholder = RecoveryPhraseValidationFlowState.random(phrase: .placeholder)
static let placeholder = RecoveryPhraseValidationFlowState(
phrase: .placeholder,
missingIndices: [2, 0, 3, 5],
missingWordChips: [
.unassigned(word: "thank"),
.unassigned(word: "morning"),
.unassigned(word: "boil"),
.unassigned(word: "garlic")
],
validationWords: [],
route: nil
)
static let placeholderStep1 = RecoveryPhraseValidationFlowState(
phrase: .placeholder,
@ -337,8 +324,6 @@ extension RecoveryPhraseValidationFlowState {
}
extension RecoveryPhraseValidationFlowStore {
private static let scheduler = DispatchQueue.main
static let demo = Store(
initialState: .placeholder,
reducer: .default,

View File

@ -16,7 +16,7 @@ struct Zatoshi {
static var zero: Zatoshi { Zatoshi() }
static var decimalHandler = NSDecimalNumberHandler(
static let decimalHandler = NSDecimalNumberHandler(
roundingMode: NSDecimalNumber.RoundingMode.bankers,
scale: 8,
raiseOnExactness: true,

View File

@ -0,0 +1,18 @@
//
// WrappedRecoveryPhraseRandomizer.swift
// secant-testnet
//
// Created by Lukáš Korba on 01.06.2022.
//
import Foundation
struct WrappedRecoveryPhraseRandomizer {
let random: (RecoveryPhrase) -> RecoveryPhraseValidationFlowState
}
extension WrappedRecoveryPhraseRandomizer {
static let live = WrappedRecoveryPhraseRandomizer(
random: { RecoveryPhraseRandomizer().random(phrase: $0) }
)
}

View File

@ -263,15 +263,6 @@ class MockWrappedSDKSynchronizer: WrappedSDKSynchronizer {
}
func prepareWith(initializer: Initializer) throws {
synchronizer = try SDKSynchronizer(initializer: initializer)
NotificationCenter.default.publisher(for: .synchronizerSynced)
.receive(on: DispatchQueue.main)
.sink(receiveValue: { [weak self] _ in
self?.synchronizerSynced()
})
.store(in: &cancellables)
try synchronizer?.prepare()
}

View File

@ -0,0 +1,263 @@
//
// AppInitializationTests.swift
// secantTests
//
// Created by Lukáš Korba on 31.05.2022.
//
import XCTest
@testable import secant_testnet
import ComposableArchitecture
class AppInitializationTests: XCTestCase {
var storage = WalletStorage(secItem: .live)
override func setUp() {
super.setUp()
storage.zcashStoredWalletPrefix = "test_app_"
storage.deleteData(forKey: WalletStorage.Constants.zcashStoredWallet)
}
/// This integration test starts with finishing the app launch and triggering bunch of initialization proceedures.
/// 1. The app calls .checkWalletInitialization delayed by 0.02 seconds to ensure keychain is successfuly operational.
/// 2. The .respondToWalletInitializationState is triggered to decide the state of the wallet.
/// 3. The .initializeSDK is triggered to set the state of the app and preparing the synchronizer.
/// 4. The .checkBackupPhraseValidation is triggered to check the validation state.
/// 5. The user hasn't finished the backup phrase test so the display phrase is presented.
func testDidFinishLaunching_to_InitializedWallet() throws {
// the test needs to pass the exportWallet() so we simulate some in the keychain
try storage.importWallet(bip39: "one two three", birthday: nil)
// setup the store and environment to be fully mocked
let testScheduler = DispatchQueue.test
let recoveryPhrase = RecoveryPhrase(words: try WrappedMnemonic.mock.randomMnemonicWords())
let phraseValidationState = RecoveryPhraseValidationFlowState(
phrase: recoveryPhrase,
missingIndices: [2, 0, 3, 5],
missingWordChips: [
.unassigned(word: "voice"),
.empty,
.unassigned(word: "survey"),
.unassigned(word: "spread")
],
validationWords: [
.init(groupIndex: 2, word: "dizzy")
],
route: nil
)
let recoveryPhraseRandomizer = WrappedRecoveryPhraseRandomizer(
random: { _ in
let missingIndices = [2, 0, 3, 5]
let missingWordChipKind = [
PhraseChip.Kind.unassigned(
word: "voice",
color: Asset.Colors.Buttons.activeButton.color
),
PhraseChip.Kind.empty,
PhraseChip.Kind.unassigned(
word: "survey",
color: Asset.Colors.Buttons.activeButton.color
),
PhraseChip.Kind.unassigned(
word: "spread",
color: Asset.Colors.Buttons.activeButton.color
)
]
return RecoveryPhraseValidationFlowState(
phrase: recoveryPhrase,
missingIndices: missingIndices,
missingWordChips: missingWordChipKind,
validationWords: [
ValidationWord(
groupIndex: 2,
word: "dizzy"
)
]
)
}
)
let emptyURL = URL(fileURLWithPath: "")
let dbFiles = WrappedDatabaseFiles(
documentsDirectory: { emptyURL },
cacheDbURLFor: { _ in emptyURL },
dataDbURLFor: { _ in emptyURL },
outputParamsURLFor: { _ in emptyURL },
pendingDbURLFor: { _ in emptyURL },
spendParamsURLFor: { _ in emptyURL },
areDbFilesPresentFor: { _ in true },
nukeDbFilesFor: { _ in throw DatabaseFiles.DatabaseFilesError.nukeFiles }
)
let appState = AppState(
homeState: .placeholder,
onboardingState: .init(
importWalletState: .placeholder
),
phraseValidationState: phraseValidationState,
phraseDisplayState: RecoveryPhraseDisplayState(
phrase: recoveryPhrase
),
sandboxState: .placeholder,
welcomeState: .placeholder
)
let testEnvironment = AppEnvironment(
audioServices: .silent,
databaseFiles: dbFiles,
derivationTool: .live(),
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: recoveryPhraseRandomizer,
scheduler: testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: MockWrappedSDKSynchronizer(),
walletStorage: .live(walletStorage: storage),
zcashSDKEnvironment: .mainnet
)
let store = TestStore(
initialState: appState,
reducer: AppReducer.default,
environment: testEnvironment
)
// Root of the test, the app finished the launch process and triggers the checks and initializations.
store.send(.appDelegate(.didFinishLaunching))
// the 0.02 delay ensures keychain is ready
testScheduler.advance(by: 0.02)
// ad 1.
store.receive(.checkWalletInitialization)
// ad 2.
store.receive(.respondToWalletInitializationState(.initialized))
// ad 3.
store.receive(.initializeSDK) { state in
state.storedWallet = StoredWallet(
language: .english,
seedPhrase: "one two three",
version: 1,
hasUserPassedPhraseBackupTest: false
)
}
// ad 4.
store.receive(.checkBackupPhraseValidation) { state in
state.appInitializationState = .initialized
}
// the 3.0 delay ensures the welcome screen is visible till the initialization is done
testScheduler.advance(by: 3.00)
// ad 5.
store.receive(.updateRoute(.phraseDisplay)) { state in
state.prevRoute = .welcome
state.internalRoute = .phraseDisplay
}
}
/// Integration test validating the side effects work together properly when no wallet is stored but database files are present.
/// 1. The app calls .checkWalletInitialization delayed by 0.02 seconds to ensure keychain is successfuly operational.
/// 2. The .respondToWalletInitializationState is triggered to decide the state of the wallet.
func testDidFinishLaunching_to_KeysMissing() throws {
// setup the store and environment to be fully mocked
let testScheduler = DispatchQueue.test
let emptyURL = URL(fileURLWithPath: "")
let dbFiles = WrappedDatabaseFiles(
documentsDirectory: { emptyURL },
cacheDbURLFor: { _ in emptyURL },
dataDbURLFor: { _ in emptyURL },
outputParamsURLFor: { _ in emptyURL },
pendingDbURLFor: { _ in emptyURL },
spendParamsURLFor: { _ in emptyURL },
areDbFilesPresentFor: { _ in true },
nukeDbFilesFor: { _ in throw DatabaseFiles.DatabaseFilesError.nukeFiles }
)
let testEnvironment = AppEnvironment(
audioServices: .silent,
databaseFiles: dbFiles,
derivationTool: .live(),
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: MockWrappedSDKSynchronizer(),
walletStorage: .live(walletStorage: storage),
zcashSDKEnvironment: .mainnet
)
let store = TestStore(
initialState: .placeholder,
reducer: AppReducer.default,
environment: testEnvironment
)
// Root of the test, the app finished the launch process and triggers the checks and initializations.
store.send(.appDelegate(.didFinishLaunching))
// the 0.02 delay ensures keychain is ready
testScheduler.advance(by: 0.02)
// ad 1.
store.receive(.checkWalletInitialization)
// ad 2.
store.receive(.respondToWalletInitializationState(.keysMissing)) { state in
state.appInitializationState = .keysMissing
}
}
/// Integration test validating the side effects work together properly when no wallet is stored and no database files are present.
/// 1. The app calls .checkWalletInitialization delayed by 0.02 seconds to ensure keychain is successfuly operational.
/// 2. The .respondToWalletInitializationState is triggered to decide the state of the wallet.
/// 3. The wallet is no prosent, onboarding flow is triggered.
func testDidFinishLaunching_to_Uninitialized() throws {
// setup the store and environment to be fully mocked
let testScheduler = DispatchQueue.test
let testEnvironment = AppEnvironment(
audioServices: .silent,
databaseFiles: .throwing,
derivationTool: .live(),
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: MockWrappedSDKSynchronizer(),
walletStorage: .live(walletStorage: storage),
zcashSDKEnvironment: .mainnet
)
let store = TestStore(
initialState: .placeholder,
reducer: AppReducer.default,
environment: testEnvironment
)
// Root of the test, the app finished the launch process and triggers the checks and initializations.
store.send(.appDelegate(.didFinishLaunching))
// the 0.02 delay ensures keychain is ready
// the 3.0 delay ensures the welcome screen is visible till the initialization check is done
testScheduler.advance(by: 3.02)
// ad 1.
store.receive(.checkWalletInitialization)
// ad 2.
store.receive(.respondToWalletInitializationState(.uninitialized))
// ad 3.
store.receive(.updateRoute(.onboarding)) { state in
state.prevRoute = .welcome
state.internalRoute = .onboarding
}
}
}

View File

@ -18,6 +18,7 @@ class AppTests: XCTestCase {
derivationTool: .live(),
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: TestWrappedSDKSynchronizer(),
walletStorage: .throwing,
@ -31,6 +32,7 @@ class AppTests: XCTestCase {
derivationTool: .live(),
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: DispatchQueue.test.eraseToAnyScheduler(),
SDKSynchronizer: TestWrappedSDKSynchronizer(),
walletStorage: .throwing,
@ -55,6 +57,7 @@ class AppTests: XCTestCase {
derivationTool: .live(),
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: Self.testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: TestWrappedSDKSynchronizer(),
walletStorage: .throwing,
@ -79,6 +82,7 @@ class AppTests: XCTestCase {
derivationTool: .live(),
feedbackGenerator: .silent,
mnemonic: .mock,
recoveryPhraseRandomizer: .live,
scheduler: Self.testScheduler.eraseToAnyScheduler(),
SDKSynchronizer: TestWrappedSDKSynchronizer(),
walletStorage: .throwing,

View File

@ -16,7 +16,8 @@ class RecoveryPhraseValidationTests: XCTestCase {
scheduler: testScheduler.eraseToAnyScheduler(),
newPhrase: { Effect(value: .init(words: RecoveryPhrase.placeholder.words)) },
pasteboard: .test,
feedbackGenerator: .silent
feedbackGenerator: .silent,
recoveryPhraseRandomizer: .live
)
func testPickWordsFromMissingIndices() throws {