Files
Narayan Bhat 028e140144 feat(stripe): eps, giropay and ideal using stripe (#529)
Co-authored-by: Sangamesh <sangamesh.kulkarni@juspay.in>
2023-02-26 16:29:37 +00:00

311 lines
10 KiB
Rust

use std::marker::PhantomData;
use router::{
core::payments,
db::StorageImpl,
routes,
types::{self, api, storage::enums, PaymentAddress},
};
use crate::connector_auth::ConnectorAuthentication;
fn construct_payment_router_data() -> types::PaymentsAuthorizeRouterData {
let auth = ConnectorAuthentication::new()
.checkout
.expect("Missing Checkout connector authentication configuration");
types::RouterData {
flow: PhantomData,
merchant_id: "checkout".to_string(),
connector: "checkout".to_string(),
payment_id: uuid::Uuid::new_v4().to_string(),
attempt_id: uuid::Uuid::new_v4().to_string(),
status: enums::AttemptStatus::default(),
router_return_url: None,
auth_type: enums::AuthenticationType::NoThreeDs,
payment_method: enums::PaymentMethod::Card,
connector_auth_type: auth.into(),
description: Some("This is a test".to_string()),
return_url: None,
request: types::PaymentsAuthorizeData {
amount: 100,
currency: enums::Currency::USD,
payment_method_data: types::api::PaymentMethodData::Card(api::Card {
card_number: "4242424242424242".to_string().into(),
card_exp_month: "10".to_string().into(),
card_exp_year: "35".to_string().into(),
card_holder_name: "John Doe".to_string().into(),
card_cvc: "123".to_string().into(),
card_issuer: None,
card_network: None,
}),
confirm: true,
statement_descriptor_suffix: None,
setup_future_usage: None,
mandate_id: None,
off_session: None,
setup_mandate_details: None,
capture_method: None,
browser_info: None,
order_details: None,
email: None,
payment_experience: None,
payment_method_type: None,
},
response: Err(types::ErrorResponse::default()),
payment_method_id: None,
address: PaymentAddress::default(),
connector_meta_data: None,
amount_captured: None,
access_token: None,
session_token: None,
reference_id: None,
}
}
fn construct_refund_router_data<F>() -> types::RefundsRouterData<F> {
let auth = ConnectorAuthentication::new()
.checkout
.expect("Missing Checkout connector authentication configuration");
types::RouterData {
flow: PhantomData,
connector_meta_data: None,
merchant_id: "checkout".to_string(),
connector: "checkout".to_string(),
payment_id: uuid::Uuid::new_v4().to_string(),
attempt_id: uuid::Uuid::new_v4().to_string(),
status: enums::AttemptStatus::default(),
router_return_url: None,
payment_method: enums::PaymentMethod::Card,
auth_type: enums::AuthenticationType::NoThreeDs,
connector_auth_type: auth.into(),
description: Some("This is a test".to_string()),
return_url: None,
request: types::RefundsData {
amount: 100,
currency: enums::Currency::USD,
refund_id: uuid::Uuid::new_v4().to_string(),
connector_transaction_id: String::new(),
refund_amount: 10,
connector_metadata: None,
reason: None,
connector_refund_id: None,
},
response: Err(types::ErrorResponse::default()),
payment_method_id: None,
address: PaymentAddress::default(),
amount_captured: None,
access_token: None,
session_token: None,
reference_id: None,
}
}
#[actix_web::test]
#[ignore]
async fn test_checkout_payment_success() {
use router::{configs::settings::Settings, connector::Checkout, services};
let conf = Settings::new().unwrap();
static CV: Checkout = Checkout;
let connector = types::api::ConnectorData {
connector: Box::new(&CV),
connector_name: types::Connector::Checkout,
get_token: types::api::GetToken::Connector,
};
let state = routes::AppState::with_storage(conf, StorageImpl::PostgresqlTest).await;
let connector_integration: services::BoxedConnectorIntegration<
'_,
types::api::Authorize,
types::PaymentsAuthorizeData,
types::PaymentsResponseData,
> = connector.connector.get_connector_integration();
let request = construct_payment_router_data();
let response = services::api::execute_connector_processing_step(
&state,
connector_integration,
&request,
payments::CallConnectorAction::Trigger,
)
.await
.unwrap();
println!("{response:?}");
assert!(
response.status == enums::AttemptStatus::Charged,
"The payment failed"
);
}
#[actix_web::test]
#[ignore]
async fn test_checkout_refund_success() {
// Successful payment
use router::{configs::settings::Settings, connector::Checkout, services};
let conf = Settings::new().expect("invalid settings");
let state = routes::AppState::with_storage(conf, StorageImpl::PostgresqlTest).await;
static CV: Checkout = Checkout;
let connector = types::api::ConnectorData {
connector: Box::new(&CV),
connector_name: types::Connector::Checkout,
get_token: types::api::GetToken::Connector,
};
let connector_integration: services::BoxedConnectorIntegration<
'_,
types::api::Authorize,
types::PaymentsAuthorizeData,
types::PaymentsResponseData,
> = connector.connector.get_connector_integration();
let request = construct_payment_router_data();
let response = services::api::execute_connector_processing_step(
&state,
connector_integration,
&request,
payments::CallConnectorAction::Trigger,
)
.await
.unwrap();
println!("{response:?}");
assert!(
response.status == enums::AttemptStatus::Charged,
"The payment failed"
);
// Successful refund
let connector_integration: services::BoxedConnectorIntegration<
'_,
types::api::Execute,
types::RefundsData,
types::RefundsResponseData,
> = connector.connector.get_connector_integration();
let mut refund_request = construct_refund_router_data();
refund_request.request.connector_transaction_id = match response.response.unwrap() {
types::PaymentsResponseData::TransactionResponse { resource_id, .. } => {
resource_id.get_connector_transaction_id().unwrap()
}
_ => panic!("Connector transaction id not found"),
};
let response = services::api::execute_connector_processing_step(
&state,
connector_integration,
&refund_request,
payments::CallConnectorAction::Trigger,
)
.await;
let response = response.unwrap();
println!("{response:?}");
assert!(
response.response.unwrap().refund_status == enums::RefundStatus::Success,
"The refund failed"
);
}
#[actix_web::test]
async fn test_checkout_payment_failure() {
use router::{configs::settings::Settings, connector::Checkout, services};
let conf = Settings::new().expect("invalid settings");
let state = routes::AppState::with_storage(conf, StorageImpl::PostgresqlTest).await;
static CV: Checkout = Checkout;
let connector = types::api::ConnectorData {
connector: Box::new(&CV),
connector_name: types::Connector::Checkout,
get_token: types::api::GetToken::Connector,
};
let connector_integration: services::BoxedConnectorIntegration<
'_,
types::api::Authorize,
types::PaymentsAuthorizeData,
types::PaymentsResponseData,
> = connector.connector.get_connector_integration();
let mut request = construct_payment_router_data();
request.connector_auth_type = types::ConnectorAuthType::BodyKey {
api_key: "".to_string(),
key1: "".to_string(),
};
let response = services::api::execute_connector_processing_step(
&state,
connector_integration,
&request,
payments::CallConnectorAction::Trigger,
)
.await;
assert!(response.is_err(), "The payment passed");
}
#[actix_web::test]
#[ignore]
async fn test_checkout_refund_failure() {
use router::{configs::settings::Settings, connector::Checkout, services};
let conf = Settings::new().expect("invalid settings");
let state = routes::AppState::with_storage(conf, StorageImpl::PostgresqlTest).await;
static CV: Checkout = Checkout;
let connector = types::api::ConnectorData {
connector: Box::new(&CV),
connector_name: types::Connector::Checkout,
get_token: types::api::GetToken::Connector,
};
let connector_integration: services::BoxedConnectorIntegration<
'_,
types::api::Authorize,
types::PaymentsAuthorizeData,
types::PaymentsResponseData,
> = connector.connector.get_connector_integration();
let request = construct_payment_router_data();
let response = services::api::execute_connector_processing_step(
&state,
connector_integration,
&request,
payments::CallConnectorAction::Trigger,
)
.await
.unwrap();
assert!(
response.status == enums::AttemptStatus::Charged,
"The payment failed"
);
// Unsuccessful refund
let connector_integration: services::BoxedConnectorIntegration<
'_,
types::api::Execute,
types::RefundsData,
types::RefundsResponseData,
> = connector.connector.get_connector_integration();
let mut refund_request = construct_refund_router_data();
refund_request.request.connector_transaction_id = match response.response.unwrap() {
types::PaymentsResponseData::TransactionResponse { resource_id, .. } => {
resource_id.get_connector_transaction_id().unwrap()
}
_ => panic!("Connector transaction id not found"),
};
// Higher amount than that of payment
refund_request.request.refund_amount = 696969;
let response = services::api::execute_connector_processing_step(
&state,
connector_integration,
&refund_request,
payments::CallConnectorAction::Trigger,
)
.await;
println!("{response:?}");
let response = response.unwrap();
assert!(response.response.is_err());
let code = response.response.unwrap_err().code;
assert_eq!(code, "refund_amount_exceeds_balance");
}