From 85c3721cc0460f57bd843ec3526bd6153b1984a7 Mon Sep 17 00:00:00 2001 From: Radmir Date: Fri, 23 Jan 2026 12:31:19 +0500 Subject: [PATCH 1/2] Update wallet sync logic and add onboarding tests Moved initial synchronization completion to CreateWalletModel and removed it from ImportWalletViewModel. Added unit tests for both CreateWalletModel and ImportWalletViewModel to verify address status and asset loading preferences. Updated test dependencies in Package.swift. --- Features/Onboarding/Package.swift | 3 ++ .../ViewModels/CreateWalletModel.swift | 1 + .../ViewModels/ImportWalletViewModel.swift | 2 -- .../Tests/CreateWalletModelTests.swift | 30 ++++++++++++++++ .../Tests/ImportWalletViewModelTests.swift | 35 +++++++++++++++++++ .../Sources/WalletPreferences.swift | 4 --- 6 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 Features/Onboarding/Tests/CreateWalletModelTests.swift create mode 100644 Features/Onboarding/Tests/ImportWalletViewModelTests.swift diff --git a/Features/Onboarding/Package.swift b/Features/Onboarding/Package.swift index c53a4b502..678981399 100644 --- a/Features/Onboarding/Package.swift +++ b/Features/Onboarding/Package.swift @@ -54,6 +54,9 @@ let package = Package( dependencies: [ "Onboarding", .product(name: "WalletServiceTestKit", package: "FeatureServices"), + .product(name: "KeystoreTestKit", package: "Keystore"), + .product(name: "NameServiceTestKit", package: "ChainServices"), + .product(name: "StoreTestKit", package: "Store"), ], path: "Tests" ) diff --git a/Features/Onboarding/Sources/ViewModels/CreateWalletModel.swift b/Features/Onboarding/Sources/ViewModels/CreateWalletModel.swift index 8853ebb01..ea721407c 100644 --- a/Features/Onboarding/Sources/ViewModels/CreateWalletModel.swift +++ b/Features/Onboarding/Sources/ViewModels/CreateWalletModel.swift @@ -53,6 +53,7 @@ extension CreateWalletModel { source: .create ) walletService.acceptTerms() + WalletPreferences(walletId: wallet.walletId).completeInitialSynchronization() return wallet } diff --git a/Features/Onboarding/Sources/ViewModels/ImportWalletViewModel.swift b/Features/Onboarding/Sources/ViewModels/ImportWalletViewModel.swift index 6f9c5fc39..b3d745e9f 100644 --- a/Features/Onboarding/Sources/ViewModels/ImportWalletViewModel.swift +++ b/Features/Onboarding/Sources/ViewModels/ImportWalletViewModel.swift @@ -6,7 +6,6 @@ import Primitives import WalletService import AvatarService import PrimitivesComponents -import Preferences import enum Keystore.KeystoreImportType @Observable @@ -51,7 +50,6 @@ extension ImportWalletViewModel { func importWallet(data: WalletImportData) async throws -> Wallet { let wallet = try await walletService.loadOrCreateWallet(name: data.name, type: data.keystoreType, source: .import) walletService.acceptTerms() - WalletPreferences(walletId: wallet.walletId).completeInitialSynchronization() try await walletService.setCurrent(wallet: wallet) return wallet } diff --git a/Features/Onboarding/Tests/CreateWalletModelTests.swift b/Features/Onboarding/Tests/CreateWalletModelTests.swift new file mode 100644 index 000000000..91dc7ab3c --- /dev/null +++ b/Features/Onboarding/Tests/CreateWalletModelTests.swift @@ -0,0 +1,30 @@ +// Copyright (c). Gem Wallet. All rights reserved. + +import Foundation +import Testing +import Preferences +import Keystore +import KeystoreTestKit +import StoreTestKit +import WalletServiceTestKit + +@testable import Onboarding + +@MainActor +struct CreateWalletModelTests { + + @Test + func createWalletSetsAddressStatus() async throws { + let model = CreateWalletModel( + walletService: .mock(keystore: KeystoreMock()), + avatarService: .init(store: .mock()), + onComplete: nil + ) + + let wallet = try await model.createWallet(words: LocalKeystore.words) + let preferences = WalletPreferences(walletId: wallet.walletId) + + #expect(preferences.completeInitialAddressStatus) + #expect(preferences.completeInitialLoadAssets) + } +} diff --git a/Features/Onboarding/Tests/ImportWalletViewModelTests.swift b/Features/Onboarding/Tests/ImportWalletViewModelTests.swift new file mode 100644 index 000000000..114647244 --- /dev/null +++ b/Features/Onboarding/Tests/ImportWalletViewModelTests.swift @@ -0,0 +1,35 @@ +// Copyright (c). Gem Wallet. All rights reserved. + +import Foundation +import Testing +import Preferences +import Keystore +import KeystoreTestKit +import NameServiceTestKit +import StoreTestKit +import WalletServiceTestKit + +@testable import Onboarding + +@MainActor +struct ImportWalletViewModelTests { + + @Test + func importWalletDoesNotSetAddressStatus() async throws { + let model = ImportWalletViewModel( + walletService: .mock(keystore: KeystoreMock()), + avatarService: .init(store: .mock()), + nameService: .mock(), + onComplete: nil + ) + + let wallet = try await model.importWallet(data: WalletImportData( + name: "Test", + keystoreType: .phrase(words: LocalKeystore.words, chains: [.tron]) + )) + let preferences = WalletPreferences(walletId: wallet.walletId) + + #expect(preferences.completeInitialAddressStatus == false) + #expect(preferences.completeInitialLoadAssets == false) + } +} diff --git a/Packages/Preferences/Sources/WalletPreferences.swift b/Packages/Preferences/Sources/WalletPreferences.swift index 4d412dfef..df9b6ca32 100644 --- a/Packages/Preferences/Sources/WalletPreferences.swift +++ b/Packages/Preferences/Sources/WalletPreferences.swift @@ -44,10 +44,6 @@ public final class WalletPreferences: @unchecked Sendable { get { defaults.bool(forKey: Keys.completeInitialAddressStatus) } } - public var isCompleteInitialSynchronization: Bool { - completeInitialAddressStatus && completeInitialLoadAssets - } - public func completeInitialSynchronization() { completeInitialAddressStatus = true completeInitialLoadAssets = true From c59e4992b2ca3bdac63a873dd8e42a2f7e257156 Mon Sep 17 00:00:00 2001 From: Radmir Date: Fri, 23 Jan 2026 15:23:44 +0500 Subject: [PATCH 2/2] Add PrimitivesTestKit to test dependencies and update test setup Added PrimitivesTestKit to the OnboardingTest target dependencies in Package.swift. Updated ImportWalletViewModelTests to use PrimitivesTestKit and refactored test setup for importWalletDoesNotSetAddressStatus to clear preferences before running assertions. --- Features/Onboarding/Package.swift | 1 + .../Onboarding/Tests/CreateWalletModelTests.swift | 2 ++ .../Onboarding/Tests/ImportWalletViewModelTests.swift | 11 ++++++++--- .../WalletTab/Tests/WalletSceneViewModelTests.swift | 5 ++++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Features/Onboarding/Package.swift b/Features/Onboarding/Package.swift index 678981399..dfbee8625 100644 --- a/Features/Onboarding/Package.swift +++ b/Features/Onboarding/Package.swift @@ -53,6 +53,7 @@ let package = Package( name: "OnboardingTest", dependencies: [ "Onboarding", + .product(name: "PrimitivesTestKit", package: "Primitives"), .product(name: "WalletServiceTestKit", package: "FeatureServices"), .product(name: "KeystoreTestKit", package: "Keystore"), .product(name: "NameServiceTestKit", package: "ChainServices"), diff --git a/Features/Onboarding/Tests/CreateWalletModelTests.swift b/Features/Onboarding/Tests/CreateWalletModelTests.swift index 91dc7ab3c..5500050f8 100644 --- a/Features/Onboarding/Tests/CreateWalletModelTests.swift +++ b/Features/Onboarding/Tests/CreateWalletModelTests.swift @@ -26,5 +26,7 @@ struct CreateWalletModelTests { #expect(preferences.completeInitialAddressStatus) #expect(preferences.completeInitialLoadAssets) + + preferences.clear() } } diff --git a/Features/Onboarding/Tests/ImportWalletViewModelTests.swift b/Features/Onboarding/Tests/ImportWalletViewModelTests.swift index 114647244..82f7f3163 100644 --- a/Features/Onboarding/Tests/ImportWalletViewModelTests.swift +++ b/Features/Onboarding/Tests/ImportWalletViewModelTests.swift @@ -2,9 +2,11 @@ import Foundation import Testing +import Primitives import Preferences import Keystore import KeystoreTestKit +import PrimitivesTestKit import NameServiceTestKit import StoreTestKit import WalletServiceTestKit @@ -16,18 +18,21 @@ struct ImportWalletViewModelTests { @Test func importWalletDoesNotSetAddressStatus() async throws { + let keystore = KeystoreMock() + let preferences = WalletPreferences(walletId: Wallet.mock().walletId) + preferences.clear() + let model = ImportWalletViewModel( - walletService: .mock(keystore: KeystoreMock()), + walletService: .mock(keystore: keystore), avatarService: .init(store: .mock()), nameService: .mock(), onComplete: nil ) - let wallet = try await model.importWallet(data: WalletImportData( + _ = try await model.importWallet(data: WalletImportData( name: "Test", keystoreType: .phrase(words: LocalKeystore.words, chains: [.tron]) )) - let preferences = WalletPreferences(walletId: wallet.walletId) #expect(preferences.completeInitialAddressStatus == false) #expect(preferences.completeInitialLoadAssets == false) diff --git a/Features/WalletTab/Tests/WalletSceneViewModelTests.swift b/Features/WalletTab/Tests/WalletSceneViewModelTests.swift index 84232528c..3166d0d3e 100644 --- a/Features/WalletTab/Tests/WalletSceneViewModelTests.swift +++ b/Features/WalletTab/Tests/WalletSceneViewModelTests.swift @@ -16,9 +16,12 @@ import PreferencesTestKit struct WalletSceneViewModelTests { @Test func isLoading() { + let preferences = WalletPreferences(walletId: Wallet.mock().walletId) + preferences.clear() + let model = WalletSceneViewModel.mock() #expect(model.isLoadingAssets == false) - + model.shouldStartLoadingAssets() #expect(model.isLoadingAssets)