From dbc83e06fd75b1fd63dbaecdf0d05d2851aec11f Mon Sep 17 00:00:00 2001 From: Peter-John Date: Fri, 24 Nov 2023 11:57:17 +0200 Subject: [PATCH 1/5] MOB-875 Adding MobileMoney Charge endpoint - Added Mobile Money as a supported channel - Added endpoint for Mobile Money charge - Added listener for mobile money events - Added unit tests for endpoint and listener for mobile money charge - Added Mock responses - Updated tests to support mobile money as a channel --- Example/paystack-sdk-ios/ContentView.swift | 14 +++++++-- Package.swift | 4 ++- Sources/PaystackSDK/API/Charge/Charge.swift | 22 +++++++++++++ .../API/Charge/MobileMoneyService.swift | 19 ++++++++++++ .../PaystackSDK/Core/Models/MobileMoney.swift | 9 ++++++ .../Core/Models/Models/Channel.swift | 1 + .../Models/MobileMoneyChargeRequest.swift | 11 +++++++ .../Models/MobileMoneyChargeResponse.swift | 26 ++++++++++++++++ .../Core/Models/Models/MobileMoneyData.swift | 19 ++++++++++++ .../VerifyAccessCode/ChannelOptions.swift | 5 ++- .../API/Charge/ChargeTests.swift | 31 +++++++++++++++++++ .../Resources/ChargeMobileMoneyResponse.json | 15 +++++++++ .../Resources/VerifyAccessCode.json | 17 +++++++++- .../ChargeRepositoryImplementationTests.swift | 2 +- 14 files changed, 189 insertions(+), 6 deletions(-) create mode 100644 Sources/PaystackSDK/API/Charge/MobileMoneyService.swift create mode 100644 Sources/PaystackSDK/Core/Models/MobileMoney.swift create mode 100644 Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeRequest.swift create mode 100644 Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift create mode 100644 Sources/PaystackSDK/Core/Models/Models/MobileMoneyData.swift create mode 100644 Tests/PaystackSDKTests/API/Charge/Resources/ChargeMobileMoneyResponse.json diff --git a/Example/paystack-sdk-ios/ContentView.swift b/Example/paystack-sdk-ios/ContentView.swift index e536dbf..dd2760f 100644 --- a/Example/paystack-sdk-ios/ContentView.swift +++ b/Example/paystack-sdk-ios/ContentView.swift @@ -20,8 +20,18 @@ struct ContentView: View { } .padding() } - - func paymentDone(_ result: TransactionResult) {} + + func paymentDone(_ result: TransactionResult) { + + switch result { + case .completed(let chargeDetails): + print("Success: Transaction reference : \(chargeDetails.reference)") + case .cancelled : + print("Transaction was cancelled.") + case .error(error: let error, reference: let reference) : + print("An error occured with \(reference!) : \(error.message)") + } + } } struct ContentView_Previews: PreviewProvider { diff --git a/Package.swift b/Package.swift index 5fbac13..b8ee040 100644 --- a/Package.swift +++ b/Package.swift @@ -34,7 +34,9 @@ let package = Package( resources: [ .copy("API/Transactions/Resources/VerifyAccessCode.json"), .copy("API/Charge/Resources/ChargeAuthenticationResponse.json"), - .copy("API/Other/Resources/AddressStatesResponse.json") + .copy("API/Other/Resources/AddressStatesResponse.json"), + .copy("API/Charge/Resources/ChargeMobileMoneyResponse.json") + ]) ] ) diff --git a/Sources/PaystackSDK/API/Charge/Charge.swift b/Sources/PaystackSDK/API/Charge/Charge.swift index 2bb30e4..2f69cd0 100644 --- a/Sources/PaystackSDK/API/Charge/Charge.swift +++ b/Sources/PaystackSDK/API/Charge/Charge.swift @@ -4,6 +4,10 @@ public extension Paystack { private var service: ChargeService { return ChargeServiceImplementation(config: config) } + + private var mobileMoneyService: MobileMoneyService { + return MobileMoneyServiceImplementation(config: config) + } /// Continues the Charge flow by authenticating a user with an OTP /// - Parameters: @@ -72,5 +76,23 @@ public extension Paystack { let subscription: any Subscription = PusherSubscription(channelName: channelName, eventName: "response") return Service(subscription) } + + /// Listens for a response after presenting a 3DS URL in a webview for authentication + /// - Parameter transactionId:The ID of the current transaction that is being authenticated + /// - Returns: A ``Service`` with the results of the authentication + func listenForMobileMoneyResponse(for transactionId: Int) -> Service { + let channelName = "MOBILE_MONEY_\(transactionId)" + let subscription: any Subscription = PusherSubscription(channelName: channelName, eventName: "response") + return Service(subscription) + } + + /// Initialize Mobile Money charge + /// - Parameters: + /// - mobileMoneyData: The data that needs to be passed in order to do a mobile money charge + /// - Returns: A ``Service`` with the ``MobileMoneyChargeResponse`` response + func chargeMobileMoney(with mobileMoneyData: MobileMoneyData) -> Service { + let request = MobileMoneyChargeRequest(channelName: mobileMoneyData.channelName, amount: mobileMoneyData.amount, email: mobileMoneyData.email, phone: mobileMoneyData.phone, transaction: mobileMoneyData.transaction, provider: mobileMoneyData.provider) + return mobileMoneyService.postChargeMobileMoney(request) + } } diff --git a/Sources/PaystackSDK/API/Charge/MobileMoneyService.swift b/Sources/PaystackSDK/API/Charge/MobileMoneyService.swift new file mode 100644 index 0000000..2f4c3e3 --- /dev/null +++ b/Sources/PaystackSDK/API/Charge/MobileMoneyService.swift @@ -0,0 +1,19 @@ +import Foundation + +protocol MobileMoneyService: PaystackService { + func postChargeMobileMoney(_ request: MobileMoneyChargeRequest) -> Service +} + +struct MobileMoneyServiceImplementation : MobileMoneyService { + + var config: PaystackConfig + + var parentPath: String { + return "charge" + } + + func postChargeMobileMoney(_ request: MobileMoneyChargeRequest) -> Service { + return post("/mobile_money", request) + .asService() + } +} diff --git a/Sources/PaystackSDK/Core/Models/MobileMoney.swift b/Sources/PaystackSDK/Core/Models/MobileMoney.swift new file mode 100644 index 0000000..4ad8f90 --- /dev/null +++ b/Sources/PaystackSDK/Core/Models/MobileMoney.swift @@ -0,0 +1,9 @@ +import Foundation + +// MARK: - MobileMoney +public struct MobileMoney: Codable { + let key : String + let value: String + let isNew: Bool + let phoneNumberRegex: String +} diff --git a/Sources/PaystackSDK/Core/Models/Models/Channel.swift b/Sources/PaystackSDK/Core/Models/Models/Channel.swift index 2f67596..efbd007 100644 --- a/Sources/PaystackSDK/Core/Models/Models/Channel.swift +++ b/Sources/PaystackSDK/Core/Models/Models/Channel.swift @@ -11,6 +11,7 @@ public enum Channel: String, Codable { case card = "card" case bank = "bank" case ussd = "ussd" + case mobileMoney = "mobile_money" case qr = "qr" case bankTransfer = "bank_transfer" case unsupportedChannel diff --git a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeRequest.swift b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeRequest.swift new file mode 100644 index 0000000..aee2b17 --- /dev/null +++ b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeRequest.swift @@ -0,0 +1,11 @@ +import Foundation + +// MARK: - MobileMoneyChargeRequest +struct MobileMoneyChargeRequest: Codable { + let channelName: String + let amount: Int + let email: String + let phone: String + let transaction: String + let provider: String +} diff --git a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift new file mode 100644 index 0000000..8f813d6 --- /dev/null +++ b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift @@ -0,0 +1,26 @@ +import Foundation + +// MARK: - MobileMoneyChargeResponse +public struct MobileMoneyChargeResponse: Codable { + let status: Bool + let message: String + let data: MobileMoneyChargeData +} + +// MARK: - MobileMoneyChargeData +public struct MobileMoneyChargeData: Codable { + let transaction, phone, provider, channelName: String + let display: Display + + enum CodingKeys: String, CodingKey { + case transaction, phone, provider + case channelName = "channel_name" + case display + } +} + +// MARK: - Display +public struct Display: Codable { + let type, message: String + let timer: Int +} diff --git a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyData.swift b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyData.swift new file mode 100644 index 0000000..573990b --- /dev/null +++ b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyData.swift @@ -0,0 +1,19 @@ +import Foundation + +public struct MobileMoneyData: Equatable { + let channelName: String + let amount: Int + let email : String + let phone: String + let transaction: String + let provider: String + + public init(channelName: String, amount: Int, email: String, phone: String, transaction: String, provider: String) { + self.channelName = channelName + self.amount = amount + self.email = email + self.phone = phone + self.transaction = transaction + self.provider = provider + } +} diff --git a/Sources/PaystackSDK/Core/Models/Models/VerifyAccessCode/ChannelOptions.swift b/Sources/PaystackSDK/Core/Models/Models/VerifyAccessCode/ChannelOptions.swift index c7a8a29..d4cfdda 100644 --- a/Sources/PaystackSDK/Core/Models/Models/VerifyAccessCode/ChannelOptions.swift +++ b/Sources/PaystackSDK/Core/Models/Models/VerifyAccessCode/ChannelOptions.swift @@ -5,16 +5,19 @@ public struct ChannelOptions: Codable { public var bankTransfer: [String]? public var ussd: [String]? public var qrCode: [String]? + public var mobileMoney: [MobileMoney]? - public init(bankTransfer: [String]? = nil, ussd: [String]? = nil, qrCode: [String]? = nil) { + public init(bankTransfer: [String]? = nil, ussd: [String]? = nil, qrCode: [String]? = nil, mobileMoney: [MobileMoney]? = nil) { self.bankTransfer = bankTransfer self.ussd = ussd self.qrCode = qrCode + self.mobileMoney = mobileMoney } enum CodingKeys: String, CodingKey { case ussd case qrCode = "qr" case bankTransfer = "bank_transfer" + case mobileMoney = "mobile_money" } } diff --git a/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift b/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift index 826ebbe..a790092 100644 --- a/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift +++ b/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift @@ -26,6 +26,22 @@ final class ChargeTests: PSTestCase { _ = try serviceUnderTest.authenticateCharge(withOtp: "12345", accessCode: "abcde").sync() } + + func testMobileMoneyCharge() throws { + let mobileMoneyRequestBody = MobileMoneyChargeRequest(channelName: "MOBILE_MONEY_1504248187", amount: 1000, email: "peter@paystack.com", phone: "0723362418", transaction: "1504248187", provider: "MPESA") + + mockServiceExecutor + .expectURL("https://api.paystack.co/charge/mobile_money") + .expectMethod(.post) + .expectHeader("Authorization", "Bearer \(apiKey)") + .expectBody(mobileMoneyRequestBody) + .andReturn(json: "ChargeMobileMoneyResponse") + + let mobileMoneyData = MobileMoneyData(channelName: "MOBILE_MONEY_1504248187", amount: 1000, email: "peter@paystack.com", phone: "0723362418", transaction: "1504248187", provider: "MPESA") + + _ = try serviceUnderTest.chargeMobileMoney(with: mobileMoneyData).sync() + } + func testAuthenticateChargeWithPhoneAuthentication() throws { let phoneRequestBody = SubmitPhoneRequest(phone: "0111234567", accessCode: "abcde") @@ -89,5 +105,20 @@ final class ChargeTests: PSTestCase { _ = try serviceUnderTest.listenFor3DSResponse(for: transactionId).sync() } + + func testListenForMobileMoney() throws { + let transactionId = 1234 + let mockSubscription = PusherSubscription(channelName: "MOBILE_MONEY_\(transactionId)", + eventName: "response") + + // swiftlint:disable:next line_length + let responseString = "{\"redirecturl\":\"?trxref=2wdckavunc&reference=2wdckavunc\",\"trans\":\"1234\",\"trxref\":\"2wdckavunc\",\"reference\":\"2wdckavunc\",\"status\":\"success\",\"message\":\"Success\",\"response\":\"Approved\"}" + + mockSubscriptionListener + .expectSubscription(mockSubscription) + .andReturnString(responseString) + + _ = try serviceUnderTest.listenForMobileMoneyResponse(for: transactionId).sync() + } } diff --git a/Tests/PaystackSDKTests/API/Charge/Resources/ChargeMobileMoneyResponse.json b/Tests/PaystackSDKTests/API/Charge/Resources/ChargeMobileMoneyResponse.json new file mode 100644 index 0000000..ba39200 --- /dev/null +++ b/Tests/PaystackSDKTests/API/Charge/Resources/ChargeMobileMoneyResponse.json @@ -0,0 +1,15 @@ +{ + "status": true, + "message": "Charge attempted", + "data": { + "transaction": "1504248187", + "phone": "0703362111", + "provider": "MPESA", + "channel_name": "MOBILE_MONEY_1504248187", + "display": { + "type": "pop", + "message": "Please complete authorization process on your mobile phone", + "timer": 60 + } + } +} diff --git a/Tests/PaystackSDKTests/API/Transactions/Resources/VerifyAccessCode.json b/Tests/PaystackSDKTests/API/Transactions/Resources/VerifyAccessCode.json index d0dafd2..aea7d2d 100644 --- a/Tests/PaystackSDKTests/API/Transactions/Resources/VerifyAccessCode.json +++ b/Tests/PaystackSDKTests/API/Transactions/Resources/VerifyAccessCode.json @@ -15,12 +15,27 @@ "card", "qr", "ussd", - "eft" + "eft", + "mobile_money" ], "channel_options": { "qr": [ "visa" ], + "mobile_money": [ + { + "key": "MPESA", + "value": "M-PESA", + "isNew": true, + "phoneNumberRegex": "^\\+254(7([0-2]\\d|4\\d|5(7|8|9)|6(8|9)|9[0-9])|(11\\d))\\d{6}$" + }, + { + "key": "MPESA_OFF", + "value": "M-PESA", + "isNew": false, + "phoneNumberRegex": "^\\+254(7([0-2]\\d|4\\d|5(7|8|9)|6(8|9)|9[0-9])|(11\\d))\\d{6}$" + } + ], "ussd": [ "737", "822", diff --git a/Tests/PaystackSDKTests/UI/Charge/ChargeRepositoryImplementationTests.swift b/Tests/PaystackSDKTests/UI/Charge/ChargeRepositoryImplementationTests.swift index 2e4ca1e..f7a9328 100644 --- a/Tests/PaystackSDKTests/UI/Charge/ChargeRepositoryImplementationTests.swift +++ b/Tests/PaystackSDKTests/UI/Charge/ChargeRepositoryImplementationTests.swift @@ -26,7 +26,7 @@ final class ChargeRepositoryImplementationTests: PSTestCase { let expectedResult = VerifyAccessCode(amount: 10000, currency: "NGN", accessCode: "Access_Code_Test", - paymentChannels: [.card, .qr, .ussd], + paymentChannels: [.card, .qr, .ussd,.mobileMoney], domain: .test, merchantName: "Test Merchant", publicEncryptionKey: "test_encryption_key", From 49156d41b47e78b8c2df2f1215de889d390b7903 Mon Sep 17 00:00:00 2001 From: Peter-John Date: Fri, 24 Nov 2023 12:29:21 +0200 Subject: [PATCH 2/5] MOB-875 Adding MobileMoney Charge endpoint - Added Mobile Money as a supported channel - Added endpoint for Mobile Money charge - Added listener for mobile money events - Added unit tests for endpoint and listener for mobile money charge - Added Mock responses - Updated tests to support mobile money as a channel --- .../Core/Models/Models/MobileMoneyChargeResponse.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift index 8f813d6..a7dcb56 100644 --- a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift +++ b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift @@ -14,7 +14,7 @@ public struct MobileMoneyChargeData: Codable { enum CodingKeys: String, CodingKey { case transaction, phone, provider - case channelName = "channel_name" + case channelName case display } } From 570ca660df623fbac12428eb90e53db8fd7897e7 Mon Sep 17 00:00:00 2001 From: Peter-John Date: Fri, 24 Nov 2023 12:53:55 +0200 Subject: [PATCH 3/5] MOB-875 Adding MobileMoney Charge endpoint - Added Mobile Money as a supported channel - Added endpoint for Mobile Money charge - Added listener for mobile money events - Added unit tests for endpoint and listener for mobile money charge - Added Mock responses - Updated tests to support mobile money as a channel --- Example/paystack-sdk-ios/ContentView.swift | 8 ++++---- Package.swift | 2 +- Sources/PaystackSDK/API/Charge/Charge.swift | 7 +++---- .../PaystackSDK/API/Charge/MobileMoneyService.swift | 6 +++--- Sources/PaystackSDK/Core/Models/MobileMoney.swift | 2 +- .../Models/Models/MobileMoneyChargeResponse.swift | 12 +++++++++--- .../Core/Models/Models/MobileMoneyData.swift | 4 ++-- Tests/PaystackSDKTests/API/Charge/ChargeTests.swift | 7 +++---- .../Charge/ChargeRepositoryImplementationTests.swift | 2 +- 9 files changed, 27 insertions(+), 23 deletions(-) diff --git a/Example/paystack-sdk-ios/ContentView.swift b/Example/paystack-sdk-ios/ContentView.swift index dd2760f..fcf727d 100644 --- a/Example/paystack-sdk-ios/ContentView.swift +++ b/Example/paystack-sdk-ios/ContentView.swift @@ -20,15 +20,15 @@ struct ContentView: View { } .padding() } - + func paymentDone(_ result: TransactionResult) { - + switch result { case .completed(let chargeDetails): print("Success: Transaction reference : \(chargeDetails.reference)") - case .cancelled : + case .cancelled: print("Transaction was cancelled.") - case .error(error: let error, reference: let reference) : + case .error(error: let error, reference: let reference): print("An error occured with \(reference!) : \(error.message)") } } diff --git a/Package.swift b/Package.swift index b8ee040..7a921fc 100644 --- a/Package.swift +++ b/Package.swift @@ -36,7 +36,7 @@ let package = Package( .copy("API/Charge/Resources/ChargeAuthenticationResponse.json"), .copy("API/Other/Resources/AddressStatesResponse.json"), .copy("API/Charge/Resources/ChargeMobileMoneyResponse.json") - + ]) ] ) diff --git a/Sources/PaystackSDK/API/Charge/Charge.swift b/Sources/PaystackSDK/API/Charge/Charge.swift index 2f69cd0..3c9184c 100644 --- a/Sources/PaystackSDK/API/Charge/Charge.swift +++ b/Sources/PaystackSDK/API/Charge/Charge.swift @@ -4,7 +4,7 @@ public extension Paystack { private var service: ChargeService { return ChargeServiceImplementation(config: config) } - + private var mobileMoneyService: MobileMoneyService { return MobileMoneyServiceImplementation(config: config) } @@ -76,7 +76,7 @@ public extension Paystack { let subscription: any Subscription = PusherSubscription(channelName: channelName, eventName: "response") return Service(subscription) } - + /// Listens for a response after presenting a 3DS URL in a webview for authentication /// - Parameter transactionId:The ID of the current transaction that is being authenticated /// - Returns: A ``Service`` with the results of the authentication @@ -85,7 +85,7 @@ public extension Paystack { let subscription: any Subscription = PusherSubscription(channelName: channelName, eventName: "response") return Service(subscription) } - + /// Initialize Mobile Money charge /// - Parameters: /// - mobileMoneyData: The data that needs to be passed in order to do a mobile money charge @@ -94,5 +94,4 @@ public extension Paystack { let request = MobileMoneyChargeRequest(channelName: mobileMoneyData.channelName, amount: mobileMoneyData.amount, email: mobileMoneyData.email, phone: mobileMoneyData.phone, transaction: mobileMoneyData.transaction, provider: mobileMoneyData.provider) return mobileMoneyService.postChargeMobileMoney(request) } - } diff --git a/Sources/PaystackSDK/API/Charge/MobileMoneyService.swift b/Sources/PaystackSDK/API/Charge/MobileMoneyService.swift index 2f4c3e3..e2fc647 100644 --- a/Sources/PaystackSDK/API/Charge/MobileMoneyService.swift +++ b/Sources/PaystackSDK/API/Charge/MobileMoneyService.swift @@ -4,14 +4,14 @@ protocol MobileMoneyService: PaystackService { func postChargeMobileMoney(_ request: MobileMoneyChargeRequest) -> Service } -struct MobileMoneyServiceImplementation : MobileMoneyService { - +struct MobileMoneyServiceImplementation: MobileMoneyService { + var config: PaystackConfig var parentPath: String { return "charge" } - + func postChargeMobileMoney(_ request: MobileMoneyChargeRequest) -> Service { return post("/mobile_money", request) .asService() diff --git a/Sources/PaystackSDK/Core/Models/MobileMoney.swift b/Sources/PaystackSDK/Core/Models/MobileMoney.swift index 4ad8f90..ce88752 100644 --- a/Sources/PaystackSDK/Core/Models/MobileMoney.swift +++ b/Sources/PaystackSDK/Core/Models/MobileMoney.swift @@ -2,7 +2,7 @@ import Foundation // MARK: - MobileMoney public struct MobileMoney: Codable { - let key : String + let key: String let value: String let isNew: Bool let phoneNumberRegex: String diff --git a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift index a7dcb56..cb8575a 100644 --- a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift +++ b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyChargeResponse.swift @@ -9,11 +9,16 @@ public struct MobileMoneyChargeResponse: Codable { // MARK: - MobileMoneyChargeData public struct MobileMoneyChargeData: Codable { - let transaction, phone, provider, channelName: String + let transaction: String + let phone: String + let provider: String + let channelName: String let display: Display enum CodingKeys: String, CodingKey { - case transaction, phone, provider + case transaction + case phone + case provider case channelName case display } @@ -21,6 +26,7 @@ public struct MobileMoneyChargeData: Codable { // MARK: - Display public struct Display: Codable { - let type, message: String + let type: String + let message: String let timer: Int } diff --git a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyData.swift b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyData.swift index 573990b..a6075b7 100644 --- a/Sources/PaystackSDK/Core/Models/Models/MobileMoneyData.swift +++ b/Sources/PaystackSDK/Core/Models/Models/MobileMoneyData.swift @@ -3,11 +3,11 @@ import Foundation public struct MobileMoneyData: Equatable { let channelName: String let amount: Int - let email : String + let email: String let phone: String let transaction: String let provider: String - + public init(channelName: String, amount: Int, email: String, phone: String, transaction: String, provider: String) { self.channelName = channelName self.amount = amount diff --git a/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift b/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift index a790092..ee798fa 100644 --- a/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift +++ b/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift @@ -26,7 +26,7 @@ final class ChargeTests: PSTestCase { _ = try serviceUnderTest.authenticateCharge(withOtp: "12345", accessCode: "abcde").sync() } - + func testMobileMoneyCharge() throws { let mobileMoneyRequestBody = MobileMoneyChargeRequest(channelName: "MOBILE_MONEY_1504248187", amount: 1000, email: "peter@paystack.com", phone: "0723362418", transaction: "1504248187", provider: "MPESA") @@ -36,13 +36,12 @@ final class ChargeTests: PSTestCase { .expectHeader("Authorization", "Bearer \(apiKey)") .expectBody(mobileMoneyRequestBody) .andReturn(json: "ChargeMobileMoneyResponse") - + let mobileMoneyData = MobileMoneyData(channelName: "MOBILE_MONEY_1504248187", amount: 1000, email: "peter@paystack.com", phone: "0723362418", transaction: "1504248187", provider: "MPESA") _ = try serviceUnderTest.chargeMobileMoney(with: mobileMoneyData).sync() } - func testAuthenticateChargeWithPhoneAuthentication() throws { let phoneRequestBody = SubmitPhoneRequest(phone: "0111234567", accessCode: "abcde") @@ -105,7 +104,7 @@ final class ChargeTests: PSTestCase { _ = try serviceUnderTest.listenFor3DSResponse(for: transactionId).sync() } - + func testListenForMobileMoney() throws { let transactionId = 1234 let mockSubscription = PusherSubscription(channelName: "MOBILE_MONEY_\(transactionId)", diff --git a/Tests/PaystackSDKTests/UI/Charge/ChargeRepositoryImplementationTests.swift b/Tests/PaystackSDKTests/UI/Charge/ChargeRepositoryImplementationTests.swift index f7a9328..5b598ad 100644 --- a/Tests/PaystackSDKTests/UI/Charge/ChargeRepositoryImplementationTests.swift +++ b/Tests/PaystackSDKTests/UI/Charge/ChargeRepositoryImplementationTests.swift @@ -26,7 +26,7 @@ final class ChargeRepositoryImplementationTests: PSTestCase { let expectedResult = VerifyAccessCode(amount: 10000, currency: "NGN", accessCode: "Access_Code_Test", - paymentChannels: [.card, .qr, .ussd,.mobileMoney], + paymentChannels: [.card, .qr, .ussd, .mobileMoney], domain: .test, merchantName: "Test Merchant", publicEncryptionKey: "test_encryption_key", From cb4ab6b62611e48519ca4d378b0416a6ea1d366e Mon Sep 17 00:00:00 2001 From: Peter-John Date: Fri, 24 Nov 2023 14:14:34 +0200 Subject: [PATCH 4/5] MOB-875 Adding MobileMoney Charge endpoint - Added Mobile Money as a supported channel - Added endpoint for Mobile Money charge - Added listener for mobile money events - Added unit tests for endpoint and listener for mobile money charge - Added Mock responses - Updated tests to support mobile money as a channel --- Sources/PaystackSDK/API/Charge/Charge.swift | 2 ++ Tests/PaystackSDKTests/API/Charge/ChargeTests.swift | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Sources/PaystackSDK/API/Charge/Charge.swift b/Sources/PaystackSDK/API/Charge/Charge.swift index 3c9184c..d4990bc 100644 --- a/Sources/PaystackSDK/API/Charge/Charge.swift +++ b/Sources/PaystackSDK/API/Charge/Charge.swift @@ -1,3 +1,4 @@ +// swiftlint:disable file_length type_body_length import Foundation public extension Paystack { @@ -95,3 +96,4 @@ public extension Paystack { return mobileMoneyService.postChargeMobileMoney(request) } } +// swiftlint:enable file_length type_body_length diff --git a/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift b/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift index ee798fa..0401be3 100644 --- a/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift +++ b/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift @@ -1,3 +1,4 @@ +// swiftlint:disable file_length type_body_length import XCTest @testable import PaystackCore @@ -121,3 +122,4 @@ final class ChargeTests: PSTestCase { } } +// swiftlint:enable file_length type_body_length From 9054f47ecd534bfe4bd1bf23041a36c78b2f45c8 Mon Sep 17 00:00:00 2001 From: Peter-John Date: Mon, 27 Nov 2023 15:12:36 +0200 Subject: [PATCH 5/5] MOB-875 Adding MobileMoney Charge endpoint - Added Mobile Money as a supported channel - Added endpoint for Mobile Money charge - Added listener for mobile money events - Added unit tests for endpoint and listener for mobile money charge - Added Mock responses - Updated tests to support mobile money as a channel --- Sources/PaystackSDK/API/Charge/Charge.swift | 4 ++-- Tests/PaystackSDKTests/API/Charge/ChargeTests.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/PaystackSDK/API/Charge/Charge.swift b/Sources/PaystackSDK/API/Charge/Charge.swift index d4990bc..230dc5c 100644 --- a/Sources/PaystackSDK/API/Charge/Charge.swift +++ b/Sources/PaystackSDK/API/Charge/Charge.swift @@ -1,4 +1,4 @@ -// swiftlint:disable file_length type_body_length +// swiftlint:disable file_length type_body_length line_length import Foundation public extension Paystack { @@ -96,4 +96,4 @@ public extension Paystack { return mobileMoneyService.postChargeMobileMoney(request) } } -// swiftlint:enable file_length type_body_length +// swiftlint:enable file_length type_body_length line_length diff --git a/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift b/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift index 0401be3..067a8a2 100644 --- a/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift +++ b/Tests/PaystackSDKTests/API/Charge/ChargeTests.swift @@ -1,4 +1,4 @@ -// swiftlint:disable file_length type_body_length +// swiftlint:disable file_length type_body_length line_length import XCTest @testable import PaystackCore @@ -122,4 +122,4 @@ final class ChargeTests: PSTestCase { } } -// swiftlint:enable file_length type_body_length +// swiftlint:enable file_length type_body_length line_length