From d317021bc55af8b45cb48b572d44a957d57e7d28 Mon Sep 17 00:00:00 2001 From: Sakil Mostak <73734619+Sakilmostak@users.noreply.github.com> Date: Tue, 18 Jul 2023 13:07:38 +0530 Subject: [PATCH] feat(connector): [Adyen] Implement Twint in Wallets (#1549) Co-authored-by: chikke srujan <121822803+srujanchikke@users.noreply.github.com> Co-authored-by: Sanchith Hegde <22217505+SanchithHegde@users.noreply.github.com> Co-authored-by: Arjun Karthik --- crates/api_models/src/payments.rs | 2 ++ crates/common_enums/src/enums.rs | 1 + crates/common_enums/src/transformers.rs | 1 + .../src/connector/adyen/transformers.rs | 14 ++++++++++ crates/router/src/types/transformers.rs | 1 + crates/router/tests/connectors/adyen_uk_ui.rs | 26 +++++++++++++++++++ openapi/openapi_spec.json | 13 ++++++++++ 7 files changed, 58 insertions(+) diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index 99452d9b62..cfb6a491fe 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -975,6 +975,8 @@ pub enum WalletData { PaypalSdk(PayPalWalletData), /// The wallet data for Samsung Pay SamsungPay(Box), + /// Wallet data for Twint Redirection + TwintRedirect {}, /// The wallet data for WeChat Pay Redirection WeChatPayRedirect(Box), /// The wallet data for WeChat Pay diff --git a/crates/common_enums/src/enums.rs b/crates/common_enums/src/enums.rs index 652d961849..af38c66bce 100644 --- a/crates/common_enums/src/enums.rs +++ b/crates/common_enums/src/enums.rs @@ -589,6 +589,7 @@ pub enum PaymentMethodType { Sofort, Swish, Trustly, + Twint, UpiCollect, Walley, WeChatPay, diff --git a/crates/common_enums/src/transformers.rs b/crates/common_enums/src/transformers.rs index 4dfd1eb891..9958ed865f 100644 --- a/crates/common_enums/src/transformers.rs +++ b/crates/common_enums/src/transformers.rs @@ -1573,6 +1573,7 @@ impl From for PaymentMethod { PaymentMethodType::Sofort => Self::BankRedirect, PaymentMethodType::Swish => Self::BankRedirect, PaymentMethodType::Trustly => Self::BankRedirect, + PaymentMethodType::Twint => Self::Wallet, PaymentMethodType::UpiCollect => Self::Upi, PaymentMethodType::Walley => Self::PayLater, PaymentMethodType::WeChatPay => Self::Wallet, diff --git a/crates/router/src/connector/adyen/transformers.rs b/crates/router/src/connector/adyen/transformers.rs index fed55595a8..cef533dbf9 100644 --- a/crates/router/src/connector/adyen/transformers.rs +++ b/crates/router/src/connector/adyen/transformers.rs @@ -305,6 +305,7 @@ pub enum AdyenPaymentMethod<'a> { SepaDirectDebit(Box), BacsDirectDebit(Box), SamsungPay(Box), + Twint(Box), } #[derive(Debug, Clone, Serialize)] @@ -658,6 +659,12 @@ pub struct AdyenApplePay { apple_pay_token: Secret, } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TwintWalletData { + #[serde(rename = "type")] + payment_type: PaymentType, +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct AdyenPayLaterData { #[serde(rename = "type")] @@ -735,6 +742,7 @@ pub enum PaymentType { #[serde(rename = "directdebit_GB")] BacsDirectDebit, Samsungpay, + Twint, } pub struct AdyenTestBankNames<'a>(&'a str); @@ -1209,6 +1217,12 @@ impl<'a> TryFrom<&api::WalletData> for AdyenPaymentMethod<'a> { }; Ok(AdyenPaymentMethod::SamsungPay(Box::new(data))) } + api_models::payments::WalletData::TwintRedirect { .. } => { + let data = TwintWalletData { + payment_type: PaymentType::Twint, + }; + Ok(AdyenPaymentMethod::Twint(Box::new(data))) + } _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), } } diff --git a/crates/router/src/types/transformers.rs b/crates/router/src/types/transformers.rs index 9540297c24..dcbed91800 100644 --- a/crates/router/src/types/transformers.rs +++ b/crates/router/src/types/transformers.rs @@ -174,6 +174,7 @@ impl ForeignFrom for api_enums::PaymentMethod { | api_enums::PaymentMethodType::MbWay | api_enums::PaymentMethodType::MobilePay | api_enums::PaymentMethodType::SamsungPay + | api_enums::PaymentMethodType::Twint | api_enums::PaymentMethodType::WeChatPay | api_enums::PaymentMethodType::GoPay => Self::Wallet, api_enums::PaymentMethodType::Affirm diff --git a/crates/router/tests/connectors/adyen_uk_ui.rs b/crates/router/tests/connectors/adyen_uk_ui.rs index 3bb9b2aa54..46692e63e2 100644 --- a/crates/router/tests/connectors/adyen_uk_ui.rs +++ b/crates/router/tests/connectors/adyen_uk_ui.rs @@ -209,6 +209,26 @@ async fn should_make_adyen_clearpay_payment(driver: WebDriver) -> Result<(), Web Ok(()) } +async fn should_make_adyen_twint_payment(driver: WebDriver) -> Result<(), WebDriverError> { + let conn = AdyenSeleniumTest {}; + conn.make_redirection_payment( + driver, + vec![ + Event::Trigger(Trigger::Goto(&format!("{CHEKOUT_BASE_URL}/saved/170"))), + Event::Trigger(Trigger::Click(By::Id("card-submit-btn"))), + Event::Trigger(Trigger::Sleep(5)), + Event::Trigger(Trigger::Click(By::Css("button[value='authorised']"))), + Event::Assert(Assert::IsPresent("Google")), + Event::Assert(Assert::ContainsAny( + Selector::QueryParamStr, + vec!["status=succeeded"], + )), + ], + ) + .await?; + Ok(()) +} + #[test] #[serial] #[ignore] @@ -266,4 +286,10 @@ fn should_make_adyen_clearpay_payment_test() { tester!(should_make_adyen_clearpay_payment); } +#[test] +#[serial] +fn should_make_adyen_twint_payment_test() { + tester!(should_make_adyen_twint_payment); +} + // https://hs-payments-test.netlify.app/paypal-redirect?amount=70.00&country=US¤cy=USD&mandate_data[customer_acceptance][acceptance_type]=offline&mandate_data[customer_acceptance][accepted_at]=1963-05-03T04:07:52.723Z&mandate_data[customer_acceptance][online][ip_address]=127.0.0.1&mandate_data[customer_acceptance][online][user_agent]=amet%20irure%20esse&mandate_data[mandate_type][multi_use][amount]=700&mandate_data[mandate_type][multi_use][currency]=USD&apikey=dev_uFpxA0r6jjbVaxHSY3X0BZLL3erDUzvg3i51abwB1Bknu3fdiPxw475DQgnByn1z diff --git a/openapi/openapi_spec.json b/openapi/openapi_spec.json index 1f8a3962ef..fa928e20fc 100644 --- a/openapi/openapi_spec.json +++ b/openapi/openapi_spec.json @@ -6823,6 +6823,7 @@ "sofort", "swish", "trustly", + "twint", "upi_collect", "walley", "we_chat_pay" @@ -9041,6 +9042,18 @@ } } }, + { + "type": "object", + "required": [ + "twint_redirect" + ], + "properties": { + "twint_redirect": { + "type": "object", + "description": "Wallet data for Twint Redirection" + } + } + }, { "type": "object", "required": [