diff --git a/crates/router/src/connector/adyen/transformers.rs b/crates/router/src/connector/adyen/transformers.rs index bb0e3a4c90..d2956d8ff7 100644 --- a/crates/router/src/connector/adyen/transformers.rs +++ b/crates/router/src/connector/adyen/transformers.rs @@ -267,6 +267,7 @@ pub enum AdyenPaymentMethod<'a> { BancontactCard(Box), Bizum(Box), Blik(Box), + ClearPay(Box), Eps(Box>), Giropay(Box), Gpay(Box), @@ -680,6 +681,7 @@ pub enum PaymentType { Applepay, Bizum, Blik, + ClearPay, Eps, Giropay, Googlepay, @@ -919,7 +921,8 @@ fn get_address_info(address: Option<&api_models::payments::Address>) -> Option Vec { - let order_details = item.request.order_details.clone(); + let order_details: Option> = + item.request.order_details.clone(); match order_details { Some(od) => od .iter() @@ -937,7 +940,7 @@ fn get_line_items(item: &types::PaymentsAuthorizeRouterData) -> Vec { let line_item = LineItem { amount_including_tax: Some(item.request.amount), amount_excluding_tax: Some(item.request.amount), - description: None, + description: item.description.clone(), id: Some(String::from("Items #1")), tax_amount: None, quantity: Some(1), @@ -1178,9 +1181,14 @@ impl<'a> TryFrom<&api::WalletData> for AdyenPaymentMethod<'a> { } } -impl<'a> TryFrom<&api::PayLaterData> for AdyenPaymentMethod<'a> { +impl<'a> TryFrom<(&api::PayLaterData, Option)> + for AdyenPaymentMethod<'a> +{ type Error = Error; - fn try_from(pay_later_data: &api::PayLaterData) -> Result { + fn try_from( + value: (&api::PayLaterData, Option), + ) -> Result { + let (pay_later_data, country_code) = value; match pay_later_data { api_models::payments::PayLaterData::KlarnaRedirect { .. } => { let klarna = AdyenPayLaterData { @@ -1194,9 +1202,25 @@ impl<'a> TryFrom<&api::PayLaterData> for AdyenPaymentMethod<'a> { })), ), api_models::payments::PayLaterData::AfterpayClearpayRedirect { .. } => { - Ok(AdyenPaymentMethod::AfterPay(Box::new(AdyenPayLaterData { - payment_type: PaymentType::Afterpaytouch, - }))) + if let Some(country) = country_code { + match country { + api_enums::CountryAlpha2::IT + | api_enums::CountryAlpha2::FR + | api_enums::CountryAlpha2::ES + | api_enums::CountryAlpha2::GB => { + Ok(AdyenPaymentMethod::ClearPay(Box::new(AdyenPayLaterData { + payment_type: PaymentType::ClearPay, + }))) + } + _ => Ok(AdyenPaymentMethod::AfterPay(Box::new(AdyenPayLaterData { + payment_type: PaymentType::Afterpaytouch, + }))), + } + } else { + Err(errors::ConnectorError::MissingRequiredField { + field_name: "country", + })? + } } api_models::payments::PayLaterData::PayBrightRedirect { .. } => { Ok(AdyenPaymentMethod::PayBright(Box::new(PayBrightData { @@ -1647,7 +1671,8 @@ impl<'a> TryFrom<(&types::PaymentsAuthorizeRouterData, &api::PayLaterData)> let auth_type = AdyenAuthType::try_from(&item.connector_auth_type)?; let browser_info = get_browser_info(item)?; let additional_data = get_additional_data(item); - let payment_method = AdyenPaymentMethod::try_from(paylater_data)?; + let country_code = get_country_code(item); + let payment_method = AdyenPaymentMethod::try_from((paylater_data, country_code))?; let shopper_interaction = AdyenShopperInteraction::from(item); let (recurring_processing_model, store_payment_method, shopper_reference) = get_recurring_processing_model(item)?; @@ -1656,7 +1681,6 @@ impl<'a> TryFrom<(&types::PaymentsAuthorizeRouterData, &api::PayLaterData)> let shopper_email = item.request.email.clone(); let billing_address = get_address_info(item.address.billing.as_ref()); let delivery_address = get_address_info(item.address.shipping.as_ref()); - let country_code = get_country_code(item); let line_items = Some(get_line_items(item)); let telephone_number = get_telephone_number(item); Ok(AdyenPaymentRequest { diff --git a/crates/router/tests/connectors/adyen_uk_ui.rs b/crates/router/tests/connectors/adyen_uk_ui.rs index 250ec55a41..256d51bfb9 100644 --- a/crates/router/tests/connectors/adyen_uk_ui.rs +++ b/crates/router/tests/connectors/adyen_uk_ui.rs @@ -192,6 +192,23 @@ async fn should_make_adyen_bizum_payment(driver: WebDriver) -> Result<(), WebDri Ok(()) } +async fn should_make_adyen_clearpay_payment(driver: WebDriver) -> Result<(), WebDriverError> { + let conn = AdyenSeleniumTest {}; + conn.make_clearpay_payment( + driver, + &format!("{CHEKOUT_BASE_URL}/saved/163"), + vec![ + Event::Assert(Assert::IsPresent("Google")), + Event::Assert(Assert::ContainsAny( + Selector::QueryParamStr, + vec!["status=succeeded"], + )), + ], + ) + .await?; + Ok(()) +} + #[test] #[serial] #[ignore] @@ -243,4 +260,10 @@ fn should_make_adyen_bizum_payment_test() { tester!(should_make_adyen_bizum_payment); } +#[test] +#[serial] +fn should_make_adyen_clearpay_payment_test() { + tester!(should_make_adyen_clearpay_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/crates/router/tests/connectors/selenium.rs b/crates/router/tests/connectors/selenium.rs index a77937abbc..d8f78f3f45 100644 --- a/crates/router/tests/connectors/selenium.rs +++ b/crates/router/tests/connectors/selenium.rs @@ -542,6 +542,53 @@ pub trait SeleniumTest { pypl_actions.extend(actions); self.complete_actions(&web_driver, pypl_actions).await } + async fn make_clearpay_payment( + &self, + driver: WebDriver, + url: &str, + actions: Vec>, + ) -> Result<(), WebDriverError> { + self.complete_actions( + &driver, + vec![ + Event::Trigger(Trigger::Goto(url)), + Event::Trigger(Trigger::Click(By::Id("card-submit-btn"))), + ], + ) + .await?; + let (email, pass) = ( + &self + .get_configs() + .automation_configs + .unwrap() + .clearpay_email + .unwrap(), + &self + .get_configs() + .automation_configs + .unwrap() + .clearpay_pass + .unwrap(), + ); + let mut clearpay_actions = vec![ + Event::Trigger(Trigger::Sleep(3)), + Event::EitherOr( + Assert::IsPresent("Review your order | Clearpay"), + vec![Event::Trigger(Trigger::Click(By::ClassName("ai_az")))], + vec![ + Event::Trigger(Trigger::SendKeys(By::ClassName("n8_fl"), email)), + Event::Trigger(Trigger::Click(By::ClassName("ai_az"))), + Event::Trigger(Trigger::Sleep(3)), + Event::Trigger(Trigger::SendKeys(By::ClassName("n8_fl"), pass)), + Event::Trigger(Trigger::Click(By::ClassName("ai_az"))), + Event::Trigger(Trigger::Sleep(10)), //Time needed for login + Event::Trigger(Trigger::Click(By::ClassName("ai_az"))), + ], + ), + ]; + clearpay_actions.extend(actions); + self.complete_actions(&driver, clearpay_actions).await + } } async fn is_text_present_now(driver: &WebDriver, key: &str) -> WebDriverResult { let mut xpath = "//*[contains(text(),'".to_owned(); diff --git a/crates/test_utils/src/connector_auth.rs b/crates/test_utils/src/connector_auth.rs index 116efe209d..e453b86efb 100644 --- a/crates/test_utils/src/connector_auth.rs +++ b/crates/test_utils/src/connector_auth.rs @@ -249,6 +249,8 @@ pub struct AutomationConfigs { pub pypl_pass: Option, pub gmail_email: Option, pub gmail_pass: Option, + pub clearpay_email: Option, + pub clearpay_pass: Option, pub configs_url: Option, pub stripe_pub_key: Option, pub testcases_path: Option,