From 2a07770d5164ccda77b1937f3693ec133906c6e9 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 09:41:33 -0600 Subject: [PATCH 01/54] Add EligibilityRequest file --- PayPal.xcodeproj/project.pbxproj | 18 +++++++++++++++--- .../Eligibility/EligibilityRequest.swift | 8 ++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 Sources/CorePayments/Eligibility/EligibilityRequest.swift diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index 4e6722c4..56c052f1 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 3BE7386D2B9A670400598F05 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3BE738662B9A593100598F05 /* PrivacyInfo.xcprivacy */; }; 3D1763A22720722A00652E1C /* CardResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D1763A12720722A00652E1C /* CardResult.swift */; }; 3DC42BA927187E8300B71645 /* ErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC42BA827187E8300B71645 /* ErrorResponse.swift */; }; + 45B063AF2C40349300E743F2 /* EligibilityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; 8008D2052A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */; }; 80132D7229008C000088D30D /* TestShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E743F8270E40CE00BACECA /* TestShared.framework */; }; @@ -244,6 +245,7 @@ 3D25238127344F330099E4EB /* NativeCheckoutStartable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NativeCheckoutStartable.swift; path = Sources/PayPalNativePayments/NativeCheckoutStartable.swift; sourceTree = SOURCE_ROOT; }; 3D25238B273979170099E4EB /* MockNativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNativeCheckoutProvider.swift; sourceTree = ""; }; 3DC42BA827187E8300B71645 /* ErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResponse.swift; sourceTree = ""; }; + 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityRequest.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutOrdersAPI_Tests.swift; sourceTree = ""; }; 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalCoreConstants.swift; sourceTree = ""; }; @@ -534,6 +536,14 @@ path = Models; sourceTree = ""; }; + 45B063AD2C40346500E743F2 /* Eligibility */ = { + isa = PBXGroup; + children = ( + 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */, + ); + path = Eligibility; + sourceTree = ""; + }; 8036C1DE270F9BCF00C0F091 /* PaymentsCoreTests */ = { isa = PBXGroup; children = ( @@ -582,14 +592,15 @@ 80B9F85226B8750000D67843 /* CorePayments */ = { isa = PBXGroup; children = ( - BE4F784827EB629100FF4C0E /* WebAuthenticationSession.swift */, + 807C5E6829102D9800ECECD8 /* AnalyticsEventData.swift */, 06CE009826F3D1660000CC46 /* CoreConfig.swift */, + 80DB2F752980795D00CFB86A /* CorePaymentsError.swift */, 065A4DBB26FCD8080007014A /* CoreSDKError.swift */, + 45B063AD2C40346500E743F2 /* Eligibility */, BEA100E526EF9EDA0036A6A5 /* Networking */, - 807C5E6829102D9800ECECD8 /* AnalyticsEventData.swift */, 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */, - 80DB2F752980795D00CFB86A /* CorePaymentsError.swift */, 3BE738632B9A4A4500598F05 /* PrivacyInfo.xcprivacy */, + BE4F784827EB629100FF4C0E /* WebAuthenticationSession.swift */, ); name = CorePayments; path = Sources/CorePayments; @@ -1432,6 +1443,7 @@ 3BDB34942A80CE6E008100D7 /* CardVaultRequest.swift in Sources */, 80B8B2FC2A8EBBFD00AB60CD /* VaultPaymentTokensAPI.swift in Sources */, CB4BE27D2847AF6F00EA2DD1 /* SCA.swift in Sources */, + 45B063AF2C40349300E743F2 /* EligibilityRequest.swift in Sources */, 0647E70E2714962800F8E517 /* Address.swift in Sources */, BC7F8123275FC1350011EDC8 /* CardRequest.swift in Sources */, ); diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift new file mode 100644 index 00000000..15ae285c --- /dev/null +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -0,0 +1,8 @@ +// +// EligibilityRequest.swift +// CardPayments +// +// Created by Herrera, Ricardo on 11/07/24. +// + +import Foundation From f50baa8ef99518fc617f9b6aba9f65f8280bbca2 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 09:41:50 -0600 Subject: [PATCH 02/54] Add EligibilityResult file --- PayPal.xcodeproj/project.pbxproj | 4 ++++ Sources/CorePayments/Eligibility/EligibilityResult.swift | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 Sources/CorePayments/Eligibility/EligibilityResult.swift diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index 56c052f1..7ca0609c 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ 3D1763A22720722A00652E1C /* CardResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D1763A12720722A00652E1C /* CardResult.swift */; }; 3DC42BA927187E8300B71645 /* ErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC42BA827187E8300B71645 /* ErrorResponse.swift */; }; 45B063AF2C40349300E743F2 /* EligibilityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */; }; + 45B063B12C4034B700E743F2 /* EligibilityResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B02C4034B700E743F2 /* EligibilityResult.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; 8008D2052A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */; }; 80132D7229008C000088D30D /* TestShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E743F8270E40CE00BACECA /* TestShared.framework */; }; @@ -246,6 +247,7 @@ 3D25238B273979170099E4EB /* MockNativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNativeCheckoutProvider.swift; sourceTree = ""; }; 3DC42BA827187E8300B71645 /* ErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResponse.swift; sourceTree = ""; }; 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityRequest.swift; sourceTree = ""; }; + 45B063B02C4034B700E743F2 /* EligibilityResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResult.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutOrdersAPI_Tests.swift; sourceTree = ""; }; 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalCoreConstants.swift; sourceTree = ""; }; @@ -540,6 +542,7 @@ isa = PBXGroup; children = ( 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */, + 45B063B02C4034B700E743F2 /* EligibilityResult.swift */, ); path = Eligibility; sourceTree = ""; @@ -1435,6 +1438,7 @@ BC0A82A5270B9533006E9A21 /* ConfirmPaymentSourceRequest.swift in Sources */, CB4BE2802847F01000EA2DD1 /* CardDelegate.swift in Sources */, 3BD82DBB2A835AF900CBE764 /* UpdateSetupTokenResponse.swift in Sources */, + 45B063B12C4034B700E743F2 /* EligibilityResult.swift in Sources */, 80E8DAE126B8784600FAFC3F /* Card.swift in Sources */, 3B22E8B82A841AEA00962E34 /* CardVaultResult.swift in Sources */, CBC16DD529E99B4600307117 /* PaymentSource.swift in Sources */, diff --git a/Sources/CorePayments/Eligibility/EligibilityResult.swift b/Sources/CorePayments/Eligibility/EligibilityResult.swift new file mode 100644 index 00000000..b3949c15 --- /dev/null +++ b/Sources/CorePayments/Eligibility/EligibilityResult.swift @@ -0,0 +1,8 @@ +// +// EligibilityResult.swift +// CardPayments +// +// Created by Herrera, Ricardo on 11/07/24. +// + +import Foundation From e564f3e4920ad169c2885eb9d1c5b0656c72ed09 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 09:50:19 -0600 Subject: [PATCH 03/54] Add EligibilityClient file --- PayPal.xcodeproj/project.pbxproj | 12 ++++++++---- .../CorePayments/Eligibility/EligibilityClient.swift | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 Sources/CorePayments/Eligibility/EligibilityClient.swift diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index 7ca0609c..e23f577e 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -35,8 +35,9 @@ 3BE7386D2B9A670400598F05 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3BE738662B9A593100598F05 /* PrivacyInfo.xcprivacy */; }; 3D1763A22720722A00652E1C /* CardResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D1763A12720722A00652E1C /* CardResult.swift */; }; 3DC42BA927187E8300B71645 /* ErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC42BA827187E8300B71645 /* ErrorResponse.swift */; }; - 45B063AF2C40349300E743F2 /* EligibilityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */; }; - 45B063B12C4034B700E743F2 /* EligibilityResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B02C4034B700E743F2 /* EligibilityResult.swift */; }; + 45B063B42C4035E200E743F2 /* EligibilityClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */; }; + 45B063B52C4035E500E743F2 /* EligibilityResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B02C4034B700E743F2 /* EligibilityResult.swift */; }; + 45B063B62C4035EA00E743F2 /* EligibilityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; 8008D2052A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */; }; 80132D7229008C000088D30D /* TestShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E743F8270E40CE00BACECA /* TestShared.framework */; }; @@ -248,6 +249,7 @@ 3DC42BA827187E8300B71645 /* ErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResponse.swift; sourceTree = ""; }; 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityRequest.swift; sourceTree = ""; }; 45B063B02C4034B700E743F2 /* EligibilityResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResult.swift; sourceTree = ""; }; + 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutOrdersAPI_Tests.swift; sourceTree = ""; }; 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalCoreConstants.swift; sourceTree = ""; }; @@ -543,6 +545,7 @@ children = ( 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */, 45B063B02C4034B700E743F2 /* EligibilityResult.swift */, + 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */, ); path = Eligibility; sourceTree = ""; @@ -1373,8 +1376,10 @@ 807D56B02A869F97009E591D /* GraphQLErrorResponse.swift in Sources */, 80DB2F762980795D00CFB86A /* CorePaymentsError.swift in Sources */, 06CE009926F3D1660000CC46 /* CoreConfig.swift in Sources */, + 45B063B42C4035E200E743F2 /* EligibilityClient.swift in Sources */, BEA100EC26EFA7790036A6A5 /* HTTPMethod.swift in Sources */, BEA100EE26EFA7990036A6A5 /* HTTPHeader.swift in Sources */, + 45B063B62C4035EA00E743F2 /* EligibilityRequest.swift in Sources */, CB4BE27E2847EA7D00EA2DD1 /* WebAuthenticationSession.swift in Sources */, 80E2FDC12A83535A0045593D /* TrackingEventsAPI.swift in Sources */, BEA100F226EFA7DE0036A6A5 /* Environment.swift in Sources */, @@ -1383,6 +1388,7 @@ BC04837427B2FC7300FA7B46 /* URLSession+URLSessionProtocol.swift in Sources */, 80E2FDC32A8354AD0045593D /* RESTRequest.swift in Sources */, 3DC42BA927187E8300B71645 /* ErrorResponse.swift in Sources */, + 45B063B52C4035E500E743F2 /* EligibilityResult.swift in Sources */, 807D56AC2A869044009E591D /* GraphQLHTTPPostBody.swift in Sources */, 804E62822937EBCE004B9FEF /* HTTP.swift in Sources */, BC04836F27B2FB3600FA7B46 /* URLSessionProtocol.swift in Sources */, @@ -1438,7 +1444,6 @@ BC0A82A5270B9533006E9A21 /* ConfirmPaymentSourceRequest.swift in Sources */, CB4BE2802847F01000EA2DD1 /* CardDelegate.swift in Sources */, 3BD82DBB2A835AF900CBE764 /* UpdateSetupTokenResponse.swift in Sources */, - 45B063B12C4034B700E743F2 /* EligibilityResult.swift in Sources */, 80E8DAE126B8784600FAFC3F /* Card.swift in Sources */, 3B22E8B82A841AEA00962E34 /* CardVaultResult.swift in Sources */, CBC16DD529E99B4600307117 /* PaymentSource.swift in Sources */, @@ -1447,7 +1452,6 @@ 3BDB34942A80CE6E008100D7 /* CardVaultRequest.swift in Sources */, 80B8B2FC2A8EBBFD00AB60CD /* VaultPaymentTokensAPI.swift in Sources */, CB4BE27D2847AF6F00EA2DD1 /* SCA.swift in Sources */, - 45B063AF2C40349300E743F2 /* EligibilityRequest.swift in Sources */, 0647E70E2714962800F8E517 /* Address.swift in Sources */, BC7F8123275FC1350011EDC8 /* CardRequest.swift in Sources */, ); diff --git a/Sources/CorePayments/Eligibility/EligibilityClient.swift b/Sources/CorePayments/Eligibility/EligibilityClient.swift new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Sources/CorePayments/Eligibility/EligibilityClient.swift @@ -0,0 +1 @@ + From 193ab5cb956361541b3e62db5e47d50b0c3162f4 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 09:51:12 -0600 Subject: [PATCH 04/54] Add EligilibilityClient method --- Sources/CorePayments/Eligibility/EligibilityClient.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Sources/CorePayments/Eligibility/EligibilityClient.swift b/Sources/CorePayments/Eligibility/EligibilityClient.swift index 8b137891..323509dc 100644 --- a/Sources/CorePayments/Eligibility/EligibilityClient.swift +++ b/Sources/CorePayments/Eligibility/EligibilityClient.swift @@ -1 +1,9 @@ +import Foundation +public class EligibilityClient { + + public func check(_ eligibilityRequest: EligibilityRequest) -> EligibilityResult { + // TODO: - Add logic + .init(isVenmoEligible: false) + } +} From de28ce681fd71aab7e5e72014210ea0a325b51db Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 09:51:27 -0600 Subject: [PATCH 05/54] Add Result properties --- .../CorePayments/Eligibility/EligibilityResult.swift | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityResult.swift b/Sources/CorePayments/Eligibility/EligibilityResult.swift index b3949c15..e7110948 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResult.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResult.swift @@ -1,8 +1,6 @@ -// -// EligibilityResult.swift -// CardPayments -// -// Created by Herrera, Ricardo on 11/07/24. -// - import Foundation + +public struct EligibilityResult { + + public let isVenmoEligible: Bool +} From fc37fd69888a4f5a060b336688319a094b1571f3 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 09:51:35 -0600 Subject: [PATCH 06/54] Add request properties --- .../Eligibility/EligibilityRequest.swift | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift index 15ae285c..5bdf5e32 100644 --- a/Sources/CorePayments/Eligibility/EligibilityRequest.swift +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -1,8 +1,16 @@ -// -// EligibilityRequest.swift -// CardPayments -// -// Created by Herrera, Ricardo on 11/07/24. -// - import Foundation + +public struct EligibilityRequest { + + public let clientId: String + public let intent: String + public let currency: String + public let enableFunding: [String] + + public init(clientId: String, intent: String, currency: String, enableFunding: [String]) { + self.clientId = clientId + self.intent = intent + self.currency = currency + self.enableFunding = enableFunding + } +} From de7bf1a082947960789d4fd9b6b76cd02db13094 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 10:47:18 -0600 Subject: [PATCH 07/54] Add EligibilityVariables file --- PayPal.xcodeproj/project.pbxproj | 4 ++++ .../CorePayments/Eligibility/EligibilityVariables.swift | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 Sources/CorePayments/Eligibility/EligibilityVariables.swift diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index e23f577e..7f94518d 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ 45B063B42C4035E200E743F2 /* EligibilityClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */; }; 45B063B52C4035E500E743F2 /* EligibilityResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B02C4034B700E743F2 /* EligibilityResult.swift */; }; 45B063B62C4035EA00E743F2 /* EligibilityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */; }; + 45B063B82C40440000E743F2 /* EligibilityVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B72C40440000E743F2 /* EligibilityVariables.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; 8008D2052A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */; }; 80132D7229008C000088D30D /* TestShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E743F8270E40CE00BACECA /* TestShared.framework */; }; @@ -250,6 +251,7 @@ 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityRequest.swift; sourceTree = ""; }; 45B063B02C4034B700E743F2 /* EligibilityResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResult.swift; sourceTree = ""; }; 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient.swift; sourceTree = ""; }; + 45B063B72C40440000E743F2 /* EligibilityVariables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityVariables.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutOrdersAPI_Tests.swift; sourceTree = ""; }; 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalCoreConstants.swift; sourceTree = ""; }; @@ -546,6 +548,7 @@ 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */, 45B063B02C4034B700E743F2 /* EligibilityResult.swift */, 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */, + 45B063B72C40440000E743F2 /* EligibilityVariables.swift */, ); path = Eligibility; sourceTree = ""; @@ -1373,6 +1376,7 @@ 807C5E6929102D9800ECECD8 /* AnalyticsEventData.swift in Sources */, 80E237DF2A84434B00FF18CA /* HTTPRequest.swift in Sources */, 8021B69029144E6D000FBC54 /* PayPalCoreConstants.swift in Sources */, + 45B063B82C40440000E743F2 /* EligibilityVariables.swift in Sources */, 807D56B02A869F97009E591D /* GraphQLErrorResponse.swift in Sources */, 80DB2F762980795D00CFB86A /* CorePaymentsError.swift in Sources */, 06CE009926F3D1660000CC46 /* CoreConfig.swift in Sources */, diff --git a/Sources/CorePayments/Eligibility/EligibilityVariables.swift b/Sources/CorePayments/Eligibility/EligibilityVariables.swift new file mode 100644 index 00000000..4ed7299f --- /dev/null +++ b/Sources/CorePayments/Eligibility/EligibilityVariables.swift @@ -0,0 +1,8 @@ +// +// EligibilityVariables.swift +// CorePayments +// +// Created by Herrera, Ricardo on 11/07/24. +// + +import Foundation From e0573a1620dccd83c5fd2b18ed05a186aa46b749 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 10:51:41 -0600 Subject: [PATCH 08/54] Remove header --- .../CorePayments/Eligibility/EligibilityVariables.swift | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityVariables.swift b/Sources/CorePayments/Eligibility/EligibilityVariables.swift index 4ed7299f..fecc4ab4 100644 --- a/Sources/CorePayments/Eligibility/EligibilityVariables.swift +++ b/Sources/CorePayments/Eligibility/EligibilityVariables.swift @@ -1,8 +1 @@ -// -// EligibilityVariables.swift -// CorePayments -// -// Created by Herrera, Ricardo on 11/07/24. -// - import Foundation From c0000b410824b4b7277758ba179bb45ce1273bed Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 10:53:25 -0600 Subject: [PATCH 09/54] Add EligibilityAPI --- PayPal.xcodeproj/project.pbxproj | 4 ++++ Sources/CorePayments/Eligibility/EligibilityAPI.swift | 1 + 2 files changed, 5 insertions(+) create mode 100644 Sources/CorePayments/Eligibility/EligibilityAPI.swift diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index 7f94518d..aebca402 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -39,6 +39,7 @@ 45B063B52C4035E500E743F2 /* EligibilityResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B02C4034B700E743F2 /* EligibilityResult.swift */; }; 45B063B62C4035EA00E743F2 /* EligibilityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */; }; 45B063B82C40440000E743F2 /* EligibilityVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B72C40440000E743F2 /* EligibilityVariables.swift */; }; + 45B063BA2C40456F00E743F2 /* EligibilityAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; 8008D2052A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */; }; 80132D7229008C000088D30D /* TestShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E743F8270E40CE00BACECA /* TestShared.framework */; }; @@ -252,6 +253,7 @@ 45B063B02C4034B700E743F2 /* EligibilityResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResult.swift; sourceTree = ""; }; 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient.swift; sourceTree = ""; }; 45B063B72C40440000E743F2 /* EligibilityVariables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityVariables.swift; sourceTree = ""; }; + 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutOrdersAPI_Tests.swift; sourceTree = ""; }; 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalCoreConstants.swift; sourceTree = ""; }; @@ -549,6 +551,7 @@ 45B063B02C4034B700E743F2 /* EligibilityResult.swift */, 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */, 45B063B72C40440000E743F2 /* EligibilityVariables.swift */, + 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */, ); path = Eligibility; sourceTree = ""; @@ -1389,6 +1392,7 @@ BEA100F226EFA7DE0036A6A5 /* Environment.swift in Sources */, BEA100F026EFA7C20036A6A5 /* NetworkingClientError.swift in Sources */, 804E628629380B04004B9FEF /* AnalyticsService.swift in Sources */, + 45B063BA2C40456F00E743F2 /* EligibilityAPI.swift in Sources */, BC04837427B2FC7300FA7B46 /* URLSession+URLSessionProtocol.swift in Sources */, 80E2FDC32A8354AD0045593D /* RESTRequest.swift in Sources */, 3DC42BA927187E8300B71645 /* ErrorResponse.swift in Sources */, diff --git a/Sources/CorePayments/Eligibility/EligibilityAPI.swift b/Sources/CorePayments/Eligibility/EligibilityAPI.swift new file mode 100644 index 00000000..fecc4ab4 --- /dev/null +++ b/Sources/CorePayments/Eligibility/EligibilityAPI.swift @@ -0,0 +1 @@ +import Foundation From 8a9f7e0ebb393a615b2d4706f38acfb5e8a3c4b6 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 11:39:47 -0600 Subject: [PATCH 10/54] Sort directory --- PayPal.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index aebca402..76e7fb4d 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -547,11 +547,11 @@ 45B063AD2C40346500E743F2 /* Eligibility */ = { isa = PBXGroup; children = ( + 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */, + 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */, 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */, 45B063B02C4034B700E743F2 /* EligibilityResult.swift */, - 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */, 45B063B72C40440000E743F2 /* EligibilityVariables.swift */, - 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */, ); path = Eligibility; sourceTree = ""; From fa4863c59aa4c96e84693f23e049db4ce3b45ea2 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 11:46:21 -0600 Subject: [PATCH 11/54] Add properties and initializers --- .../CorePayments/Eligibility/EligibilityAPI.swift | 15 +++++++++++++++ .../Eligibility/EligibilityClient.swift | 6 +++--- .../Eligibility/EligibilityRequest.swift | 6 +++--- .../Eligibility/EligibilityVariables.swift | 13 +++++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityAPI.swift b/Sources/CorePayments/Eligibility/EligibilityAPI.swift index fecc4ab4..ef646037 100644 --- a/Sources/CorePayments/Eligibility/EligibilityAPI.swift +++ b/Sources/CorePayments/Eligibility/EligibilityAPI.swift @@ -1 +1,16 @@ import Foundation + +final class EligibilityAPI { + + // MARK: - Private Propertires + + private let coreConfig: CoreConfig + private let networkingClient: NetworkingClient + + // MARK: - Initializer + + init(coreConfig: CoreConfig) { + self.coreConfig = coreConfig + self.networkingClient = NetworkingClient(coreConfig: coreConfig) + } +} diff --git a/Sources/CorePayments/Eligibility/EligibilityClient.swift b/Sources/CorePayments/Eligibility/EligibilityClient.swift index 323509dc..30a4c707 100644 --- a/Sources/CorePayments/Eligibility/EligibilityClient.swift +++ b/Sources/CorePayments/Eligibility/EligibilityClient.swift @@ -1,9 +1,9 @@ import Foundation -public class EligibilityClient { +public final class EligibilityClient { - public func check(_ eligibilityRequest: EligibilityRequest) -> EligibilityResult { - // TODO: - Add logic + public func check(_ eligibilityRequest: EligibilityRequest) async throws -> EligibilityResult { + //TODO: - Add logic .init(isVenmoEligible: false) } } diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift index 5bdf5e32..d17fa948 100644 --- a/Sources/CorePayments/Eligibility/EligibilityRequest.swift +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -2,13 +2,13 @@ import Foundation public struct EligibilityRequest { - public let clientId: String public let intent: String public let currency: String public let enableFunding: [String] - public init(clientId: String, intent: String, currency: String, enableFunding: [String]) { - self.clientId = clientId + // MARK: - Initializer + + public init(intent: String, currency: String, enableFunding: [String]) { self.intent = intent self.currency = currency self.enableFunding = enableFunding diff --git a/Sources/CorePayments/Eligibility/EligibilityVariables.swift b/Sources/CorePayments/Eligibility/EligibilityVariables.swift index fecc4ab4..8ab85393 100644 --- a/Sources/CorePayments/Eligibility/EligibilityVariables.swift +++ b/Sources/CorePayments/Eligibility/EligibilityVariables.swift @@ -1 +1,14 @@ import Foundation + +struct EligibilityVariables { + + private let eligibilityRequest: EligibilityRequest + private let clientID: String + + // MARK: - Initializer + + init(eligibilityRequest: EligibilityRequest, clientID: String) { + self.eligibilityRequest = eligibilityRequest + self.clientID = clientID + } +} From e36689084c3420d2f3ec617a93234aa580452afc Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 11:58:21 -0600 Subject: [PATCH 12/54] Add tests files --- PayPal.xcodeproj/project.pbxproj | 20 +++++++++++++++++-- .../Eligibility/EligibilityAPI_Tests.swift | 5 +++++ .../Eligibility/EligibilityClient_Tests.swift | 5 +++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift create mode 100644 UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index 76e7fb4d..37c4dc85 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -40,6 +40,8 @@ 45B063B62C4035EA00E743F2 /* EligibilityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */; }; 45B063B82C40440000E743F2 /* EligibilityVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B72C40440000E743F2 /* EligibilityVariables.swift */; }; 45B063BA2C40456F00E743F2 /* EligibilityAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */; }; + 45B063BD2C40545100E743F2 /* EligibilityClient_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */; }; + 45B063BF2C40549000E743F2 /* EligibilityAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; 8008D2052A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */; }; 80132D7229008C000088D30D /* TestShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E743F8270E40CE00BACECA /* TestShared.framework */; }; @@ -254,6 +256,8 @@ 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient.swift; sourceTree = ""; }; 45B063B72C40440000E743F2 /* EligibilityVariables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityVariables.swift; sourceTree = ""; }; 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI.swift; sourceTree = ""; }; + 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient_Tests.swift; sourceTree = ""; }; + 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI_Tests.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutOrdersAPI_Tests.swift; sourceTree = ""; }; 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalCoreConstants.swift; sourceTree = ""; }; @@ -556,18 +560,28 @@ path = Eligibility; sourceTree = ""; }; + 45B063BB2C40542700E743F2 /* Eligibility */ = { + isa = PBXGroup; + children = ( + 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */, + 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */, + ); + path = Eligibility; + sourceTree = ""; + }; 8036C1DE270F9BCF00C0F091 /* PaymentsCoreTests */ = { isa = PBXGroup; children = ( 808EEA80291321FE001B6765 /* AnalyticsEventData_Tests.swift */, 802C4A752945676E00896A5D /* AnalyticsService_Tests.swift */, - 8036C1E0270F9BE700C0F091 /* NetworkingClient_Tests.swift */, + 45B063BB2C40542700E743F2 /* Eligibility */, 8036C1E1270F9BE700C0F091 /* Environment_Tests.swift */, 80FC261C29847AC7008EC841 /* HTTP_Tests.swift */, 8036F87F2A30E492005B6186 /* HTTPResponse_Tests.swift */, 807BF5902A2A5D48002F32B3 /* HTTPResponseParser_Tests.swift */, - 802EFBD92A968BCD00AB709D /* TrackingEventsAPI_Tests.swift */, 80B96AAD2A9806B300C62916 /* Mocks */, + 8036C1E0270F9BE700C0F091 /* NetworkingClient_Tests.swift */, + 802EFBD92A968BCD00AB709D /* TrackingEventsAPI_Tests.swift */, ); path = PaymentsCoreTests; sourceTree = ""; @@ -1363,7 +1377,9 @@ 8036C1E5270F9BE700C0F091 /* Environment_Tests.swift in Sources */, 80B96AAE2A980F6B00C62916 /* MockTrackingEventsAPI.swift in Sources */, 80FC261D29847AC7008EC841 /* HTTP_Tests.swift in Sources */, + 45B063BD2C40545100E743F2 /* EligibilityClient_Tests.swift in Sources */, 802EFBDB2A96B47A00AB709D /* TrackingEventsAPI_Tests.swift in Sources */, + 45B063BF2C40549000E743F2 /* EligibilityAPI_Tests.swift in Sources */, 802C4A762945676E00896A5D /* AnalyticsService_Tests.swift in Sources */, 807BF5912A2A5D48002F32B3 /* HTTPResponseParser_Tests.swift in Sources */, 8036C1E4270F9BE700C0F091 /* NetworkingClient_Tests.swift in Sources */, diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift new file mode 100644 index 00000000..8730f173 --- /dev/null +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift @@ -0,0 +1,5 @@ +import XCTest + +final class EligibilityAPI_Tests: XCTestCase { + // TODO: to be implemented in a future PR +} diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift new file mode 100644 index 00000000..3ff04f48 --- /dev/null +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift @@ -0,0 +1,5 @@ +import XCTest + +final class EligibilityClient_Tests: XCTestCase { + // TODO: to be implemented in a future PR +} From bfd4749fe250d07ce6978d8ec584a24f513d2536 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 12:22:17 -0600 Subject: [PATCH 13/54] Fix lints --- .../PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift | 4 +++- .../Eligibility/EligibilityClient_Tests.swift | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift index 8730f173..6e554dce 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift @@ -1,5 +1,7 @@ import XCTest +@testable import CorePayments -final class EligibilityAPI_Tests: XCTestCase { +class EligibilityAPI_Tests: XCTestCase { + // TODO: to be implemented in a future PR } diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift index 3ff04f48..2f6aa9c5 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift @@ -1,5 +1,7 @@ import XCTest +@testable import CorePayments -final class EligibilityClient_Tests: XCTestCase { +class EligibilityClient_Tests: XCTestCase { + // TODO: to be implemented in a future PR } From a3000a133020bb0bf79710e70198fe769cc8a068 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 11 Jul 2024 12:23:42 -0600 Subject: [PATCH 14/54] Fix lint --- Sources/CorePayments/Eligibility/EligibilityClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityClient.swift b/Sources/CorePayments/Eligibility/EligibilityClient.swift index 30a4c707..bf0fb205 100644 --- a/Sources/CorePayments/Eligibility/EligibilityClient.swift +++ b/Sources/CorePayments/Eligibility/EligibilityClient.swift @@ -3,7 +3,7 @@ import Foundation public final class EligibilityClient { public func check(_ eligibilityRequest: EligibilityRequest) async throws -> EligibilityResult { - //TODO: - Add logic + // TODO: - Add logic .init(isVenmoEligible: false) } } From f63935ddc262bdc9da03fa90758b1a9de9b0d190 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 09:05:31 -0600 Subject: [PATCH 15/54] PR Feedback --- Sources/CorePayments/Eligibility/EligibilityRequest.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift index d17fa948..fa51f04a 100644 --- a/Sources/CorePayments/Eligibility/EligibilityRequest.swift +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -2,9 +2,9 @@ import Foundation public struct EligibilityRequest { - public let intent: String - public let currency: String - public let enableFunding: [String] + let intent: String + let currency: String + let enableFunding: [String] // MARK: - Initializer From fdc17bf8378fa3e431d47a29fdede5bac325b587 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 11:42:38 -0600 Subject: [PATCH 16/54] Conform Encodable and add variable eligibility variables properties --- .../Eligibility/EligibilityVariables.swift | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityVariables.swift b/Sources/CorePayments/Eligibility/EligibilityVariables.swift index 8ab85393..ce280314 100644 --- a/Sources/CorePayments/Eligibility/EligibilityVariables.swift +++ b/Sources/CorePayments/Eligibility/EligibilityVariables.swift @@ -1,9 +1,18 @@ import Foundation -struct EligibilityVariables { +struct EligibilityVariables: Encodable { - private let eligibilityRequest: EligibilityRequest - private let clientID: String + let eligibilityRequest: EligibilityRequest + let clientID: String + + // MARK: - Coding Keys + + private enum CodingKeys: String, CodingKey { + case clientID = "clientId" + case intent + case currency + case enableFunding + } // MARK: - Initializer @@ -11,4 +20,16 @@ struct EligibilityVariables { self.eligibilityRequest = eligibilityRequest self.clientID = clientID } + + // MARK: - Custom Encoder + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(clientID, forKey: .clientID) + try container.encode(eligibilityRequest.intent.rawValue, forKey: .intent) + try container.encode(eligibilityRequest.currency.rawValue, forKey: .currency) + + let enableFunding = eligibilityRequest.enableFunding.compactMap { $0.rawValue } + try container.encode(enableFunding, forKey: .enableFunding) + } } From 26b72e485714c5180fb8abfb633b497f95e2e146 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 11:43:02 -0600 Subject: [PATCH 17/54] Add supported currency type enum --- Sources/CorePayments/Eligibility/SupportedCurrencyType.swift | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Sources/CorePayments/Eligibility/SupportedCurrencyType.swift diff --git a/Sources/CorePayments/Eligibility/SupportedCurrencyType.swift b/Sources/CorePayments/Eligibility/SupportedCurrencyType.swift new file mode 100644 index 00000000..7753cd9c --- /dev/null +++ b/Sources/CorePayments/Eligibility/SupportedCurrencyType.swift @@ -0,0 +1,5 @@ +import Foundation + +enum SupportedCurrencyType: String { + case USD +} From 7fb67651bba840870724faefac93f81311d2a6f7 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 11:43:20 -0600 Subject: [PATCH 18/54] Add eligibility intent enum --- .../CorePayments/Eligibility/EligibilityIntent.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Sources/CorePayments/Eligibility/EligibilityIntent.swift diff --git a/Sources/CorePayments/Eligibility/EligibilityIntent.swift b/Sources/CorePayments/Eligibility/EligibilityIntent.swift new file mode 100644 index 00000000..fc46ad8d --- /dev/null +++ b/Sources/CorePayments/Eligibility/EligibilityIntent.swift @@ -0,0 +1,10 @@ +import Foundation + +enum EligibilityIntent: String { + case SALE + case CAPTURE + case AUTHORIZE + case ORDER + case TOKENIZE + case SUBSCRIPTION +} From 8daa52b872bbc5756f1b3f3bc418df1a8f70c646 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 11:46:33 -0600 Subject: [PATCH 19/54] Add eligibility result properties --- Sources/CorePayments/Eligibility/EligibilityResult.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityResult.swift b/Sources/CorePayments/Eligibility/EligibilityResult.swift index e7110948..2ffb02a8 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResult.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResult.swift @@ -1,6 +1,10 @@ import Foundation public struct EligibilityResult { - + public let isVenmoEligible: Bool + public let isCardEligible: Bool + public let isPayPalEligible: Bool + public let isPayLaterEligible: Bool + public let isCreditEligible: Bool } From 419853595df9a662090b1bec2a648ab87204ebcd Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 11:47:43 -0600 Subject: [PATCH 20/54] Add Eligibility Response object --- .../Eligibility/EligibilityResponse.swift | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Sources/CorePayments/Eligibility/EligibilityResponse.swift diff --git a/Sources/CorePayments/Eligibility/EligibilityResponse.swift b/Sources/CorePayments/Eligibility/EligibilityResponse.swift new file mode 100644 index 00000000..14ffe41c --- /dev/null +++ b/Sources/CorePayments/Eligibility/EligibilityResponse.swift @@ -0,0 +1,51 @@ +import Foundation + +struct EligibilityResponse: Decodable { + + let fundingEligibility: FundingEligibility + + var isVenmoEligible: Bool { + fundingEligibility.venmo.eligible + } + + var isCardEligible: Bool { + fundingEligibility.card.eligible + } + + var isPayPalEligible: Bool { + fundingEligibility.paypal.eligible + } + + var isPayLaterEligible: Bool { + fundingEligibility.paylater.eligible + } + + var isCreditEligible: Bool { + fundingEligibility.credit.eligible + } + + var asResult: EligibilityResult { + .init( + isVenmoEligible: isVenmoEligible, + isCardEligible: isCardEligible, + isPayPalEligible: isPayPalEligible, + isPayLaterEligible: isPayLaterEligible, + isCreditEligible: isCreditEligible + ) + } +} + +struct FundingEligibility: Codable { + + let venmo: SupportedPaymentMethodsTypeEligibility + let card: SupportedPaymentMethodsTypeEligibility + let paypal: SupportedPaymentMethodsTypeEligibility + let paylater: SupportedPaymentMethodsTypeEligibility + let credit: SupportedPaymentMethodsTypeEligibility +} + +struct SupportedPaymentMethodsTypeEligibility: Codable { + + let eligible: Bool + let reasons: [String]? +} From c1b1a75c263d003ce5b306fb92a71e6084329c0f Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 11:49:36 -0600 Subject: [PATCH 21/54] Sort files Eligibility directory --- PayPal.xcodeproj/project.pbxproj | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index 37c4dc85..f60ab870 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -42,6 +42,10 @@ 45B063BA2C40456F00E743F2 /* EligibilityAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */; }; 45B063BD2C40545100E743F2 /* EligibilityClient_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */; }; 45B063BF2C40549000E743F2 /* EligibilityAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */; }; + 45B063C12C41D08400E743F2 /* EligibilityResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */; }; + 45B063C32C41E73A00E743F2 /* SupportedCurrencyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C22C41E73A00E743F2 /* SupportedCurrencyType.swift */; }; + 45B063C52C41E76500E743F2 /* SupportedPaymentMethodsType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */; }; + 45B063C72C41E7AA00E743F2 /* EligibilityIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; 8008D2052A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */; }; 80132D7229008C000088D30D /* TestShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E743F8270E40CE00BACECA /* TestShared.framework */; }; @@ -258,6 +262,10 @@ 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI.swift; sourceTree = ""; }; 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient_Tests.swift; sourceTree = ""; }; 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI_Tests.swift; sourceTree = ""; }; + 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResponse.swift; sourceTree = ""; }; + 45B063C22C41E73A00E743F2 /* SupportedCurrencyType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedCurrencyType.swift; sourceTree = ""; }; + 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SupportedPaymentMethodsType.swift; path = ../../../../Documents/SupportedPaymentMethodsType.swift; sourceTree = ""; }; + 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityIntent.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutOrdersAPI_Tests.swift; sourceTree = ""; }; 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalCoreConstants.swift; sourceTree = ""; }; @@ -553,9 +561,13 @@ children = ( 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */, 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */, + 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */, 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */, + 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */, 45B063B02C4034B700E743F2 /* EligibilityResult.swift */, 45B063B72C40440000E743F2 /* EligibilityVariables.swift */, + 45B063C22C41E73A00E743F2 /* SupportedCurrencyType.swift */, + 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */, ); path = Eligibility; sourceTree = ""; @@ -1399,14 +1411,17 @@ 807D56B02A869F97009E591D /* GraphQLErrorResponse.swift in Sources */, 80DB2F762980795D00CFB86A /* CorePaymentsError.swift in Sources */, 06CE009926F3D1660000CC46 /* CoreConfig.swift in Sources */, + 45B063C32C41E73A00E743F2 /* SupportedCurrencyType.swift in Sources */, 45B063B42C4035E200E743F2 /* EligibilityClient.swift in Sources */, BEA100EC26EFA7790036A6A5 /* HTTPMethod.swift in Sources */, BEA100EE26EFA7990036A6A5 /* HTTPHeader.swift in Sources */, 45B063B62C4035EA00E743F2 /* EligibilityRequest.swift in Sources */, CB4BE27E2847EA7D00EA2DD1 /* WebAuthenticationSession.swift in Sources */, + 45B063C12C41D08400E743F2 /* EligibilityResponse.swift in Sources */, 80E2FDC12A83535A0045593D /* TrackingEventsAPI.swift in Sources */, BEA100F226EFA7DE0036A6A5 /* Environment.swift in Sources */, BEA100F026EFA7C20036A6A5 /* NetworkingClientError.swift in Sources */, + 45B063C72C41E7AA00E743F2 /* EligibilityIntent.swift in Sources */, 804E628629380B04004B9FEF /* AnalyticsService.swift in Sources */, 45B063BA2C40456F00E743F2 /* EligibilityAPI.swift in Sources */, BC04837427B2FC7300FA7B46 /* URLSession+URLSessionProtocol.swift in Sources */, @@ -1414,6 +1429,7 @@ 3DC42BA927187E8300B71645 /* ErrorResponse.swift in Sources */, 45B063B52C4035E500E743F2 /* EligibilityResult.swift in Sources */, 807D56AC2A869044009E591D /* GraphQLHTTPPostBody.swift in Sources */, + 45B063C52C41E76500E743F2 /* SupportedPaymentMethodsType.swift in Sources */, 804E62822937EBCE004B9FEF /* HTTP.swift in Sources */, BC04836F27B2FB3600FA7B46 /* URLSessionProtocol.swift in Sources */, 065A4DBC26FCD8090007014A /* CoreSDKError.swift in Sources */, From 3d417948abd11118fbc7e9d471698935ba152bfe Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 12:17:10 -0600 Subject: [PATCH 22/54] Update eligibility request with enum types --- .../Eligibility/EligibilityRequest.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift index fa51f04a..e1847700 100644 --- a/Sources/CorePayments/Eligibility/EligibilityRequest.swift +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -2,15 +2,15 @@ import Foundation public struct EligibilityRequest { - let intent: String - let currency: String - let enableFunding: [String] + let intent: EligibilityIntent + let currency: SupportedCurrencyType + let enableFunding: [SupportedPaymentMethodsType] // MARK: - Initializer - public init(intent: String, currency: String, enableFunding: [String]) { - self.intent = intent - self.currency = currency - self.enableFunding = enableFunding + public init() { + self.intent = .CAPTURE + self.currency = .USD + self.enableFunding = [.VENMO] } } From 7ff6bb1de425130387fe9dfd85318ef425a7a425 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 12:17:52 -0600 Subject: [PATCH 23/54] Add parameters and initializer on Client --- .../Eligibility/EligibilityClient.swift | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityClient.swift b/Sources/CorePayments/Eligibility/EligibilityClient.swift index bf0fb205..795264cd 100644 --- a/Sources/CorePayments/Eligibility/EligibilityClient.swift +++ b/Sources/CorePayments/Eligibility/EligibilityClient.swift @@ -2,8 +2,15 @@ import Foundation public final class EligibilityClient { - public func check(_ eligibilityRequest: EligibilityRequest) async throws -> EligibilityResult { - // TODO: - Add logic - .init(isVenmoEligible: false) + private let config: CoreConfig + private let eligibilityAPI: EligibilityAPI + + public init(config: CoreConfig) { + self.config = config + self.eligibilityAPI = EligibilityAPI(coreConfig: config) + } + + public func check(_ eligibilityRequest: EligibilityRequest = .init()) async throws -> EligibilityResult { + try await eligibilityAPI.check(eligibilityRequest).asResult } } From 1a34e59e4bccfa244283799404bf0b4bc63019b1 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 12:18:27 -0600 Subject: [PATCH 24/54] Add API logic --- .../Eligibility/EligibilityAPI.swift | 57 ++++++++ .../Eligibility/EligibilityAPI_Tests.swift | 126 +++++++++++++++++- 2 files changed, 182 insertions(+), 1 deletion(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityAPI.swift b/Sources/CorePayments/Eligibility/EligibilityAPI.swift index ef646037..8f4b108e 100644 --- a/Sources/CorePayments/Eligibility/EligibilityAPI.swift +++ b/Sources/CorePayments/Eligibility/EligibilityAPI.swift @@ -1,5 +1,6 @@ import Foundation +/// API that return merchant's eligibility for different payment methods: Venmo, PayPal, PayPal Credit, Pay Later & credit card final class EligibilityAPI { // MARK: - Private Propertires @@ -9,8 +10,64 @@ final class EligibilityAPI { // MARK: - Initializer + /// Initialize the eligibility API to check for payment methods eligibility + /// - Parameter coreConfig: configuration object init(coreConfig: CoreConfig) { self.coreConfig = coreConfig self.networkingClient = NetworkingClient(coreConfig: coreConfig) } + + /// Exposed for injecting MockNetworkingClient in tests + init(coreConfig: CoreConfig, networkingClient: NetworkingClient) { + self.coreConfig = coreConfig + self.networkingClient = networkingClient + } + + /// Checks merchants eligibility for different payment methods. + /// - Returns: An `EligibilityResponse` containing the result of the eligibility check. + func check(_ eligibilityRequest: EligibilityRequest) async throws -> EligibilityResponse { + let variables = EligibilityVariables(eligibilityRequest: eligibilityRequest, clientID: coreConfig.clientID) + let graphQLRequest = GraphQLRequest(query: Self.rawQuery, variables: variables) + let httpResponse = try await networkingClient.fetch(request: graphQLRequest) + + return try HTTPResponseParser().parseGraphQL(httpResponse, as: EligibilityResponse.self) + } +} + +extension EligibilityAPI { + + static let rawQuery = """ + query getEligibility( + $clientId: String!, + $intent: FundingEligibilityIntent!, + $currency: SupportedCountryCurrencies!, + $enableFunding: [SupportedPaymentMethodsType] + ){ + fundingEligibility( + clientId: $clientId, + intent: $intent + currency: $currency, + enableFunding: $enableFunding){ + venmo{ + eligible + reasons + } + card{ + eligible + } + paypal{ + eligible + reasons + } + paylater{ + eligible + reasons + } + credit{ + eligible + reasons + } + } + } + """ } diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift index 6e554dce..93d0ebfc 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift @@ -1,7 +1,131 @@ import XCTest @testable import CorePayments +@testable import TestShared class EligibilityAPI_Tests: XCTestCase { - // TODO: to be implemented in a future PR + let mockClientID = "mockClientId" + let mockURLSession = MockURLSession() + let eligibilityRequest = EligibilityRequest() + + var sut: EligibilityAPI! + var coreConfig: CoreConfig! + var mockNetworkingClient: MockNetworkingClient! + + override func setUp() { + super.setUp() + coreConfig = CoreConfig(clientID: mockClientID, environment: .sandbox) + let mockHTTP = MockHTTP(coreConfig: coreConfig) + mockNetworkingClient = MockNetworkingClient(http: mockHTTP) + sut = EligibilityAPI(coreConfig: coreConfig, networkingClient: mockNetworkingClient) + } + + override func tearDown() { + coreConfig = nil + mockNetworkingClient = nil + sut = nil + super.tearDown() + } + + func testCheckSuccess() async throws { + let rawQuery = """ + query getEligibility( + $clientId: String!, + $intent: FundingEligibilityIntent!, + $currency: SupportedCountryCurrencies!, + $enableFunding: [SupportedPaymentMethodsType] + ){ + fundingEligibility( + clientId: $clientId, + intent: $intent + currency: $currency, + enableFunding: $enableFunding){ + venmo{ + eligible + reasons + } + card{ + eligible + } + paypal{ + eligible + reasons + } + paylater{ + eligible + reasons + } + credit{ + eligible + reasons + } + } + } + """ + + _ = try? await sut.check(eligibilityRequest) + + XCTAssertEqual(mockNetworkingClient.capturedGraphQLRequest?.query, rawQuery) + XCTAssertNil(mockNetworkingClient.capturedGraphQLRequest?.queryNameForURL) + + let variables = mockNetworkingClient.capturedGraphQLRequest?.variables as! EligibilityVariables + XCTAssertEqual(variables.clientID, mockClientID) + XCTAssertEqual(variables.eligibilityRequest.currency.rawValue, "USD") + XCTAssertEqual(variables.eligibilityRequest.intent.rawValue, "CAPTURE") + } + + func testUpdateSetupToken_whenNetworkingClientError_bubblesError() async { + mockNetworkingClient.stubHTTPError = CoreSDKError(code: 123, domain: "api-client-error", errorDescription: "error-desc") + + do { + _ = try await sut.check(eligibilityRequest) + XCTFail("Expected error throw.") + } catch { + let error = error as! CoreSDKError + XCTAssertEqual(error.domain, "api-client-error") + XCTAssertEqual(error.code, 123) + XCTAssertEqual(error.localizedDescription, "error-desc") + } + } + + func testUpdateSetupToken_whenSuccess_returnsParsedUpdateSetupTokenResponse() async throws { + let successsResponseJSON = """ + { + "data": { + "fundingEligibility": { + "venmo": { + "eligible": true, + "reasons": [] + }, + "card": { + "eligible": true + }, + "paypal": { + "eligible": true, + "reasons": [] + }, + "paylater": { + "eligible": true, + "reasons": [] + }, + "credit": { + "eligible": false, + "reasons": ["INELIGIBLE DUE TO PAYLATER ELIGIBLE"] + } + } + } + } + """ + + let data = successsResponseJSON.data(using: .utf8) + let stubbedHTTPResponse = HTTPResponse(status: 200, body: data) + mockNetworkingClient.stubHTTPResponse = stubbedHTTPResponse + + let response = try await sut.check(eligibilityRequest) + XCTAssertTrue(response.isVenmoEligible) + XCTAssertTrue(response.isCardEligible) + XCTAssertTrue(response.isPayPalEligible) + XCTAssertTrue(response.isPayLaterEligible) + XCTAssertFalse(response.isCreditEligible) + } } From 4a87950a767a750f3efd91dabda89a6fb3a04a5a Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:41:27 -0600 Subject: [PATCH 25/54] Add mock and remove intent enum --- PayPal.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index f60ab870..0c51d7aa 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -43,9 +43,9 @@ 45B063BD2C40545100E743F2 /* EligibilityClient_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */; }; 45B063BF2C40549000E743F2 /* EligibilityAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */; }; 45B063C12C41D08400E743F2 /* EligibilityResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */; }; - 45B063C32C41E73A00E743F2 /* SupportedCurrencyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C22C41E73A00E743F2 /* SupportedCurrencyType.swift */; }; 45B063C52C41E76500E743F2 /* SupportedPaymentMethodsType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */; }; 45B063C72C41E7AA00E743F2 /* EligibilityIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */; }; + 45B063CA2C459F9900E743F2 /* MockEligibilityAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C92C459F9900E743F2 /* MockEligibilityAPI.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; 8008D2052A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */; }; 80132D7229008C000088D30D /* TestShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80E743F8270E40CE00BACECA /* TestShared.framework */; }; @@ -263,9 +263,9 @@ 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient_Tests.swift; sourceTree = ""; }; 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI_Tests.swift; sourceTree = ""; }; 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResponse.swift; sourceTree = ""; }; - 45B063C22C41E73A00E743F2 /* SupportedCurrencyType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedCurrencyType.swift; sourceTree = ""; }; 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SupportedPaymentMethodsType.swift; path = ../../../../Documents/SupportedPaymentMethodsType.swift; sourceTree = ""; }; 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityIntent.swift; sourceTree = ""; }; + 45B063C92C459F9900E743F2 /* MockEligibilityAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockEligibilityAPI.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 8008D2042A9E54FF0003CAF4 /* CheckoutOrdersAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutOrdersAPI_Tests.swift; sourceTree = ""; }; 8021B68F29144E6D000FBC54 /* PayPalCoreConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalCoreConstants.swift; sourceTree = ""; }; @@ -566,7 +566,6 @@ 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */, 45B063B02C4034B700E743F2 /* EligibilityResult.swift */, 45B063B72C40440000E743F2 /* EligibilityVariables.swift */, - 45B063C22C41E73A00E743F2 /* SupportedCurrencyType.swift */, 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */, ); path = Eligibility; @@ -623,6 +622,7 @@ isa = PBXGroup; children = ( 802EFBD72A9685DF00AB709D /* MockTrackingEventsAPI.swift */, + 45B063C92C459F9900E743F2 /* MockEligibilityAPI.swift */, ); path = Mocks; sourceTree = ""; @@ -1387,6 +1387,7 @@ files = ( 808EEA81291321FE001B6765 /* AnalyticsEventData_Tests.swift in Sources */, 8036C1E5270F9BE700C0F091 /* Environment_Tests.swift in Sources */, + 45B063CA2C459F9900E743F2 /* MockEligibilityAPI.swift in Sources */, 80B96AAE2A980F6B00C62916 /* MockTrackingEventsAPI.swift in Sources */, 80FC261D29847AC7008EC841 /* HTTP_Tests.swift in Sources */, 45B063BD2C40545100E743F2 /* EligibilityClient_Tests.swift in Sources */, @@ -1411,7 +1412,6 @@ 807D56B02A869F97009E591D /* GraphQLErrorResponse.swift in Sources */, 80DB2F762980795D00CFB86A /* CorePaymentsError.swift in Sources */, 06CE009926F3D1660000CC46 /* CoreConfig.swift in Sources */, - 45B063C32C41E73A00E743F2 /* SupportedCurrencyType.swift in Sources */, 45B063B42C4035E200E743F2 /* EligibilityClient.swift in Sources */, BEA100EC26EFA7790036A6A5 /* HTTPMethod.swift in Sources */, BEA100EE26EFA7990036A6A5 /* HTTPHeader.swift in Sources */, From d8b3b765da3a847d4c361e8610e1776614ad2540 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:41:43 -0600 Subject: [PATCH 26/54] Remove final --- Sources/CorePayments/Eligibility/EligibilityAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityAPI.swift b/Sources/CorePayments/Eligibility/EligibilityAPI.swift index 8f4b108e..5ae3d449 100644 --- a/Sources/CorePayments/Eligibility/EligibilityAPI.swift +++ b/Sources/CorePayments/Eligibility/EligibilityAPI.swift @@ -1,7 +1,7 @@ import Foundation /// API that return merchant's eligibility for different payment methods: Venmo, PayPal, PayPal Credit, Pay Later & credit card -final class EligibilityAPI { +class EligibilityAPI { // MARK: - Private Propertires From 805304d10ee3fa6372b597d02baf03648b21bc2e Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:42:32 -0600 Subject: [PATCH 27/54] Add docstrings on Client --- .../Eligibility/EligibilityClient.swift | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityClient.swift b/Sources/CorePayments/Eligibility/EligibilityClient.swift index 795264cd..c32c6dbf 100644 --- a/Sources/CorePayments/Eligibility/EligibilityClient.swift +++ b/Sources/CorePayments/Eligibility/EligibilityClient.swift @@ -1,16 +1,33 @@ import Foundation +/// The `EligibilityClient` class provides methods to check eligibility status based on provided requests. public final class EligibilityClient { + private let api: EligibilityAPI private let config: CoreConfig - private let eligibilityAPI: EligibilityAPI + /// Initializes a new instance of `EligibilityClient`. + /// - Parameter config: The core configuration needed for the client. public init(config: CoreConfig) { self.config = config - self.eligibilityAPI = EligibilityAPI(coreConfig: config) + self.api = EligibilityAPI(coreConfig: config) } - public func check(_ eligibilityRequest: EligibilityRequest = .init()) async throws -> EligibilityResult { - try await eligibilityAPI.check(eligibilityRequest).asResult + /// Exposed for injecting MockEligibilityAPI in tests + init(config: CoreConfig, api: EligibilityAPI) { + self.config = config + self.api = api + } + + + /// Checks the eligibility based on the provided `EligibilityRequest`. + /// + /// This method calls the `EligibilityAPI` to perform the check and converts the response to `EligibilityResult`. + /// + /// - Parameter eligibilityRequest: The eligibility request containing the necessary data to perform the check. + /// - Throws: An error if the network request or parsing fails. + /// - Returns: An `EligibilityResult` containing the result of the eligibility check. + public func check(_ eligibilityRequest: EligibilityRequest) async throws -> EligibilityResult { + try await api.check(eligibilityRequest).asResult } } From 8dbf00c5c1d91ad9935d94d54a69c496a47f70e6 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:42:42 -0600 Subject: [PATCH 28/54] Expose intents --- Sources/CorePayments/Eligibility/EligibilityIntent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityIntent.swift b/Sources/CorePayments/Eligibility/EligibilityIntent.swift index fc46ad8d..9dc01313 100644 --- a/Sources/CorePayments/Eligibility/EligibilityIntent.swift +++ b/Sources/CorePayments/Eligibility/EligibilityIntent.swift @@ -1,6 +1,6 @@ import Foundation -enum EligibilityIntent: String { +public enum EligibilityIntent: String { case SALE case CAPTURE case AUTHORIZE From 32dddf8528f0864e589eac893d9892336fff3604 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:43:25 -0600 Subject: [PATCH 29/54] Change Decodable instead of Codable for response model --- Sources/CorePayments/Eligibility/EligibilityResponse.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityResponse.swift b/Sources/CorePayments/Eligibility/EligibilityResponse.swift index 14ffe41c..edc252ef 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResponse.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResponse.swift @@ -35,7 +35,7 @@ struct EligibilityResponse: Decodable { } } -struct FundingEligibility: Codable { +struct FundingEligibility: Decodable { let venmo: SupportedPaymentMethodsTypeEligibility let card: SupportedPaymentMethodsTypeEligibility @@ -44,8 +44,7 @@ struct FundingEligibility: Codable { let credit: SupportedPaymentMethodsTypeEligibility } -struct SupportedPaymentMethodsTypeEligibility: Codable { +struct SupportedPaymentMethodsTypeEligibility: Decodable { let eligible: Bool - let reasons: [String]? } From 65749c2b7c99d0ec5a16236630d559c0f0a1d449 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:43:40 -0600 Subject: [PATCH 30/54] Update Variables struct --- .../CorePayments/Eligibility/EligibilityVariables.swift | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityVariables.swift b/Sources/CorePayments/Eligibility/EligibilityVariables.swift index ce280314..695ce1c8 100644 --- a/Sources/CorePayments/Eligibility/EligibilityVariables.swift +++ b/Sources/CorePayments/Eligibility/EligibilityVariables.swift @@ -13,13 +13,6 @@ struct EligibilityVariables: Encodable { case currency case enableFunding } - - // MARK: - Initializer - - init(eligibilityRequest: EligibilityRequest, clientID: String) { - self.eligibilityRequest = eligibilityRequest - self.clientID = clientID - } // MARK: - Custom Encoder @@ -27,7 +20,7 @@ struct EligibilityVariables: Encodable { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(clientID, forKey: .clientID) try container.encode(eligibilityRequest.intent.rawValue, forKey: .intent) - try container.encode(eligibilityRequest.currency.rawValue, forKey: .currency) + try container.encode(eligibilityRequest.currency, forKey: .currency) let enableFunding = eligibilityRequest.enableFunding.compactMap { $0.rawValue } try container.encode(enableFunding, forKey: .enableFunding) From fed4f0cdd1e5712df837ed449f1aa677f5af1b37 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:43:50 -0600 Subject: [PATCH 31/54] Remove currency enum --- Sources/CorePayments/Eligibility/SupportedCurrencyType.swift | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 Sources/CorePayments/Eligibility/SupportedCurrencyType.swift diff --git a/Sources/CorePayments/Eligibility/SupportedCurrencyType.swift b/Sources/CorePayments/Eligibility/SupportedCurrencyType.swift deleted file mode 100644 index 7753cd9c..00000000 --- a/Sources/CorePayments/Eligibility/SupportedCurrencyType.swift +++ /dev/null @@ -1,5 +0,0 @@ -import Foundation - -enum SupportedCurrencyType: String { - case USD -} From a5aec4c8355b67227de8bcbf5fc283e62b88d73e Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:44:11 -0600 Subject: [PATCH 32/54] Add docstring for Request model --- .../Eligibility/EligibilityRequest.swift | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift index e1847700..e714aa84 100644 --- a/Sources/CorePayments/Eligibility/EligibilityRequest.swift +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -1,16 +1,27 @@ import Foundation + +/// The `EligibilityRequest` structure includes the necessary parameters to make an eligibility check request. public struct EligibilityRequest { + /// The currency code for the eligibility request. + let currency: String + + /// The intent of the eligibility request. let intent: EligibilityIntent - let currency: SupportedCurrencyType + + /// An array of supported payment methods for the request. Defaults to `[.VENMO]`. let enableFunding: [SupportedPaymentMethodsType] // MARK: - Initializer - public init() { - self.intent = .CAPTURE - self.currency = .USD + /// Creates an instance of a eligibility request + /// - Parameters: + /// - currency: The currency code for the eligibility request. + /// - intent: The intent of the eligibility request. + public init(currency: String, intent: EligibilityIntent) { + self.currency = currency + self.intent = intent self.enableFunding = [.VENMO] } } From 64c6ceed60d93bfaaa8e643790ae70ceb0f6cc83 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:44:23 -0600 Subject: [PATCH 33/54] Add mock API --- .../Mocks/MockEligibilityAPI.swift | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 UnitTests/PaymentsCoreTests/Mocks/MockEligibilityAPI.swift diff --git a/UnitTests/PaymentsCoreTests/Mocks/MockEligibilityAPI.swift b/UnitTests/PaymentsCoreTests/Mocks/MockEligibilityAPI.swift new file mode 100644 index 00000000..d788a7b6 --- /dev/null +++ b/UnitTests/PaymentsCoreTests/Mocks/MockEligibilityAPI.swift @@ -0,0 +1,24 @@ +import Foundation +@testable import CorePayments + +class MockEligibilityAPI: EligibilityAPI { + + var stubResponse: EligibilityResponse? + var stubError: Error? + + var capturedRequest: EligibilityRequest? + + override func check(_ eligibilityRequest: EligibilityRequest) async throws -> EligibilityResponse { + capturedRequest = eligibilityRequest + + if let stubError { + throw stubError + } + + if let stubResponse { + return stubResponse + } + + throw CoreSDKError(code: 0, domain: "", errorDescription: "Stubbed responses not implemented for this mock.") + } +} From 2408217339af420c9ed0666f6290d1bfd1247ea8 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:47:37 -0600 Subject: [PATCH 34/54] Add client tests --- .../Eligibility/EligibilityAPI_Tests.swift | 10 +-- .../Eligibility/EligibilityClient_Tests.swift | 62 ++++++++++++++++++- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift index 93d0ebfc..54572a7d 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift @@ -6,7 +6,7 @@ class EligibilityAPI_Tests: XCTestCase { let mockClientID = "mockClientId" let mockURLSession = MockURLSession() - let eligibilityRequest = EligibilityRequest() + let eligibilityRequest = EligibilityRequest(currency: "SOME-CURRENCY", intent: .CAPTURE) var sut: EligibilityAPI! var coreConfig: CoreConfig! @@ -27,7 +27,7 @@ class EligibilityAPI_Tests: XCTestCase { super.tearDown() } - func testCheckSuccess() async throws { + func testCheck_constructsGraphQLRequest() async throws { let rawQuery = """ query getEligibility( $clientId: String!, @@ -70,11 +70,11 @@ class EligibilityAPI_Tests: XCTestCase { let variables = mockNetworkingClient.capturedGraphQLRequest?.variables as! EligibilityVariables XCTAssertEqual(variables.clientID, mockClientID) - XCTAssertEqual(variables.eligibilityRequest.currency.rawValue, "USD") + XCTAssertEqual(variables.eligibilityRequest.currency, "SOME-CURRENCY") XCTAssertEqual(variables.eligibilityRequest.intent.rawValue, "CAPTURE") } - func testUpdateSetupToken_whenNetworkingClientError_bubblesError() async { + func testCheck_whenNetworkingClientError_returnsError() async { mockNetworkingClient.stubHTTPError = CoreSDKError(code: 123, domain: "api-client-error", errorDescription: "error-desc") do { @@ -88,7 +88,7 @@ class EligibilityAPI_Tests: XCTestCase { } } - func testUpdateSetupToken_whenSuccess_returnsParsedUpdateSetupTokenResponse() async throws { + func testCheck_whenSuccess_returnsParsedResponse() async throws { let successsResponseJSON = """ { "data": { diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift index 2f6aa9c5..177752a0 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift @@ -3,5 +3,65 @@ import XCTest class EligibilityClient_Tests: XCTestCase { - // TODO: to be implemented in a future PR + let mockClientID = "mockClientId" + let eligibilityRequest = EligibilityRequest(currency: "SOME-CURRENCY", intent: .CAPTURE) + + var sut: EligibilityClient! + var coreConfig: CoreConfig! + var mockEligibilityAPI: MockEligibilityAPI! + + override func setUp() { + super.setUp() + coreConfig = CoreConfig(clientID: mockClientID, environment: .sandbox) + mockEligibilityAPI = MockEligibilityAPI(coreConfig: coreConfig) + sut = EligibilityClient(config: coreConfig, api: mockEligibilityAPI) + } + + override func tearDown() { + coreConfig = nil + mockEligibilityAPI = nil + sut = nil + super.tearDown() + } + + func testCheck_returnsSuccessResult() async throws { + mockEligibilityAPI.stubResponse = .init( + fundingEligibility: .init( + venmo: .init(eligible: true), + card: .init(eligible: true), + paypal: .init(eligible: true), + paylater: .init(eligible: false), + credit: .init(eligible: false) + ) + ) + + do { + let result = try await sut.check(eligibilityRequest) + XCTAssertTrue(result.isVenmoEligible) + XCTAssertTrue(result.isCardEligible) + XCTAssertTrue(result.isPayPalEligible) + XCTAssertFalse(result.isPayLaterEligible) + XCTAssertFalse(result.isCreditEligible) + } catch { + XCTFail("Expected no error.") + } + } + + func testCheck_returnsError() async throws { + mockEligibilityAPI.stubError = CoreSDKError( + code: 123, + domain: "client-error", + errorDescription: "Some client error description." + ) + + do { + _ = try await sut.check(eligibilityRequest) + XCTFail("Expected error throw.") + } catch { + let error = error as! CoreSDKError + XCTAssertEqual(error.domain, "client-error") + XCTAssertEqual(error.code, 123) + XCTAssertEqual(error.localizedDescription, "Some client error description.") + } + } } From 3a0c83abc121db74923e6490fb226aea80b396c7 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 14:59:36 -0600 Subject: [PATCH 35/54] Add Result docstrings --- .../CorePayments/Eligibility/EligibilityResult.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Sources/CorePayments/Eligibility/EligibilityResult.swift b/Sources/CorePayments/Eligibility/EligibilityResult.swift index 2ffb02a8..da20a7fd 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResult.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResult.swift @@ -1,10 +1,20 @@ import Foundation +/// The `EligibilityResult` structure contains the eligibility status for payment methods. public struct EligibilityResult { + /// A boolean indicating if venmo is eligible. public let isVenmoEligible: Bool + + /// A boolean indicating if Card is eligible. public let isCardEligible: Bool + + /// A boolean indicating if PayPal is eligible. public let isPayPalEligible: Bool + + /// A boolean indicating if PayLater is eligible. public let isPayLaterEligible: Bool + + /// A boolean indicating if credit is eligible. public let isCreditEligible: Bool } From f6de949cffa5b8196e9ba139f31bceb0ab9701b1 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 15:00:21 -0600 Subject: [PATCH 36/54] Rename curency to currencyCode --- Sources/CorePayments/Eligibility/EligibilityRequest.swift | 8 ++++---- .../CorePayments/Eligibility/EligibilityVariables.swift | 2 +- .../Eligibility/EligibilityAPI_Tests.swift | 4 ++-- .../Eligibility/EligibilityClient_Tests.swift | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift index e714aa84..bfd29e54 100644 --- a/Sources/CorePayments/Eligibility/EligibilityRequest.swift +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -5,7 +5,7 @@ import Foundation public struct EligibilityRequest { /// The currency code for the eligibility request. - let currency: String + let currencyCode: String /// The intent of the eligibility request. let intent: EligibilityIntent @@ -17,10 +17,10 @@ public struct EligibilityRequest { /// Creates an instance of a eligibility request /// - Parameters: - /// - currency: The currency code for the eligibility request. + /// - currencyCode: The currency code for the eligibility request. /// - intent: The intent of the eligibility request. - public init(currency: String, intent: EligibilityIntent) { - self.currency = currency + public init(currencyCode: String, intent: EligibilityIntent) { + self.currencyCode = currencyCode self.intent = intent self.enableFunding = [.VENMO] } diff --git a/Sources/CorePayments/Eligibility/EligibilityVariables.swift b/Sources/CorePayments/Eligibility/EligibilityVariables.swift index 695ce1c8..8211352e 100644 --- a/Sources/CorePayments/Eligibility/EligibilityVariables.swift +++ b/Sources/CorePayments/Eligibility/EligibilityVariables.swift @@ -20,7 +20,7 @@ struct EligibilityVariables: Encodable { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(clientID, forKey: .clientID) try container.encode(eligibilityRequest.intent.rawValue, forKey: .intent) - try container.encode(eligibilityRequest.currency, forKey: .currency) + try container.encode(eligibilityRequest.currencyCode, forKey: .currency) let enableFunding = eligibilityRequest.enableFunding.compactMap { $0.rawValue } try container.encode(enableFunding, forKey: .enableFunding) diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift index 54572a7d..ea6fe81e 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift @@ -6,7 +6,7 @@ class EligibilityAPI_Tests: XCTestCase { let mockClientID = "mockClientId" let mockURLSession = MockURLSession() - let eligibilityRequest = EligibilityRequest(currency: "SOME-CURRENCY", intent: .CAPTURE) + let eligibilityRequest = EligibilityRequest(currencyCode: "SOME-CURRENCY", intent: .CAPTURE) var sut: EligibilityAPI! var coreConfig: CoreConfig! @@ -70,7 +70,7 @@ class EligibilityAPI_Tests: XCTestCase { let variables = mockNetworkingClient.capturedGraphQLRequest?.variables as! EligibilityVariables XCTAssertEqual(variables.clientID, mockClientID) - XCTAssertEqual(variables.eligibilityRequest.currency, "SOME-CURRENCY") + XCTAssertEqual(variables.eligibilityRequest.currencyCode, "SOME-CURRENCY") XCTAssertEqual(variables.eligibilityRequest.intent.rawValue, "CAPTURE") } diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift index 177752a0..c280ced8 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift @@ -4,7 +4,7 @@ import XCTest class EligibilityClient_Tests: XCTestCase { let mockClientID = "mockClientId" - let eligibilityRequest = EligibilityRequest(currency: "SOME-CURRENCY", intent: .CAPTURE) + let eligibilityRequest = EligibilityRequest(currencyCode: "SOME-CURRENCY", intent: .CAPTURE) var sut: EligibilityClient! var coreConfig: CoreConfig! From 2e15a23af6f7ef2f0a9a4f6f85cdc2a3e309ace6 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 15:18:50 -0600 Subject: [PATCH 37/54] Add marks --- Sources/CorePayments/Eligibility/EligibilityAPI.swift | 4 +++- Sources/CorePayments/Eligibility/EligibilityClient.swift | 3 +++ Sources/CorePayments/Eligibility/EligibilityRequest.swift | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityAPI.swift b/Sources/CorePayments/Eligibility/EligibilityAPI.swift index 5ae3d449..8591e5bf 100644 --- a/Sources/CorePayments/Eligibility/EligibilityAPI.swift +++ b/Sources/CorePayments/Eligibility/EligibilityAPI.swift @@ -8,7 +8,7 @@ class EligibilityAPI { private let coreConfig: CoreConfig private let networkingClient: NetworkingClient - // MARK: - Initializer + // MARK: - Initializers /// Initialize the eligibility API to check for payment methods eligibility /// - Parameter coreConfig: configuration object @@ -23,6 +23,8 @@ class EligibilityAPI { self.networkingClient = networkingClient } + // MARK: - Internal Methods + /// Checks merchants eligibility for different payment methods. /// - Returns: An `EligibilityResponse` containing the result of the eligibility check. func check(_ eligibilityRequest: EligibilityRequest) async throws -> EligibilityResponse { diff --git a/Sources/CorePayments/Eligibility/EligibilityClient.swift b/Sources/CorePayments/Eligibility/EligibilityClient.swift index c32c6dbf..4666723b 100644 --- a/Sources/CorePayments/Eligibility/EligibilityClient.swift +++ b/Sources/CorePayments/Eligibility/EligibilityClient.swift @@ -6,6 +6,8 @@ public final class EligibilityClient { private let api: EligibilityAPI private let config: CoreConfig + // MARK: - Initializers + /// Initializes a new instance of `EligibilityClient`. /// - Parameter config: The core configuration needed for the client. public init(config: CoreConfig) { @@ -19,6 +21,7 @@ public final class EligibilityClient { self.api = api } + // MARK: - Public Methods /// Checks the eligibility based on the provided `EligibilityRequest`. /// diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift index bfd29e54..90a91331 100644 --- a/Sources/CorePayments/Eligibility/EligibilityRequest.swift +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -1,9 +1,10 @@ import Foundation - /// The `EligibilityRequest` structure includes the necessary parameters to make an eligibility check request. public struct EligibilityRequest { + // MARK: - Internal Properties + /// The currency code for the eligibility request. let currencyCode: String From 2cd8c4b0e9ce7158cdf53d1cc27cca8f3a9a1cbf Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 16:11:57 -0600 Subject: [PATCH 38/54] Fix merge conflicts --- PayPal.xcodeproj/project.pbxproj | 5 ++--- UnitTests/VenmoPaymentsTests/VenmoClient_Tests.swift | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index 37e4d81c..98da32f2 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -570,7 +570,6 @@ path = Models; sourceTree = ""; }; -<<<<<<< HEAD 62D3FB122C3DB4B30046563B /* VenmoPaymentsTests */ = { isa = PBXGroup; children = ( @@ -586,7 +585,8 @@ ); name = VenmoPayments; path = Sources/VenmoPayments; -======= + sourceTree = ""; + }; 45B063AD2C40346500E743F2 /* Eligibility */ = { isa = PBXGroup; children = ( @@ -606,7 +606,6 @@ 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */, ); path = Eligibility; ->>>>>>> venmo-feature sourceTree = ""; }; 8036C1DE270F9BCF00C0F091 /* PaymentsCoreTests */ = { diff --git a/UnitTests/VenmoPaymentsTests/VenmoClient_Tests.swift b/UnitTests/VenmoPaymentsTests/VenmoClient_Tests.swift index aac7fb48..2f7d95a2 100644 --- a/UnitTests/VenmoPaymentsTests/VenmoClient_Tests.swift +++ b/UnitTests/VenmoPaymentsTests/VenmoClient_Tests.swift @@ -1,5 +1,6 @@ import XCTest public class VenmoClient_Tests: XCTestCase { + // TODO: to be implemented in a future PR } From 2ede375ec050ad2cec8196ff9323ccdb13fce0a1 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 16:17:29 -0600 Subject: [PATCH 39/54] Fix lint --- Sources/VenmoPayments/VenmoClient.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/VenmoPayments/VenmoClient.swift b/Sources/VenmoPayments/VenmoClient.swift index 63f33a64..6410ea5b 100644 --- a/Sources/VenmoPayments/VenmoClient.swift +++ b/Sources/VenmoPayments/VenmoClient.swift @@ -1,5 +1,6 @@ import Foundation public class VenmoClient { + // TODO: to be implemented in a future PR } From 3be4ecb25097418aeb762db62c210308302c904e Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 16:45:02 -0600 Subject: [PATCH 40/54] Add mising file --- PayPal.xcodeproj/project.pbxproj | 42 +++++++++---------- .../Eligibility/SupportedPaymentMethods.swift | 7 ++++ 2 files changed, 28 insertions(+), 21 deletions(-) create mode 100644 Sources/CorePayments/Eligibility/SupportedPaymentMethods.swift diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index e97f56a1..90766946 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 3BE7386D2B9A670400598F05 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3BE738662B9A593100598F05 /* PrivacyInfo.xcprivacy */; }; 3D1763A22720722A00652E1C /* CardResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D1763A12720722A00652E1C /* CardResult.swift */; }; 3DC42BA927187E8300B71645 /* ErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC42BA827187E8300B71645 /* ErrorResponse.swift */; }; + 459633102C45DDC3002008EF /* SupportedPaymentMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4596330F2C45DDC3002008EF /* SupportedPaymentMethods.swift */; }; 45B063B42C4035E200E743F2 /* EligibilityClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */; }; 45B063B52C4035E500E743F2 /* EligibilityResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063B02C4034B700E743F2 /* EligibilityResult.swift */; }; 45B063B62C4035EA00E743F2 /* EligibilityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */; }; @@ -43,7 +44,6 @@ 45B063BD2C40545100E743F2 /* EligibilityClient_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */; }; 45B063BF2C40549000E743F2 /* EligibilityAPI_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */; }; 45B063C12C41D08400E743F2 /* EligibilityResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */; }; - 45B063C52C41E76500E743F2 /* SupportedPaymentMethodsType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */; }; 45B063C72C41E7AA00E743F2 /* EligibilityIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */; }; 45B063CA2C459F9900E743F2 /* MockEligibilityAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063C92C459F9900E743F2 /* MockEligibilityAPI.swift */; }; 53A2A4E228A182AC0093441C /* NativeCheckoutProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */; }; @@ -257,6 +257,7 @@ 3D25238127344F330099E4EB /* NativeCheckoutStartable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NativeCheckoutStartable.swift; path = Sources/PayPalNativePayments/NativeCheckoutStartable.swift; sourceTree = SOURCE_ROOT; }; 3D25238B273979170099E4EB /* MockNativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNativeCheckoutProvider.swift; sourceTree = ""; }; 3DC42BA827187E8300B71645 /* ErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResponse.swift; sourceTree = ""; }; + 4596330F2C45DDC3002008EF /* SupportedPaymentMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedPaymentMethods.swift; sourceTree = ""; }; 45B063AE2C40349300E743F2 /* EligibilityRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityRequest.swift; sourceTree = ""; }; 45B063B02C4034B700E743F2 /* EligibilityResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResult.swift; sourceTree = ""; }; 45B063B22C4035DB00E743F2 /* EligibilityClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient.swift; sourceTree = ""; }; @@ -265,7 +266,6 @@ 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient_Tests.swift; sourceTree = ""; }; 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI_Tests.swift; sourceTree = ""; }; 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResponse.swift; sourceTree = ""; }; - 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SupportedPaymentMethodsType.swift; path = ../../../../Documents/SupportedPaymentMethodsType.swift; sourceTree = ""; }; 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityIntent.swift; sourceTree = ""; }; 45B063C92C459F9900E743F2 /* MockEligibilityAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockEligibilityAPI.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; @@ -578,23 +578,6 @@ path = Models; sourceTree = ""; }; - 62D3FB122C3DB4B30046563B /* VenmoPaymentsTests */ = { - isa = PBXGroup; - children = ( - 62D3FB132C3DB4D40046563B /* VenmoClient_Tests.swift */, - ); - path = VenmoPaymentsTests; - sourceTree = ""; - }; - 62D3FB4A2C3ED82D0046563B /* VenmoPayments */ = { - isa = PBXGroup; - children = ( - 62D3FB492C3ED82D0046563B /* VenmoClient.swift */, - ); - name = VenmoPayments; - path = Sources/VenmoPayments; - sourceTree = ""; - }; 45B063AD2C40346500E743F2 /* Eligibility */ = { isa = PBXGroup; children = ( @@ -605,7 +588,7 @@ 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */, 45B063B02C4034B700E743F2 /* EligibilityResult.swift */, 45B063B72C40440000E743F2 /* EligibilityVariables.swift */, - 45B063C42C41E76500E743F2 /* SupportedPaymentMethodsType.swift */, + 4596330F2C45DDC3002008EF /* SupportedPaymentMethods.swift */, ); path = Eligibility; sourceTree = ""; @@ -619,6 +602,23 @@ path = Eligibility; sourceTree = ""; }; + 62D3FB122C3DB4B30046563B /* VenmoPaymentsTests */ = { + isa = PBXGroup; + children = ( + 62D3FB132C3DB4D40046563B /* VenmoClient_Tests.swift */, + ); + path = VenmoPaymentsTests; + sourceTree = ""; + }; + 62D3FB4A2C3ED82D0046563B /* VenmoPayments */ = { + isa = PBXGroup; + children = ( + 62D3FB492C3ED82D0046563B /* VenmoClient.swift */, + ); + name = VenmoPayments; + path = Sources/VenmoPayments; + sourceTree = ""; + }; 8036C1DE270F9BCF00C0F091 /* PaymentsCoreTests */ = { isa = PBXGroup; children = ( @@ -1515,6 +1515,7 @@ 807C5E6929102D9800ECECD8 /* AnalyticsEventData.swift in Sources */, 80E237DF2A84434B00FF18CA /* HTTPRequest.swift in Sources */, 8021B69029144E6D000FBC54 /* PayPalCoreConstants.swift in Sources */, + 459633102C45DDC3002008EF /* SupportedPaymentMethods.swift in Sources */, 45B063B82C40440000E743F2 /* EligibilityVariables.swift in Sources */, 807D56B02A869F97009E591D /* GraphQLErrorResponse.swift in Sources */, 80DB2F762980795D00CFB86A /* CorePaymentsError.swift in Sources */, @@ -1536,7 +1537,6 @@ 3DC42BA927187E8300B71645 /* ErrorResponse.swift in Sources */, 45B063B52C4035E500E743F2 /* EligibilityResult.swift in Sources */, 807D56AC2A869044009E591D /* GraphQLHTTPPostBody.swift in Sources */, - 45B063C52C41E76500E743F2 /* SupportedPaymentMethodsType.swift in Sources */, 804E62822937EBCE004B9FEF /* HTTP.swift in Sources */, BC04836F27B2FB3600FA7B46 /* URLSessionProtocol.swift in Sources */, 065A4DBC26FCD8090007014A /* CoreSDKError.swift in Sources */, diff --git a/Sources/CorePayments/Eligibility/SupportedPaymentMethods.swift b/Sources/CorePayments/Eligibility/SupportedPaymentMethods.swift new file mode 100644 index 00000000..a356096d --- /dev/null +++ b/Sources/CorePayments/Eligibility/SupportedPaymentMethods.swift @@ -0,0 +1,7 @@ +import Foundation + +enum SupportedPaymentMethodsType: String { + case VENMO + case CREDIT + case PAYLATER +} From 1ee3d2b1bc6cc26dc95bc0781391bae21d58d0e1 Mon Sep 17 00:00:00 2001 From: richherrera Date: Mon, 15 Jul 2024 17:43:28 -0600 Subject: [PATCH 41/54] Add functionality on demo app --- Demo/Demo.xcodeproj/project.pbxproj | 4 +++ .../VenmoPayments/VenmoPaymentView.swift | 26 +++++++++++++++- .../ViewModels/VenmoPaymentsViewModel.swift | 30 ++++++++++++++++++- Demo/Demo/ViewModels/VenmoState.swift | 15 ++++++++++ 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 Demo/Demo/ViewModels/VenmoState.swift diff --git a/Demo/Demo.xcodeproj/project.pbxproj b/Demo/Demo.xcodeproj/project.pbxproj index 7af7e4e4..1dc52009 100644 --- a/Demo/Demo.xcodeproj/project.pbxproj +++ b/Demo/Demo.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 3BF999762A8AC093009CBDF2 /* UpdateSetupTokenResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF999752A8AC093009CBDF2 /* UpdateSetupTokenResultView.swift */; }; 3BF999782A8AD072009CBDF2 /* CreatePaymentTokenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF999772A8AD072009CBDF2 /* CreatePaymentTokenView.swift */; }; 3BF9997A2A8AE12C009CBDF2 /* PaymentTokenResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF999792A8AE12C009CBDF2 /* PaymentTokenResultView.swift */; }; + 459633122C45E34A002008EF /* VenmoState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459633112C45E34A002008EF /* VenmoState.swift */; }; 45B063A82C3C4D1200E743F2 /* VenmoPaymentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063A72C3C4D1200E743F2 /* VenmoPaymentView.swift */; }; 45B063AC2C3C4D5C00E743F2 /* VenmoPaymentsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AB2C3C4D5C00E743F2 /* VenmoPaymentsViewModel.swift */; }; 5301468C28918B4D00184F22 /* ApprovalResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5301468B28918B4D00184F22 /* ApprovalResult.swift */; }; @@ -174,6 +175,7 @@ 3BF999752A8AC093009CBDF2 /* UpdateSetupTokenResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateSetupTokenResultView.swift; sourceTree = ""; }; 3BF999772A8AD072009CBDF2 /* CreatePaymentTokenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatePaymentTokenView.swift; sourceTree = ""; }; 3BF999792A8AE12C009CBDF2 /* PaymentTokenResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentTokenResultView.swift; sourceTree = ""; }; + 459633112C45E34A002008EF /* VenmoState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VenmoState.swift; sourceTree = ""; }; 45B063A72C3C4D1200E743F2 /* VenmoPaymentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VenmoPaymentView.swift; sourceTree = ""; }; 45B063AB2C3C4D5C00E743F2 /* VenmoPaymentsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VenmoPaymentsViewModel.swift; sourceTree = ""; }; 5301468B28918B4D00184F22 /* ApprovalResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApprovalResult.swift; sourceTree = ""; }; @@ -456,6 +458,7 @@ 3B2027402A8A72050007907E /* VaultState.swift */, 3BA0A58A2B1E240300330681 /* VaultViewModel.swift */, 45B063AB2C3C4D5C00E743F2 /* VenmoPaymentsViewModel.swift */, + 459633112C45E34A002008EF /* VenmoState.swift */, ); path = ViewModels; sourceTree = ""; @@ -637,6 +640,7 @@ BECD84A027036DC2007CCAE4 /* Environment.swift in Sources */, 80F33CF126F8E7D9006811B1 /* ProcessOrderParams.swift in Sources */, 53B9E8EA28C93B4400719239 /* OrderRequestHelpers.swift in Sources */, + 459633122C45E34A002008EF /* VenmoState.swift in Sources */, 3BCCFE4B2A9D985F00C5102F /* FeatureSelectionView.swift in Sources */, CB9ED44C283FDA900081F4DE /* PaymentButtonEnums+Extension.swift in Sources */, 3BB60B552B1FA00C00A298CF /* PayPalVaultViewModel.swift in Sources */, diff --git a/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift b/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift index 6db56a6b..6e0b6607 100644 --- a/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift +++ b/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift @@ -5,7 +5,31 @@ struct VenmoPaymentView: View { @StateObject var venmoPaymentsViewModel = VenmoPaymentsViewModel() var body: some View { - Text("Hello, Venmo!") + VStack { + Text("Hello, Venmo!") + ZStack { + Button("Check eligibility") { + Task { + do { + try await venmoPaymentsViewModel.getEligibility() + } catch { + print("Error in getting payment token. \(error.localizedDescription)") + } + } + } + .buttonStyle(RoundedBlueButtonStyle()) + if case .loading = venmoPaymentsViewModel.state.isVenmoEligibleResponse { + CircularProgressView() + } + } + if case .loaded(let value) = venmoPaymentsViewModel.state.isVenmoEligibleResponse { + if value { + Text("Venmo is eligible! 🥳") + } else { + Text("Venmo is not eligible! 🫤") + } + } + } } } diff --git a/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift b/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift index 07b7617d..32d9837d 100644 --- a/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift +++ b/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift @@ -1,3 +1,31 @@ +import CorePayments import Foundation -class VenmoPaymentsViewModel: ObservableObject { } +class VenmoPaymentsViewModel: ObservableObject { + + let configManager = CoreConfigManager(domain: "Venmo Payments") + + @Published var state = VenmoState() + + func getEligibility() async throws { + DispatchQueue.main.async { + self.state.isVenmoEligibleResponse = .loading + } + do { + let config = try await configManager.getCoreConfig() + let eligibilityRequest = EligibilityRequest(currencyCode: "USD", intent: .CAPTURE) + let eligibilityClient = EligibilityClient(config: config) + let eligibilityResult = try? await eligibilityClient.check(eligibilityRequest) + let isVenmoEligible = eligibilityResult?.isVenmoEligible ?? false + + DispatchQueue.main.async { + self.state.isVenmoEligibleResponse = .loaded(isVenmoEligible) + } + } catch { + DispatchQueue.main.async { + self.state.isVenmoEligibleResponse = .error(message: error.localizedDescription) + } + print("failed in updating setup token. \(error.localizedDescription)") + } + } +} diff --git a/Demo/Demo/ViewModels/VenmoState.swift b/Demo/Demo/ViewModels/VenmoState.swift new file mode 100644 index 00000000..781cb9f3 --- /dev/null +++ b/Demo/Demo/ViewModels/VenmoState.swift @@ -0,0 +1,15 @@ +import CorePayments +import Foundation + +struct VenmoState { + + var isVenmoEligible: Bool? + + var isVenmoEligibleResponse: LoadingState = .idle { + didSet { + if case .loaded(let value) = isVenmoEligibleResponse { + isVenmoEligible = value + } + } + } +} From cd016e32cb1da4d5291501290445dddb73f9f16f Mon Sep 17 00:00:00 2001 From: richherrera Date: Tue, 16 Jul 2024 12:46:06 -0600 Subject: [PATCH 42/54] PR feedback --- .../Eligibility/EligibilityResponse.swift | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityResponse.swift b/Sources/CorePayments/Eligibility/EligibilityResponse.swift index edc252ef..677bb0fe 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResponse.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResponse.swift @@ -2,25 +2,25 @@ import Foundation struct EligibilityResponse: Decodable { - let fundingEligibility: FundingEligibility + private let fundingEligibility: FundingEligibility - var isVenmoEligible: Bool { + private var isVenmoEligible: Bool { fundingEligibility.venmo.eligible } - var isCardEligible: Bool { + private var isCardEligible: Bool { fundingEligibility.card.eligible } - var isPayPalEligible: Bool { - fundingEligibility.paypal.eligible + private var isPayPalEligible: Bool { + fundingEligibility.payPal.eligible } - var isPayLaterEligible: Bool { - fundingEligibility.paylater.eligible + private var isPayLaterEligible: Bool { + fundingEligibility.payLater.eligible } - var isCreditEligible: Bool { + private var isCreditEligible: Bool { fundingEligibility.credit.eligible } @@ -39,9 +39,19 @@ struct FundingEligibility: Decodable { let venmo: SupportedPaymentMethodsTypeEligibility let card: SupportedPaymentMethodsTypeEligibility - let paypal: SupportedPaymentMethodsTypeEligibility - let paylater: SupportedPaymentMethodsTypeEligibility + let payPal: SupportedPaymentMethodsTypeEligibility + let payLater: SupportedPaymentMethodsTypeEligibility let credit: SupportedPaymentMethodsTypeEligibility + + // MARK: - Coding Keys + + private enum CodingKeys: String, CodingKey { + case venmo + case card + case payPal = "paypal" + case payLater = "paylater" + case credit + } } struct SupportedPaymentMethodsTypeEligibility: Decodable { From c9f14ab0e0e4133249877b089856cea2567873af Mon Sep 17 00:00:00 2001 From: richherrera Date: Tue, 16 Jul 2024 12:47:31 -0600 Subject: [PATCH 43/54] Change initializer --- Sources/CorePayments/Eligibility/EligibilityResponse.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityResponse.swift b/Sources/CorePayments/Eligibility/EligibilityResponse.swift index 677bb0fe..8fef5d84 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResponse.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResponse.swift @@ -25,7 +25,7 @@ struct EligibilityResponse: Decodable { } var asResult: EligibilityResult { - .init( + EligibilityResult( isVenmoEligible: isVenmoEligible, isCardEligible: isCardEligible, isPayPalEligible: isPayPalEligible, From ee7e160a7f39eb91aeddae0969e2e93ba7c81b3e Mon Sep 17 00:00:00 2001 From: richherrera Date: Tue, 16 Jul 2024 12:53:25 -0600 Subject: [PATCH 44/54] Fix tests --- .../Eligibility/EligibilityResponse.swift | 16 ++++++++-------- .../Eligibility/EligibilityClient_Tests.swift | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityResponse.swift b/Sources/CorePayments/Eligibility/EligibilityResponse.swift index 8fef5d84..f7fd4f46 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResponse.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResponse.swift @@ -2,30 +2,30 @@ import Foundation struct EligibilityResponse: Decodable { - private let fundingEligibility: FundingEligibility + let fundingEligibility: FundingEligibility - private var isVenmoEligible: Bool { + var isVenmoEligible: Bool { fundingEligibility.venmo.eligible } - private var isCardEligible: Bool { + var isCardEligible: Bool { fundingEligibility.card.eligible } - private var isPayPalEligible: Bool { + var isPayPalEligible: Bool { fundingEligibility.payPal.eligible } - private var isPayLaterEligible: Bool { + var isPayLaterEligible: Bool { fundingEligibility.payLater.eligible } - private var isCreditEligible: Bool { + var isCreditEligible: Bool { fundingEligibility.credit.eligible } var asResult: EligibilityResult { - EligibilityResult( + .init( isVenmoEligible: isVenmoEligible, isCardEligible: isCardEligible, isPayPalEligible: isPayPalEligible, @@ -49,7 +49,7 @@ struct FundingEligibility: Decodable { case venmo case card case payPal = "paypal" - case payLater = "paylater" + case payLater = "payLater" case credit } } diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift index c280ced8..92b3da76 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift @@ -29,8 +29,8 @@ class EligibilityClient_Tests: XCTestCase { fundingEligibility: .init( venmo: .init(eligible: true), card: .init(eligible: true), - paypal: .init(eligible: true), - paylater: .init(eligible: false), + payPal: .init(eligible: true), + payLater: .init(eligible: false), credit: .init(eligible: false) ) ) From 9a6dc5ad8e14eb38455b49a90f49f7ac61d4b8ab Mon Sep 17 00:00:00 2001 From: richherrera Date: Tue, 16 Jul 2024 13:09:32 -0600 Subject: [PATCH 45/54] Fix coding key --- Sources/CorePayments/Eligibility/EligibilityResponse.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityResponse.swift b/Sources/CorePayments/Eligibility/EligibilityResponse.swift index f7fd4f46..eabf72ed 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResponse.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResponse.swift @@ -49,7 +49,7 @@ struct FundingEligibility: Decodable { case venmo case card case payPal = "paypal" - case payLater = "payLater" + case payLater = "paylater" case credit } } From 54e53c0e6c6f87cc6974dd4363d2c03e4947685c Mon Sep 17 00:00:00 2001 From: richherrera Date: Wed, 17 Jul 2024 13:31:52 -0600 Subject: [PATCH 46/54] Add EligibilityIntent docstrings and remove unnecessary intents --- .../Eligibility/EligibilityIntent.swift | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityIntent.swift b/Sources/CorePayments/Eligibility/EligibilityIntent.swift index 9dc01313..e492dbc4 100644 --- a/Sources/CorePayments/Eligibility/EligibilityIntent.swift +++ b/Sources/CorePayments/Eligibility/EligibilityIntent.swift @@ -1,10 +1,11 @@ import Foundation +/// Enum representing the possible intents for eligibility. public enum EligibilityIntent: String { - case SALE - case CAPTURE - case AUTHORIZE - case ORDER - case TOKENIZE - case SUBSCRIPTION + + /// Represents the intent to capture a payment. + case capture = "CAPTURE" + + /// Represents the intent to authorize a payment. + case authorize = "AUTHORIZE" } From df51eb00e4e2eb581f3dbff141ded5385aa8202c Mon Sep 17 00:00:00 2001 From: richherrera Date: Wed, 17 Jul 2024 13:32:27 -0600 Subject: [PATCH 47/54] Fix UTs --- .../PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift | 2 +- .../PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift index ea6fe81e..99cb62d4 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityAPI_Tests.swift @@ -6,7 +6,7 @@ class EligibilityAPI_Tests: XCTestCase { let mockClientID = "mockClientId" let mockURLSession = MockURLSession() - let eligibilityRequest = EligibilityRequest(currencyCode: "SOME-CURRENCY", intent: .CAPTURE) + let eligibilityRequest = EligibilityRequest(currencyCode: "SOME-CURRENCY", intent: .capture) var sut: EligibilityAPI! var coreConfig: CoreConfig! diff --git a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift index 92b3da76..f0039ebb 100644 --- a/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift +++ b/UnitTests/PaymentsCoreTests/Eligibility/EligibilityClient_Tests.swift @@ -4,7 +4,7 @@ import XCTest class EligibilityClient_Tests: XCTestCase { let mockClientID = "mockClientId" - let eligibilityRequest = EligibilityRequest(currencyCode: "SOME-CURRENCY", intent: .CAPTURE) + let eligibilityRequest = EligibilityRequest(currencyCode: "SOME-CURRENCY", intent: .capture) var sut: EligibilityClient! var coreConfig: CoreConfig! From 8f253cf4ef60fd97edb68398f19a0c96f576eaae Mon Sep 17 00:00:00 2001 From: richherrera Date: Wed, 17 Jul 2024 13:33:28 -0600 Subject: [PATCH 48/54] Pass intent as parameter and mimic UI as others views --- .../VenmoPayments/VenmoPaymentView.swift | 17 +++++++++++++++-- .../ViewModels/VenmoPaymentsViewModel.swift | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift b/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift index 6e0b6607..0dbcc804 100644 --- a/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift +++ b/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift @@ -1,17 +1,24 @@ import SwiftUI +import CorePayments struct VenmoPaymentView: View { + @State private var selectedIntent: EligibilityIntent = .capture @StateObject var venmoPaymentsViewModel = VenmoPaymentsViewModel() var body: some View { - VStack { + VStack(spacing: 16) { Text("Hello, Venmo!") + Picker("Intent", selection: $selectedIntent) { + Text("AUTHORIZE").tag(EligibilityIntent.authorize) + Text("CAPTURE").tag(EligibilityIntent.capture) + } + .pickerStyle(SegmentedPickerStyle()) ZStack { Button("Check eligibility") { Task { do { - try await venmoPaymentsViewModel.getEligibility() + try await venmoPaymentsViewModel.getEligibility(selectedIntent) } catch { print("Error in getting payment token. \(error.localizedDescription)") } @@ -30,6 +37,12 @@ struct VenmoPaymentView: View { } } } + .padding() + .background( + RoundedRectangle(cornerRadius: 10) + .stroke(.gray, lineWidth: 2) + .padding(5) + ) } } diff --git a/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift b/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift index 32d9837d..893eb0e1 100644 --- a/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift +++ b/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift @@ -7,13 +7,13 @@ class VenmoPaymentsViewModel: ObservableObject { @Published var state = VenmoState() - func getEligibility() async throws { + func getEligibility(_ intent: EligibilityIntent) async throws { DispatchQueue.main.async { self.state.isVenmoEligibleResponse = .loading } do { let config = try await configManager.getCoreConfig() - let eligibilityRequest = EligibilityRequest(currencyCode: "USD", intent: .CAPTURE) + let eligibilityRequest = EligibilityRequest(currencyCode: "USD", intent: intent) let eligibilityClient = EligibilityClient(config: config) let eligibilityResult = try? await eligibilityClient.check(eligibilityRequest) let isVenmoEligible = eligibilityResult?.isVenmoEligible ?? false From 644df700d1b18762e00c3899181f03b021d978de Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 18 Jul 2024 12:47:49 -0600 Subject: [PATCH 49/54] Change initializer --- Sources/CorePayments/Eligibility/EligibilityResponse.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityResponse.swift b/Sources/CorePayments/Eligibility/EligibilityResponse.swift index eabf72ed..a4c035b0 100644 --- a/Sources/CorePayments/Eligibility/EligibilityResponse.swift +++ b/Sources/CorePayments/Eligibility/EligibilityResponse.swift @@ -25,7 +25,7 @@ struct EligibilityResponse: Decodable { } var asResult: EligibilityResult { - .init( + EligibilityResult( isVenmoEligible: isVenmoEligible, isCardEligible: isCardEligible, isPayPalEligible: isPayPalEligible, From f9f2df331910ef706ef23c98f22ac7d3df8b45f3 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 18 Jul 2024 12:51:56 -0600 Subject: [PATCH 50/54] Remove Recovered References directory --- PayPal.xcodeproj/project.pbxproj | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/PayPal.xcodeproj/project.pbxproj b/PayPal.xcodeproj/project.pbxproj index dcc7b322..69a1d136 100644 --- a/PayPal.xcodeproj/project.pbxproj +++ b/PayPal.xcodeproj/project.pbxproj @@ -257,7 +257,6 @@ 3D25238127344F330099E4EB /* NativeCheckoutStartable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NativeCheckoutStartable.swift; path = Sources/PayPalNativePayments/NativeCheckoutStartable.swift; sourceTree = SOURCE_ROOT; }; 3D25238B273979170099E4EB /* MockNativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNativeCheckoutProvider.swift; sourceTree = ""; }; 3DC42BA827187E8300B71645 /* ErrorResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResponse.swift; sourceTree = ""; }; - 4596330F2C45DDC3002008EF /* SupportedPaymentMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedPaymentMethods.swift; sourceTree = ""; }; 459633152C46BD63002008EF /* EligibilityIntent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EligibilityIntent.swift; sourceTree = ""; }; 459633172C46BD6F002008EF /* EligibilityResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EligibilityResponse.swift; sourceTree = ""; }; 459633192C46BD7B002008EF /* SupportedPaymentMethods.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupportedPaymentMethods.swift; sourceTree = ""; }; @@ -268,8 +267,6 @@ 45B063B92C40456F00E743F2 /* EligibilityAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI.swift; sourceTree = ""; }; 45B063BC2C40545100E743F2 /* EligibilityClient_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityClient_Tests.swift; sourceTree = ""; }; 45B063BE2C40549000E743F2 /* EligibilityAPI_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityAPI_Tests.swift; sourceTree = ""; }; - 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityResponse.swift; sourceTree = ""; }; - 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EligibilityIntent.swift; sourceTree = ""; }; 45B063C92C459F9900E743F2 /* MockEligibilityAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockEligibilityAPI.swift; sourceTree = ""; }; 53A2A4E128A182AC0093441C /* NativeCheckoutProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeCheckoutProvider.swift; sourceTree = ""; }; 62D3FB132C3DB4D40046563B /* VenmoClient_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VenmoClient_Tests.swift; sourceTree = ""; }; @@ -581,16 +578,6 @@ path = Models; sourceTree = ""; }; - 459633142C46BD51002008EF /* Recovered References */ = { - isa = PBXGroup; - children = ( - 4596330F2C45DDC3002008EF /* SupportedPaymentMethods.swift */, - 45B063C02C41D08400E743F2 /* EligibilityResponse.swift */, - 45B063C62C41E7AA00E743F2 /* EligibilityIntent.swift */, - ); - name = "Recovered References"; - sourceTree = ""; - }; 45B063AD2C40346500E743F2 /* Eligibility */ = { isa = PBXGroup; children = ( @@ -963,7 +950,6 @@ OBJ_13 /* Products */, 805AB85726B8887D003BEE0D /* Frameworks */, 047AF85D2B4F47BD0011303B /* Resources */, - 459633142C46BD51002008EF /* Recovered References */, ); sourceTree = ""; }; From b422115c83244210d4026c0d7ff500d004fa41de Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 18 Jul 2024 12:55:51 -0600 Subject: [PATCH 51/54] Lowercase supported payment methods --- Sources/CorePayments/Eligibility/EligibilityRequest.swift | 2 +- .../CorePayments/Eligibility/SupportedPaymentMethods.swift | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/CorePayments/Eligibility/EligibilityRequest.swift b/Sources/CorePayments/Eligibility/EligibilityRequest.swift index 90a91331..7e78497e 100644 --- a/Sources/CorePayments/Eligibility/EligibilityRequest.swift +++ b/Sources/CorePayments/Eligibility/EligibilityRequest.swift @@ -23,6 +23,6 @@ public struct EligibilityRequest { public init(currencyCode: String, intent: EligibilityIntent) { self.currencyCode = currencyCode self.intent = intent - self.enableFunding = [.VENMO] + self.enableFunding = [.venmo] } } diff --git a/Sources/CorePayments/Eligibility/SupportedPaymentMethods.swift b/Sources/CorePayments/Eligibility/SupportedPaymentMethods.swift index a356096d..e8a00347 100644 --- a/Sources/CorePayments/Eligibility/SupportedPaymentMethods.swift +++ b/Sources/CorePayments/Eligibility/SupportedPaymentMethods.swift @@ -1,7 +1,7 @@ import Foundation enum SupportedPaymentMethodsType: String { - case VENMO - case CREDIT - case PAYLATER + case venmo = "VENMO" + case credit = "CREDIT" + case payLater = "PAYLATER" } From 33d3d46d5edc9ecaa532cac49329d3b6008ff3dd Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 18 Jul 2024 13:56:49 -0600 Subject: [PATCH 52/54] Use CurrentState enum instead of VenmoState --- .../VenmoPayments/VenmoPaymentView.swift | 9 ++++++--- .../ViewModels/VenmoPaymentsViewModel.swift | 19 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift b/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift index 0dbcc804..7cef685d 100644 --- a/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift +++ b/Demo/Demo/SwiftUIComponents/VenmoPayments/VenmoPaymentView.swift @@ -25,17 +25,20 @@ struct VenmoPaymentView: View { } } .buttonStyle(RoundedBlueButtonStyle()) - if case .loading = venmoPaymentsViewModel.state.isVenmoEligibleResponse { + if case .loading = venmoPaymentsViewModel.state { CircularProgressView() } } - if case .loaded(let value) = venmoPaymentsViewModel.state.isVenmoEligibleResponse { - if value { + if case .success = venmoPaymentsViewModel.state { + if venmoPaymentsViewModel.isVenmoEligible { Text("Venmo is eligible! 🥳") } else { Text("Venmo is not eligible! 🫤") } } + if case .error(let message) = venmoPaymentsViewModel.state { + Text(message) + } } .padding() .background( diff --git a/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift b/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift index 893eb0e1..1c7e3b8d 100644 --- a/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift +++ b/Demo/Demo/ViewModels/VenmoPaymentsViewModel.swift @@ -5,25 +5,30 @@ class VenmoPaymentsViewModel: ObservableObject { let configManager = CoreConfigManager(domain: "Venmo Payments") - @Published var state = VenmoState() + @Published var state: CurrentState = .idle + + private var eligibilityResult: EligibilityResult? + + var isVenmoEligible: Bool { + eligibilityResult?.isVenmoEligible ?? false + } func getEligibility(_ intent: EligibilityIntent) async throws { DispatchQueue.main.async { - self.state.isVenmoEligibleResponse = .loading + self.state = .loading } do { let config = try await configManager.getCoreConfig() let eligibilityRequest = EligibilityRequest(currencyCode: "USD", intent: intent) let eligibilityClient = EligibilityClient(config: config) - let eligibilityResult = try? await eligibilityClient.check(eligibilityRequest) - let isVenmoEligible = eligibilityResult?.isVenmoEligible ?? false - + eligibilityResult = try? await eligibilityClient.check(eligibilityRequest) + DispatchQueue.main.async { - self.state.isVenmoEligibleResponse = .loaded(isVenmoEligible) + self.state = .success } } catch { DispatchQueue.main.async { - self.state.isVenmoEligibleResponse = .error(message: error.localizedDescription) + self.state = .error(message: error.localizedDescription) } print("failed in updating setup token. \(error.localizedDescription)") } From fb550e2f91cae49c4945d402fa0ae323d2346f43 Mon Sep 17 00:00:00 2001 From: richherrera Date: Thu, 18 Jul 2024 13:57:05 -0600 Subject: [PATCH 53/54] Remove VenmoState file --- Demo/Demo.xcodeproj/project.pbxproj | 4 ---- Demo/Demo/ViewModels/VenmoState.swift | 15 --------------- 2 files changed, 19 deletions(-) delete mode 100644 Demo/Demo/ViewModels/VenmoState.swift diff --git a/Demo/Demo.xcodeproj/project.pbxproj b/Demo/Demo.xcodeproj/project.pbxproj index 1dc52009..7af7e4e4 100644 --- a/Demo/Demo.xcodeproj/project.pbxproj +++ b/Demo/Demo.xcodeproj/project.pbxproj @@ -51,7 +51,6 @@ 3BF999762A8AC093009CBDF2 /* UpdateSetupTokenResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF999752A8AC093009CBDF2 /* UpdateSetupTokenResultView.swift */; }; 3BF999782A8AD072009CBDF2 /* CreatePaymentTokenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF999772A8AD072009CBDF2 /* CreatePaymentTokenView.swift */; }; 3BF9997A2A8AE12C009CBDF2 /* PaymentTokenResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF999792A8AE12C009CBDF2 /* PaymentTokenResultView.swift */; }; - 459633122C45E34A002008EF /* VenmoState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459633112C45E34A002008EF /* VenmoState.swift */; }; 45B063A82C3C4D1200E743F2 /* VenmoPaymentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063A72C3C4D1200E743F2 /* VenmoPaymentView.swift */; }; 45B063AC2C3C4D5C00E743F2 /* VenmoPaymentsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B063AB2C3C4D5C00E743F2 /* VenmoPaymentsViewModel.swift */; }; 5301468C28918B4D00184F22 /* ApprovalResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5301468B28918B4D00184F22 /* ApprovalResult.swift */; }; @@ -175,7 +174,6 @@ 3BF999752A8AC093009CBDF2 /* UpdateSetupTokenResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateSetupTokenResultView.swift; sourceTree = ""; }; 3BF999772A8AD072009CBDF2 /* CreatePaymentTokenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatePaymentTokenView.swift; sourceTree = ""; }; 3BF999792A8AE12C009CBDF2 /* PaymentTokenResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentTokenResultView.swift; sourceTree = ""; }; - 459633112C45E34A002008EF /* VenmoState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VenmoState.swift; sourceTree = ""; }; 45B063A72C3C4D1200E743F2 /* VenmoPaymentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VenmoPaymentView.swift; sourceTree = ""; }; 45B063AB2C3C4D5C00E743F2 /* VenmoPaymentsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VenmoPaymentsViewModel.swift; sourceTree = ""; }; 5301468B28918B4D00184F22 /* ApprovalResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApprovalResult.swift; sourceTree = ""; }; @@ -458,7 +456,6 @@ 3B2027402A8A72050007907E /* VaultState.swift */, 3BA0A58A2B1E240300330681 /* VaultViewModel.swift */, 45B063AB2C3C4D5C00E743F2 /* VenmoPaymentsViewModel.swift */, - 459633112C45E34A002008EF /* VenmoState.swift */, ); path = ViewModels; sourceTree = ""; @@ -640,7 +637,6 @@ BECD84A027036DC2007CCAE4 /* Environment.swift in Sources */, 80F33CF126F8E7D9006811B1 /* ProcessOrderParams.swift in Sources */, 53B9E8EA28C93B4400719239 /* OrderRequestHelpers.swift in Sources */, - 459633122C45E34A002008EF /* VenmoState.swift in Sources */, 3BCCFE4B2A9D985F00C5102F /* FeatureSelectionView.swift in Sources */, CB9ED44C283FDA900081F4DE /* PaymentButtonEnums+Extension.swift in Sources */, 3BB60B552B1FA00C00A298CF /* PayPalVaultViewModel.swift in Sources */, diff --git a/Demo/Demo/ViewModels/VenmoState.swift b/Demo/Demo/ViewModels/VenmoState.swift deleted file mode 100644 index 781cb9f3..00000000 --- a/Demo/Demo/ViewModels/VenmoState.swift +++ /dev/null @@ -1,15 +0,0 @@ -import CorePayments -import Foundation - -struct VenmoState { - - var isVenmoEligible: Bool? - - var isVenmoEligibleResponse: LoadingState = .idle { - didSet { - if case .loaded(let value) = isVenmoEligibleResponse { - isVenmoEligible = value - } - } - } -} From 19239f9c143d5b42d243cc0f5ba1470ed9dbaca7 Mon Sep 17 00:00:00 2001 From: Rich Herrera Date: Thu, 18 Jul 2024 15:50:29 -0600 Subject: [PATCH 54/54] Update Sources/CorePayments/Eligibility/EligibilityAPI.swift Co-authored-by: Jax DesMarais-Leder --- Sources/CorePayments/Eligibility/EligibilityAPI.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/CorePayments/Eligibility/EligibilityAPI.swift b/Sources/CorePayments/Eligibility/EligibilityAPI.swift index 8591e5bf..b6328b67 100644 --- a/Sources/CorePayments/Eligibility/EligibilityAPI.swift +++ b/Sources/CorePayments/Eligibility/EligibilityAPI.swift @@ -27,6 +27,8 @@ class EligibilityAPI { /// Checks merchants eligibility for different payment methods. /// - Returns: An `EligibilityResponse` containing the result of the eligibility check. + /// - Throws: An `Error` describing the failure. + func check(_ eligibilityRequest: EligibilityRequest) async throws -> EligibilityResponse { let variables = EligibilityVariables(eligibilityRequest: eligibilityRequest, clientID: coreConfig.clientID) let graphQLRequest = GraphQLRequest(query: Self.rawQuery, variables: variables)