mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-27 03:13:56 +08:00
790 lines
26 KiB
Rust
790 lines
26 KiB
Rust
#![allow(
|
|
clippy::expect_used,
|
|
clippy::unwrap_in_result,
|
|
clippy::unwrap_used,
|
|
clippy::print_stdout
|
|
)]
|
|
|
|
mod utils;
|
|
|
|
use std::{borrow::Cow, sync::Arc};
|
|
|
|
use common_utils::{id_type, types::MinorUnit};
|
|
use router::{
|
|
configs,
|
|
core::payments,
|
|
db::StorageImpl,
|
|
routes, services,
|
|
types::{
|
|
self,
|
|
api::{self, enums as api_enums},
|
|
},
|
|
};
|
|
use time::macros::datetime;
|
|
use tokio::sync::oneshot;
|
|
use uuid::Uuid;
|
|
|
|
// setting the connector in environment variables doesn't work when run in parallel. Neither does passing the paymentid
|
|
// do we'll test refund and payment in same tests and later implement thread_local variables.
|
|
// When test-connector feature is enabled, you can pass the connector name in description
|
|
|
|
#[actix_web::test]
|
|
#[ignore]
|
|
// verify the API-KEY/merchant id has stripe as first choice
|
|
async fn payments_create_stripe() {
|
|
Box::pin(utils::setup()).await;
|
|
|
|
let payment_id = format!("test_{}", Uuid::new_v4());
|
|
let api_key = ("API-KEY", "MySecretApiKey");
|
|
|
|
let request = serde_json::json!({
|
|
"payment_id" : payment_id,
|
|
"merchant_id" : "jarnura",
|
|
"amount" : 1000,
|
|
"currency" : "USD",
|
|
"amount_to_capture" : 1000,
|
|
"confirm" : true,
|
|
"customer" : "test_customer",
|
|
"customer_email" : "test@gmail.com",
|
|
"customer_name" : "Test",
|
|
"description" : "stripe",
|
|
"return_url" : "https://juspay.in/",
|
|
"payment_method_data" : {"card" : {"card_number":"4242424242424242","card_exp_month":"12","card_exp_year":"29","card_holder_name":"JohnDoe","card_cvc":"123"}},
|
|
"payment_method" : "card",
|
|
"statement_descriptor_name" : "Test Merchant",
|
|
"statement_descriptor_suffix" : "US"
|
|
});
|
|
|
|
let refund_req = serde_json::json!({
|
|
"amount" : 1000,
|
|
"currency" : "USD",
|
|
"refund_id" : "refund_123",
|
|
"payment_id" : payment_id,
|
|
"merchant_id" : "jarnura",
|
|
});
|
|
|
|
let client = awc::Client::default();
|
|
|
|
let mut create_response = client
|
|
.post("http://127.0.0.1:8080/payments/create")
|
|
.insert_header(api_key)
|
|
.send_json(&request)
|
|
.await
|
|
.unwrap();
|
|
let create_response_body = create_response.body().await;
|
|
println!("{create_response:?} : {create_response_body:?}");
|
|
assert_eq!(create_response.status(), awc::http::StatusCode::OK);
|
|
|
|
let mut retrieve_response = client
|
|
.get("http://127.0.0.1:8080/payments/retrieve")
|
|
.insert_header(api_key)
|
|
.send_json(&request)
|
|
.await
|
|
.unwrap();
|
|
let retrieve_response_body = retrieve_response.body().await;
|
|
println!("{retrieve_response:?} =:= {retrieve_response_body:?}");
|
|
assert_eq!(retrieve_response.status(), awc::http::StatusCode::OK);
|
|
|
|
let mut refund_response = client
|
|
.post("http://127.0.0.1:8080/refunds/create")
|
|
.insert_header(api_key)
|
|
.send_json(&refund_req)
|
|
.await
|
|
.unwrap();
|
|
|
|
let refund_response_body = refund_response.body().await;
|
|
println!("{refund_response:?} =:= {refund_response_body:?}");
|
|
assert_eq!(refund_response.status(), awc::http::StatusCode::OK);
|
|
}
|
|
|
|
#[actix_web::test]
|
|
#[ignore]
|
|
// verify the API-KEY/merchant id has adyen as first choice
|
|
async fn payments_create_adyen() {
|
|
Box::pin(utils::setup()).await;
|
|
|
|
let payment_id = format!("test_{}", Uuid::new_v4());
|
|
let api_key = ("API-KEY", "321");
|
|
|
|
let request = serde_json::json!({
|
|
"payment_id" : payment_id,
|
|
"merchant_id" : "jarnura",
|
|
"amount" : 1000,
|
|
"currency" : "USD",
|
|
"amount_to_capture" : 1000,
|
|
"confirm" : true,
|
|
"customer" : "test_customer",
|
|
"customer_email" : "test@gmail.com",
|
|
"customer_name" : "Test",
|
|
"description" : "adyen",
|
|
"return_url" : "https://juspay.in/",
|
|
"payment_method_data" : {"card" : {"card_number":"5555 3412 4444 1115","card_exp_month":"03","card_exp_year":"2030","card_holder_name":"JohnDoe","card_cvc":"737"}},
|
|
"payment_method" : "card",
|
|
"statement_descriptor_name" : "Test Merchant",
|
|
"statement_descriptor_suffix" : "US"
|
|
});
|
|
|
|
let refund_req = serde_json::json!({
|
|
"amount" : 1000,
|
|
"currency" : "USD",
|
|
"refund_id" : "refund_123",
|
|
"payment_id" : payment_id,
|
|
"merchant_id" : "jarnura",
|
|
});
|
|
|
|
let client = awc::Client::default();
|
|
|
|
let mut create_response = client
|
|
.post("http://127.0.0.1:8080/payments/create")
|
|
.insert_header(api_key) //API Key must have adyen as first choice
|
|
.send_json(&request)
|
|
.await
|
|
.unwrap();
|
|
let create_response_body = create_response.body().await;
|
|
println!("{create_response:?} : {create_response_body:?}");
|
|
assert_eq!(create_response.status(), awc::http::StatusCode::OK);
|
|
|
|
let mut retrieve_response = client
|
|
.get("http://127.0.0.1:8080/payments/retrieve")
|
|
.insert_header(api_key)
|
|
.send_json(&request)
|
|
.await
|
|
.unwrap();
|
|
let retrieve_response_body = retrieve_response.body().await;
|
|
println!("{retrieve_response:?} =:= {retrieve_response_body:?}");
|
|
assert_eq!(retrieve_response.status(), awc::http::StatusCode::OK);
|
|
|
|
let mut refund_response = client
|
|
.post("http://127.0.0.1:8080/refunds/create")
|
|
.insert_header(api_key)
|
|
.send_json(&refund_req)
|
|
.await
|
|
.unwrap();
|
|
|
|
let refund_response_body = refund_response.body().await;
|
|
println!("{refund_response:?} =:= {refund_response_body:?}");
|
|
assert_eq!(refund_response.status(), awc::http::StatusCode::OK);
|
|
}
|
|
|
|
#[actix_web::test]
|
|
// verify the API-KEY/merchant id has stripe as first choice
|
|
#[ignore]
|
|
async fn payments_create_fail() {
|
|
Box::pin(utils::setup()).await;
|
|
|
|
let payment_id = format!("test_{}", Uuid::new_v4());
|
|
let api_key = ("API-KEY", "MySecretApiKey");
|
|
|
|
let invalid_request = serde_json::json!({
|
|
"description" : "stripe",
|
|
});
|
|
|
|
let request = serde_json::json!({
|
|
"payment_id" : payment_id,
|
|
"merchant_id" : "jarnura",
|
|
"amount" : 1000,
|
|
"currency" : "USD",
|
|
"amount_to_capture" : 1000,
|
|
"confirm" : true,
|
|
"customer" : "test_customer",
|
|
"customer_email" : "test@gmail.com",
|
|
"customer_name" : "Test",
|
|
"description" : "adyen",
|
|
"return_url" : "https://juspay.in/",
|
|
"payment_method_data" : {"card" : {"card_number":"5555 3412 4444 1115","card_exp_month":"03","card_exp_year":"2030","card_holder_name":"JohnDoe","card_cvc":"737"}},
|
|
"payment_method" : "card",
|
|
"statement_descriptor_name" : "Test Merchant",
|
|
"statement_descriptor_suffix" : "US"
|
|
});
|
|
|
|
let client = awc::Client::default();
|
|
|
|
let mut invalid_response = client
|
|
.post("http://127.0.0.1:8080/payments/create")
|
|
.insert_header(api_key)
|
|
.send_json(&invalid_request)
|
|
.await
|
|
.unwrap();
|
|
let invalid_response_body = invalid_response.body().await;
|
|
println!("{invalid_response:?} : {invalid_response_body:?}");
|
|
assert_eq!(
|
|
invalid_response.status(),
|
|
awc::http::StatusCode::BAD_REQUEST
|
|
);
|
|
|
|
let mut api_key_response = client
|
|
.get("http://127.0.0.1:8080/payments/retrieve")
|
|
// .insert_header(api_key)
|
|
.send_json(&request)
|
|
.await
|
|
.unwrap();
|
|
let api_key_response_body = api_key_response.body().await;
|
|
println!("{api_key_response:?} =:= {api_key_response_body:?}");
|
|
assert_eq!(
|
|
api_key_response.status(),
|
|
awc::http::StatusCode::UNAUTHORIZED
|
|
);
|
|
}
|
|
|
|
#[actix_web::test]
|
|
#[ignore]
|
|
async fn payments_todo() {
|
|
Box::pin(utils::setup()).await;
|
|
|
|
let client = awc::Client::default();
|
|
let mut response;
|
|
let mut response_body;
|
|
let _post_endpoints = ["123/update", "123/confirm", "cancel"];
|
|
let get_endpoints = vec!["list"];
|
|
|
|
for endpoint in get_endpoints {
|
|
response = client
|
|
.get(format!("http://127.0.0.1:8080/payments/{endpoint}"))
|
|
.insert_header(("API-KEY", "MySecretApiKey"))
|
|
.send()
|
|
.await
|
|
.unwrap();
|
|
response_body = response.body().await;
|
|
println!("{endpoint} =:= {response:?} : {response_body:?}");
|
|
assert_eq!(response.status(), awc::http::StatusCode::OK);
|
|
}
|
|
|
|
// for endpoint in post_endpoints {
|
|
// response = client
|
|
// .post(format!("http://127.0.0.1:8080/payments/{}", endpoint))
|
|
// .send()
|
|
// .await
|
|
// .unwrap();
|
|
// response_body = response.body().await;
|
|
// println!("{} =:= {:?} : {:?}", endpoint, response, response_body);
|
|
// assert_eq!(response.status(), awc::http::StatusCode::OK);
|
|
// }
|
|
}
|
|
|
|
#[test]
|
|
fn connector_list() {
|
|
let connector_list = types::ConnectorsList {
|
|
connectors: vec![String::from("stripe"), "adyen".to_string()],
|
|
};
|
|
|
|
let json = serde_json::to_string(&connector_list).unwrap();
|
|
|
|
println!("{}", &json);
|
|
|
|
let newlist: types::ConnectorsList = serde_json::from_str(&json).unwrap();
|
|
|
|
println!("{newlist:#?}");
|
|
assert_eq!(true, true);
|
|
}
|
|
|
|
#[cfg(feature = "v1")]
|
|
#[actix_rt::test]
|
|
#[ignore] // AWS
|
|
async fn payments_create_core() {
|
|
use configs::settings::Settings;
|
|
use hyperswitch_domain_models::merchant_context::{Context, MerchantContext};
|
|
let conf = Settings::new().expect("invalid settings");
|
|
let tx: oneshot::Sender<()> = oneshot::channel().0;
|
|
let app_state = Box::pin(routes::AppState::with_storage(
|
|
conf,
|
|
StorageImpl::PostgresqlTest,
|
|
tx,
|
|
Box::new(services::MockApiClient),
|
|
))
|
|
.await;
|
|
|
|
let merchant_id = id_type::MerchantId::try_from(Cow::from("juspay_merchant")).unwrap();
|
|
|
|
let state = Arc::new(app_state)
|
|
.get_session_state(
|
|
&id_type::TenantId::try_from_string("public".to_string()).unwrap(),
|
|
None,
|
|
|| {},
|
|
)
|
|
.unwrap();
|
|
let key_manager_state = &(&state).into();
|
|
let key_store = state
|
|
.store
|
|
.get_merchant_key_store_by_merchant_id(
|
|
key_manager_state,
|
|
&merchant_id,
|
|
&state.store.get_master_key().to_vec().into(),
|
|
)
|
|
.await
|
|
.unwrap();
|
|
|
|
let merchant_account = state
|
|
.store
|
|
.find_merchant_account_by_merchant_id(key_manager_state, &merchant_id, &key_store)
|
|
.await
|
|
.unwrap();
|
|
|
|
let merchant_context = MerchantContext::NormalMerchant(Box::new(Context(
|
|
merchant_account.clone(),
|
|
key_store.clone(),
|
|
)));
|
|
let payment_id =
|
|
id_type::PaymentId::try_from(Cow::Borrowed("pay_mbabizu24mvu3mela5njyhpit10")).unwrap();
|
|
|
|
let req = api::PaymentsRequest {
|
|
payment_id: Some(api::PaymentIdType::PaymentIntentId(payment_id.clone())),
|
|
merchant_id: Some(merchant_id.clone()),
|
|
amount: Some(MinorUnit::new(6540).into()),
|
|
currency: Some(api_enums::Currency::USD),
|
|
capture_method: Some(api_enums::CaptureMethod::Automatic),
|
|
amount_to_capture: Some(MinorUnit::new(6540)),
|
|
capture_on: Some(datetime!(2022-09-10 11:12)),
|
|
confirm: Some(true),
|
|
customer_id: None,
|
|
email: None,
|
|
name: None,
|
|
description: Some("Its my first payment request".to_string()),
|
|
return_url: Some(url::Url::parse("http://example.com/payments").unwrap()),
|
|
setup_future_usage: Some(api_enums::FutureUsage::OnSession),
|
|
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
|
payment_method_data: Some(api::PaymentMethodDataRequest {
|
|
payment_method_data: Some(api::PaymentMethodData::Card(api::Card {
|
|
card_number: "4242424242424242".to_string().try_into().unwrap(),
|
|
card_exp_month: "10".to_string().into(),
|
|
card_exp_year: "35".to_string().into(),
|
|
card_holder_name: Some(masking::Secret::new("Arun Raj".to_string())),
|
|
card_cvc: "123".to_string().into(),
|
|
card_issuer: None,
|
|
card_network: None,
|
|
card_type: None,
|
|
card_issuing_country: None,
|
|
bank_code: None,
|
|
nick_name: Some(masking::Secret::new("nick_name".into())),
|
|
})),
|
|
billing: None,
|
|
}),
|
|
payment_method: Some(api_enums::PaymentMethod::Card),
|
|
shipping: Some(api::Address {
|
|
address: None,
|
|
phone: None,
|
|
email: None,
|
|
}),
|
|
billing: Some(api::Address {
|
|
address: None,
|
|
phone: None,
|
|
email: None,
|
|
}),
|
|
statement_descriptor_name: Some("Hyperswtich".to_string()),
|
|
statement_descriptor_suffix: Some("Hyperswitch".to_string()),
|
|
..Default::default()
|
|
};
|
|
|
|
let expected_response = api::PaymentsResponse {
|
|
payment_id,
|
|
status: api_enums::IntentStatus::Succeeded,
|
|
amount: MinorUnit::new(6540),
|
|
amount_capturable: MinorUnit::new(0),
|
|
amount_received: None,
|
|
client_secret: None,
|
|
created: None,
|
|
currency: "USD".to_string(),
|
|
customer_id: None,
|
|
description: Some("Its my first payment request".to_string()),
|
|
refunds: None,
|
|
mandate_id: None,
|
|
merchant_id,
|
|
net_amount: MinorUnit::new(6540),
|
|
connector: None,
|
|
customer: None,
|
|
disputes: None,
|
|
attempts: None,
|
|
captures: None,
|
|
mandate_data: None,
|
|
setup_future_usage: None,
|
|
off_session: None,
|
|
capture_on: None,
|
|
capture_method: None,
|
|
payment_method: None,
|
|
payment_method_data: None,
|
|
payment_token: None,
|
|
shipping: None,
|
|
billing: None,
|
|
order_details: None,
|
|
email: None,
|
|
name: None,
|
|
phone: None,
|
|
return_url: None,
|
|
authentication_type: None,
|
|
statement_descriptor_name: None,
|
|
statement_descriptor_suffix: None,
|
|
next_action: None,
|
|
cancellation_reason: None,
|
|
error_code: None,
|
|
error_message: None,
|
|
unified_code: None,
|
|
unified_message: None,
|
|
payment_experience: None,
|
|
payment_method_type: None,
|
|
connector_label: None,
|
|
business_country: None,
|
|
business_label: None,
|
|
business_sub_label: None,
|
|
allowed_payment_method_types: None,
|
|
ephemeral_key: None,
|
|
manual_retry_allowed: None,
|
|
connector_transaction_id: None,
|
|
frm_message: None,
|
|
metadata: None,
|
|
connector_metadata: None,
|
|
feature_metadata: None,
|
|
reference_id: None,
|
|
payment_link: None,
|
|
profile_id: None,
|
|
surcharge_details: None,
|
|
attempt_count: 1,
|
|
merchant_decision: None,
|
|
merchant_connector_id: None,
|
|
incremental_authorization_allowed: None,
|
|
authorization_count: None,
|
|
incremental_authorizations: None,
|
|
external_authentication_details: None,
|
|
external_3ds_authentication_attempted: None,
|
|
expires_on: None,
|
|
fingerprint: None,
|
|
mit_category: None,
|
|
browser_info: None,
|
|
payment_method_id: None,
|
|
payment_method_status: None,
|
|
updated: None,
|
|
split_payments: None,
|
|
frm_metadata: None,
|
|
merchant_order_reference_id: None,
|
|
capture_before: None,
|
|
extended_authorization_applied: None,
|
|
order_tax_amount: None,
|
|
connector_mandate_id: None,
|
|
shipping_cost: None,
|
|
card_discovery: None,
|
|
force_3ds_challenge: None,
|
|
force_3ds_challenge_trigger: None,
|
|
issuer_error_code: None,
|
|
issuer_error_message: None,
|
|
is_iframe_redirection_enabled: None,
|
|
whole_connector_response: None,
|
|
payment_channel: None,
|
|
network_transaction_id: None,
|
|
enable_partial_authorization: None,
|
|
is_overcapture_enabled: None,
|
|
enable_overcapture: None,
|
|
network_details: None,
|
|
is_stored_credential: None,
|
|
request_extended_authorization: None,
|
|
};
|
|
let expected_response =
|
|
services::ApplicationResponse::JsonWithHeaders((expected_response, vec![]));
|
|
let actual_response = Box::pin(payments::payments_core::<
|
|
api::Authorize,
|
|
api::PaymentsResponse,
|
|
_,
|
|
_,
|
|
_,
|
|
payments::PaymentData<api::Authorize>,
|
|
>(
|
|
state.clone(),
|
|
state.get_req_state(),
|
|
merchant_context,
|
|
None,
|
|
payments::PaymentCreate,
|
|
req,
|
|
services::AuthFlow::Merchant,
|
|
payments::CallConnectorAction::Trigger,
|
|
None,
|
|
hyperswitch_domain_models::payments::HeaderPayload::default(),
|
|
))
|
|
.await
|
|
.unwrap();
|
|
assert_eq!(expected_response, actual_response);
|
|
}
|
|
|
|
// #[actix_rt::test]
|
|
// async fn payments_start_core_stripe_redirect() {
|
|
// use configs::settings::Settings;
|
|
// let conf = Settings::new().expect("invalid settings");
|
|
|
|
// let state = routes::AppState {
|
|
// flow_name: String::from("default"),
|
|
// pg_conn: connection::pg_connection_read(&conf),
|
|
// redis_conn: connection::redis_connection(&conf).await,
|
|
// };
|
|
|
|
// let customer_id = format!("cust_{}", Uuid::new_v4());
|
|
// let merchant_id = "jarnura".to_string();
|
|
// let payment_id = "pay_mbabizu24mvu3mela5njyhpit10".to_string();
|
|
// let customer_data = api::CreateCustomerRequest {
|
|
// customer_id: customer_id.clone(),
|
|
// merchant_id: merchant_id.clone(),
|
|
// ..api::CreateCustomerRequest::default()
|
|
// };
|
|
|
|
// let _customer = customer_data.insert(&state.pg_conn).unwrap();
|
|
|
|
// let merchant_account = services::authenticate(&state, "MySecretApiKey").unwrap();
|
|
// let payment_attempt = storage::PaymentAttempt::find_by_payment_id_merchant_id(
|
|
// &state.pg_conn,
|
|
// &payment_id,
|
|
// &merchant_id,
|
|
// )
|
|
// .unwrap();
|
|
// let payment_intent = storage::PaymentIntent::find_by_payment_id_merchant_id(
|
|
// &state.pg_conn,
|
|
// &payment_id,
|
|
// &merchant_id,
|
|
// )
|
|
// .unwrap();
|
|
// let payment_intent_update = storage::PaymentIntentUpdate::ReturnUrlUpdate {
|
|
// return_url: "http://example.com/payments".to_string(),
|
|
// status: None,
|
|
// };
|
|
// payment_intent
|
|
// .update(&state.pg_conn, payment_intent_update)
|
|
// .unwrap();
|
|
|
|
// let expected_response = services::ApplicationResponse::Form(services::RedirectForm {
|
|
// url: "http://example.com/payments".to_string(),
|
|
// method: services::Method::Post,
|
|
// form_fields: HashMap::from([("payment_id".to_string(), payment_id.clone())]),
|
|
// });
|
|
// let actual_response = payments_start_core(
|
|
// &state,
|
|
// merchant_account,
|
|
// api::PaymentsStartRequest {
|
|
// payment_id,
|
|
// merchant_id,
|
|
// txn_id: payment_attempt.txn_id.to_owned(),
|
|
// },
|
|
// )
|
|
// .await
|
|
// .unwrap();
|
|
// assert_eq!(expected_response, actual_response);
|
|
// }
|
|
|
|
#[cfg(feature = "v1")]
|
|
#[actix_rt::test]
|
|
#[ignore]
|
|
async fn payments_create_core_adyen_no_redirect() {
|
|
use hyperswitch_domain_models::merchant_context::{Context, MerchantContext};
|
|
|
|
use crate::configs::settings::Settings;
|
|
let conf = Settings::new().expect("invalid settings");
|
|
let tx: oneshot::Sender<()> = oneshot::channel().0;
|
|
let app_state = Box::pin(routes::AppState::with_storage(
|
|
conf,
|
|
StorageImpl::PostgresqlTest,
|
|
tx,
|
|
Box::new(services::MockApiClient),
|
|
))
|
|
.await;
|
|
let state = Arc::new(app_state)
|
|
.get_session_state(
|
|
&id_type::TenantId::try_from_string("public".to_string()).unwrap(),
|
|
None,
|
|
|| {},
|
|
)
|
|
.unwrap();
|
|
|
|
let payment_id =
|
|
id_type::PaymentId::try_from(Cow::Borrowed("pay_mbabizu24mvu3mela5njyhpit10")).unwrap();
|
|
|
|
let customer_id = format!("cust_{}", Uuid::new_v4());
|
|
let merchant_id = id_type::MerchantId::try_from(Cow::from("juspay_merchant")).unwrap();
|
|
let key_manager_state = &(&state).into();
|
|
let key_store = state
|
|
.store
|
|
.get_merchant_key_store_by_merchant_id(
|
|
key_manager_state,
|
|
&merchant_id,
|
|
&state.store.get_master_key().to_vec().into(),
|
|
)
|
|
.await
|
|
.unwrap();
|
|
|
|
let merchant_account = state
|
|
.store
|
|
.find_merchant_account_by_merchant_id(key_manager_state, &merchant_id, &key_store)
|
|
.await
|
|
.unwrap();
|
|
|
|
let merchant_context = MerchantContext::NormalMerchant(Box::new(Context(
|
|
merchant_account.clone(),
|
|
key_store.clone(),
|
|
)));
|
|
|
|
let req = api::PaymentsRequest {
|
|
payment_id: Some(api::PaymentIdType::PaymentIntentId(payment_id.clone())),
|
|
merchant_id: Some(merchant_id.clone()),
|
|
amount: Some(MinorUnit::new(6540).into()),
|
|
currency: Some(api_enums::Currency::USD),
|
|
capture_method: Some(api_enums::CaptureMethod::Automatic),
|
|
amount_to_capture: Some(MinorUnit::new(6540)),
|
|
capture_on: Some(datetime!(2022-09-10 10:11:12)),
|
|
confirm: Some(true),
|
|
customer_id: Some(id_type::CustomerId::try_from(Cow::from(customer_id)).unwrap()),
|
|
description: Some("Its my first payment request".to_string()),
|
|
return_url: Some(url::Url::parse("http://example.com/payments").unwrap()),
|
|
setup_future_usage: Some(api_enums::FutureUsage::OnSession),
|
|
authentication_type: Some(api_enums::AuthenticationType::NoThreeDs),
|
|
payment_method_data: Some(api::PaymentMethodDataRequest {
|
|
payment_method_data: Some(api::PaymentMethodData::Card(api::Card {
|
|
card_number: "5555 3412 4444 1115".to_string().try_into().unwrap(),
|
|
card_exp_month: "03".to_string().into(),
|
|
card_exp_year: "2030".to_string().into(),
|
|
card_holder_name: Some(masking::Secret::new("JohnDoe".to_string())),
|
|
card_cvc: "737".to_string().into(),
|
|
card_issuer: None,
|
|
card_network: None,
|
|
card_type: None,
|
|
card_issuing_country: None,
|
|
bank_code: None,
|
|
nick_name: Some(masking::Secret::new("nick_name".into())),
|
|
})),
|
|
billing: None,
|
|
}),
|
|
payment_method: Some(api_enums::PaymentMethod::Card),
|
|
shipping: Some(api::Address {
|
|
address: None,
|
|
phone: None,
|
|
email: None,
|
|
}),
|
|
billing: Some(api::Address {
|
|
address: None,
|
|
phone: None,
|
|
email: None,
|
|
}),
|
|
statement_descriptor_name: Some("Juspay".to_string()),
|
|
statement_descriptor_suffix: Some("Router".to_string()),
|
|
..Default::default()
|
|
};
|
|
|
|
let expected_response = services::ApplicationResponse::JsonWithHeaders((
|
|
api::PaymentsResponse {
|
|
payment_id: payment_id.clone(),
|
|
status: api_enums::IntentStatus::Processing,
|
|
amount: MinorUnit::new(6540),
|
|
amount_capturable: MinorUnit::new(0),
|
|
amount_received: None,
|
|
client_secret: None,
|
|
created: None,
|
|
currency: "USD".to_string(),
|
|
customer_id: None,
|
|
description: Some("Its my first payment request".to_string()),
|
|
refunds: None,
|
|
mandate_id: None,
|
|
merchant_id,
|
|
net_amount: MinorUnit::new(6540),
|
|
connector: None,
|
|
customer: None,
|
|
disputes: None,
|
|
attempts: None,
|
|
captures: None,
|
|
mandate_data: None,
|
|
setup_future_usage: None,
|
|
off_session: None,
|
|
capture_on: None,
|
|
capture_method: None,
|
|
payment_method: None,
|
|
payment_method_data: None,
|
|
payment_token: None,
|
|
shipping: None,
|
|
billing: None,
|
|
order_details: None,
|
|
email: None,
|
|
name: None,
|
|
phone: None,
|
|
return_url: None,
|
|
authentication_type: None,
|
|
statement_descriptor_name: None,
|
|
statement_descriptor_suffix: None,
|
|
next_action: None,
|
|
cancellation_reason: None,
|
|
error_code: None,
|
|
error_message: None,
|
|
unified_code: None,
|
|
unified_message: None,
|
|
payment_experience: None,
|
|
payment_method_type: None,
|
|
connector_label: None,
|
|
business_country: None,
|
|
business_label: None,
|
|
business_sub_label: None,
|
|
allowed_payment_method_types: None,
|
|
ephemeral_key: None,
|
|
manual_retry_allowed: None,
|
|
connector_transaction_id: None,
|
|
frm_message: None,
|
|
metadata: None,
|
|
connector_metadata: None,
|
|
feature_metadata: None,
|
|
reference_id: None,
|
|
payment_link: None,
|
|
profile_id: None,
|
|
surcharge_details: None,
|
|
attempt_count: 1,
|
|
merchant_decision: None,
|
|
merchant_connector_id: None,
|
|
incremental_authorization_allowed: None,
|
|
authorization_count: None,
|
|
incremental_authorizations: None,
|
|
external_authentication_details: None,
|
|
external_3ds_authentication_attempted: None,
|
|
expires_on: None,
|
|
fingerprint: None,
|
|
browser_info: None,
|
|
mit_category: None,
|
|
payment_method_id: None,
|
|
payment_method_status: None,
|
|
updated: None,
|
|
split_payments: None,
|
|
frm_metadata: None,
|
|
merchant_order_reference_id: None,
|
|
capture_before: None,
|
|
extended_authorization_applied: None,
|
|
order_tax_amount: None,
|
|
connector_mandate_id: None,
|
|
shipping_cost: None,
|
|
card_discovery: None,
|
|
force_3ds_challenge: None,
|
|
force_3ds_challenge_trigger: None,
|
|
issuer_error_code: None,
|
|
issuer_error_message: None,
|
|
is_iframe_redirection_enabled: None,
|
|
whole_connector_response: None,
|
|
payment_channel: None,
|
|
network_transaction_id: None,
|
|
enable_partial_authorization: None,
|
|
is_overcapture_enabled: None,
|
|
enable_overcapture: None,
|
|
network_details: None,
|
|
is_stored_credential: None,
|
|
request_extended_authorization: None,
|
|
},
|
|
vec![],
|
|
));
|
|
let actual_response = Box::pin(payments::payments_core::<
|
|
api::Authorize,
|
|
api::PaymentsResponse,
|
|
_,
|
|
_,
|
|
_,
|
|
payments::PaymentData<api::Authorize>,
|
|
>(
|
|
state.clone(),
|
|
state.get_req_state(),
|
|
merchant_context,
|
|
None,
|
|
payments::PaymentCreate,
|
|
req,
|
|
services::AuthFlow::Merchant,
|
|
payments::CallConnectorAction::Trigger,
|
|
None,
|
|
hyperswitch_domain_models::payments::HeaderPayload::default(),
|
|
))
|
|
.await
|
|
.unwrap();
|
|
assert_eq!(expected_response, actual_response);
|
|
}
|