From 2cf28b0ebf773bf00906af17106dbf96c80c7bcf Mon Sep 17 00:00:00 2001 From: matiasbzurovski <164921079+matiasbzurovski@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:01:52 +0200 Subject: [PATCH] Check with Sargon if Gateway is already added (#1204) --- RadixWallet.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 4 +-- .../GatewaysClient+Interface.swift | 6 ++++- .../GatewaysClient/GatewaysClient+Live.swift | 3 +++ .../GatewaysClient/GatewaysClient+Test.swift | 6 +++-- .../AddNewGateway/AddNewGateway+Reducer.swift | 5 ++-- .../GatewaySettingsFeatureTests.swift | 26 +++++++++++++++++++ 7 files changed, 43 insertions(+), 9 deletions(-) diff --git a/RadixWallet.xcodeproj/project.pbxproj b/RadixWallet.xcodeproj/project.pbxproj index 515c556456..ae8c753d04 100644 --- a/RadixWallet.xcodeproj/project.pbxproj +++ b/RadixWallet.xcodeproj/project.pbxproj @@ -8578,7 +8578,7 @@ repositoryURL = "https://github.com/radixdlt/sargon"; requirement = { kind = exactVersion; - version = 1.0.22; + version = 1.0.23; }; }; 8318BB172BC8403800057BCB /* XCRemoteSwiftPackageReference "swift-custom-dump" */ = { diff --git a/RadixWallet.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/RadixWallet.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 9f52c099db..e83911dc18 100644 --- a/RadixWallet.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/RadixWallet.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -114,8 +114,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/radixdlt/sargon", "state" : { - "revision" : "32fe10386b8b5f439420aa7f7c71c19e7da1bb1f", - "version" : "1.0.22" + "revision" : "eb02bd76b1261527938aac2cd982b8e1b505acf2", + "version" : "1.0.23" } }, { diff --git a/RadixWallet/Clients/GatewaysClient/GatewaysClient+Interface.swift b/RadixWallet/Clients/GatewaysClient/GatewaysClient+Interface.swift index c9bd008a04..a5b350d2e1 100644 --- a/RadixWallet/Clients/GatewaysClient/GatewaysClient+Interface.swift +++ b/RadixWallet/Clients/GatewaysClient/GatewaysClient+Interface.swift @@ -10,6 +10,7 @@ public struct GatewaysClient: Sendable { public var addGateway: AddGateway public var removeGateway: RemoveGateway public var changeGateway: ChangeGateway + public var hasGateway: HasGateway public init( currentGatewayValues: @escaping CurrentGatewayValues, @@ -18,7 +19,8 @@ public struct GatewaysClient: Sendable { getCurrentGateway: @escaping GetCurrentGateway, addGateway: @escaping AddGateway, removeGateway: @escaping RemoveGateway, - changeGateway: @escaping ChangeGateway + changeGateway: @escaping ChangeGateway, + hasGateway: @escaping HasGateway ) { self.currentGatewayValues = currentGatewayValues self.gatewaysValues = gatewaysValues @@ -27,6 +29,7 @@ public struct GatewaysClient: Sendable { self.addGateway = addGateway self.removeGateway = removeGateway self.changeGateway = changeGateway + self.hasGateway = hasGateway } } @@ -38,6 +41,7 @@ extension GatewaysClient { public typealias AddGateway = @Sendable (Gateway) async throws -> Void public typealias RemoveGateway = @Sendable (Gateway) async throws -> Void public typealias ChangeGateway = @Sendable (Gateway) async throws -> Void + public typealias HasGateway = @Sendable (Url) async -> Bool } extension GatewaysClient { diff --git a/RadixWallet/Clients/GatewaysClient/GatewaysClient+Live.swift b/RadixWallet/Clients/GatewaysClient/GatewaysClient+Live.swift index b3fc40122b..f0855258c6 100644 --- a/RadixWallet/Clients/GatewaysClient/GatewaysClient+Live.swift +++ b/RadixWallet/Clients/GatewaysClient/GatewaysClient+Live.swift @@ -26,6 +26,9 @@ extension GatewaysClient: DependencyKey { try await profileStore.updating { profile in try profile.changeGateway(to: gateway) } + }, + hasGateway: { url in + await appPreferencesClient.getPreferences().hasGateway(with: url) } ) } diff --git a/RadixWallet/Clients/GatewaysClient/GatewaysClient+Test.swift b/RadixWallet/Clients/GatewaysClient/GatewaysClient+Test.swift index 95c9b98fb2..635698379f 100644 --- a/RadixWallet/Clients/GatewaysClient/GatewaysClient+Test.swift +++ b/RadixWallet/Clients/GatewaysClient/GatewaysClient+Test.swift @@ -17,7 +17,8 @@ extension GatewaysClient: TestDependencyKey { getCurrentGateway: unimplemented("\(Self.self).getCurrentGateway"), addGateway: unimplemented("\(Self.self).addGateway"), removeGateway: unimplemented("\(Self.self).removeGateway"), - changeGateway: unimplemented("\(Self.self).changeGateway") + changeGateway: unimplemented("\(Self.self).changeGateway"), + hasGateway: unimplemented("\(Self.self).hasGateway") ) public static let noop = Self( @@ -27,6 +28,7 @@ extension GatewaysClient: TestDependencyKey { getCurrentGateway: { .nebunet }, addGateway: { _ in }, removeGateway: { _ in }, - changeGateway: { _ in } + changeGateway: { _ in }, + hasGateway: { _ in false } ) } diff --git a/RadixWallet/Features/GatewaySettingsFeature/Children/AddNewGateway/AddNewGateway+Reducer.swift b/RadixWallet/Features/GatewaySettingsFeature/Children/AddNewGateway/AddNewGateway+Reducer.swift index 2a08f18586..5a8e59572a 100644 --- a/RadixWallet/Features/GatewaySettingsFeature/Children/AddNewGateway/AddNewGateway+Reducer.swift +++ b/RadixWallet/Features/GatewaySettingsFeature/Children/AddNewGateway/AddNewGateway+Reducer.swift @@ -56,9 +56,8 @@ public struct AddNewGateway: Sendable, FeatureReducer { guard let url = URL(string: state.inputtedURL)?.httpsURL else { return .none } return .run { send in - let gateways = await gatewaysClient.getAllGateways() - let duplicate = gateways.first(where: { $0.url == url }) - if let _ = duplicate { + let hasGateway = await gatewaysClient.hasGateway(url) + if hasGateway { await send(.internal(.showDuplicateURLError)) } else { await send(.internal(.validateNewGateway(url))) diff --git a/RadixWalletTests/Features/GatewaySettingsFeatureTests/GatewaySettingsFeatureTests.swift b/RadixWalletTests/Features/GatewaySettingsFeatureTests/GatewaySettingsFeatureTests.swift index 042bfd8004..0b2443cb0e 100644 --- a/RadixWalletTests/Features/GatewaySettingsFeatureTests/GatewaySettingsFeatureTests.swift +++ b/RadixWalletTests/Features/GatewaySettingsFeatureTests/GatewaySettingsFeatureTests.swift @@ -190,6 +190,7 @@ final class GatewaySettingsFeatureTests: TestCase { $0.gatewaysClient.getAllGateways = { allGateways } + $0.gatewaysClient.hasGateway = { _ in false } } store.exhaustivity = .off @@ -199,6 +200,31 @@ final class GatewaySettingsFeatureTests: TestCase { await store.receive(.internal(.addGatewayResult(.success(.instance)))) await store.receive(.delegate(.dismiss)) } + + func test_whenNewAddGatewayButtonIsTapped_duplicateGatewayIsRejected() async throws { + // given + let allGateways: Gateways = [.nebunet, .hammunet, .enkinet, .mardunet] + let validURL = URL.previewValue.absoluteString + var initialState = AddNewGateway.State() + initialState.inputtedURL = validURL + + let store = TestStore( + initialState: initialState, + reducer: AddNewGateway.init + ) { + $0.gatewaysClient.getAllGateways = { + allGateways + } + $0.gatewaysClient.hasGateway = { url in + url.absoluteString == validURL + } + } + store.exhaustivity = .off + + // when + await store.send(.view(.addNewGatewayButtonTapped)) + await store.receive(.internal(.showDuplicateURLError)) + } } #if DEBUG