mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-29 00:49:42 +08:00 
			
		
		
		
	 15d6c3e846
			
		
	
	15d6c3e846
	
	
	
		
			
			Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> Co-authored-by: Arun Raj M <jarnura47@gmail.com>
		
			
				
	
	
		
			349 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![allow(clippy::expect_used, clippy::unwrap_in_result, clippy::unwrap_used)]
 | |
| 
 | |
| mod utils;
 | |
| 
 | |
| use std::sync::Arc;
 | |
| 
 | |
| use common_utils::{id_type, types::MinorUnit};
 | |
| use router::{
 | |
|     core::payments,
 | |
|     db::StorageImpl,
 | |
|     types::api::{self, enums as api_enums},
 | |
|     *,
 | |
| };
 | |
| use time::macros::datetime;
 | |
| use tokio::sync::oneshot;
 | |
| use uuid::Uuid;
 | |
| 
 | |
| #[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);
 | |
| }
 | |
| 
 | |
| // FIXME: broken test?
 | |
| #[ignore]
 | |
| #[actix_rt::test]
 | |
| async fn payments_create_core() {
 | |
|     use router::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("public", || {})
 | |
|         .unwrap();
 | |
| 
 | |
|     let key_store = state
 | |
|         .store
 | |
|         .get_merchant_key_store_by_merchant_id(
 | |
|             "juspay_merchant",
 | |
|             &state.store.get_master_key().to_vec().into(),
 | |
|         )
 | |
|         .await
 | |
|         .unwrap();
 | |
| 
 | |
|     let merchant_account = state
 | |
|         .store
 | |
|         .find_merchant_account_by_merchant_id("juspay_merchant", &key_store)
 | |
|         .await
 | |
|         .unwrap();
 | |
| 
 | |
|     let req = api::PaymentsRequest {
 | |
|         payment_id: Some(api::PaymentIdType::PaymentIntentId(
 | |
|             "pay_mbabizu24mvu3mela5njyhpit10".to_string(),
 | |
|         )),
 | |
|         merchant_id: Some("jarnura".to_string()),
 | |
|         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: 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: None,
 | |
|         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("Hyperswitch".to_string()),
 | |
|         statement_descriptor_suffix: Some("Hyperswitch".to_string()),
 | |
|         ..<_>::default()
 | |
|     };
 | |
| 
 | |
|     let expected_response = api::PaymentsResponse {
 | |
|         payment_id: Some("pay_mbabizu24mvu3mela5njyhpit10".to_string()),
 | |
|         status: api_enums::IntentStatus::Succeeded,
 | |
|         amount: MinorUnit::new(6540),
 | |
|         amount_capturable: None,
 | |
|         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,
 | |
|         ..Default::default()
 | |
|     };
 | |
|     let expected_response =
 | |
|         services::ApplicationResponse::JsonWithHeaders((expected_response, vec![]));
 | |
|     let actual_response = Box::pin(payments::payments_core::<
 | |
|         api::Authorize,
 | |
|         api::PaymentsResponse,
 | |
|         _,
 | |
|         _,
 | |
|         _,
 | |
|     >(
 | |
|         state.clone(),
 | |
|         state.get_req_state(),
 | |
|         merchant_account,
 | |
|         key_store,
 | |
|         payments::PaymentCreate,
 | |
|         req,
 | |
|         services::AuthFlow::Merchant,
 | |
|         payments::CallConnectorAction::Trigger,
 | |
|         None,
 | |
|         api::HeaderPayload::default(),
 | |
|     ))
 | |
|     .await
 | |
|     .unwrap();
 | |
|     assert_eq!(expected_response, actual_response);
 | |
| }
 | |
| 
 | |
| // FIXME: broken test? It looks like we haven't updated the test after removing the `core::payments::payments_start_core` method from the codebase.
 | |
| // #[ignore]
 | |
| // #[actix_rt::test]
 | |
| // async fn payments_start_core_stripe_redirect() {
 | |
| //     use router::configs::settings::Settings;
 | |
| //     let conf = Settings::new().expect("invalid settings");
 | |
| //
 | |
| //     let state = routes::AppState {
 | |
| //         flow_name: String::from("default"),
 | |
| //         pg_pool: connection::make_pg_pool(&conf).await,
 | |
| //         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.store).await.unwrap();
 | |
| //
 | |
| //     let merchant_account = services::authenticate(&state, "123").await.unwrap();
 | |
| //     let payment_attempt = storage::PaymentAttempt::find_by_payment_id_merchant_id(
 | |
| //         &*state.store,
 | |
| //         &payment_id,
 | |
| //         &merchant_id,
 | |
| //     )
 | |
| //     .await
 | |
| //     .unwrap();
 | |
| //     let payment_intent = storage::PaymentIntent::find_by_payment_id_merchant_id(
 | |
| //         &*state.store,
 | |
| //         &payment_id,
 | |
| //         &merchant_id,
 | |
| //     )
 | |
| //     .await
 | |
| //     .unwrap();
 | |
| //     let payment_intent_update = storage::PaymentIntentUpdate::ReturnUrlUpdate {
 | |
| //         return_url: "http://example.com/payments".to_string(),
 | |
| //         status: None,
 | |
| //     };
 | |
| //     payment_intent
 | |
| //         .update(&*state.store, payment_intent_update)
 | |
| //         .await
 | |
| //         .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);
 | |
| // }
 | |
| 
 | |
| // FIXME: broken test?
 | |
| #[ignore]
 | |
| #[actix_rt::test]
 | |
| async fn payments_create_core_adyen_no_redirect() {
 | |
|     use router::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("public", || {})
 | |
|         .unwrap();
 | |
| 
 | |
|     let customer_id = format!("cust_{}", Uuid::new_v4());
 | |
|     let merchant_id = "arunraj".to_string();
 | |
|     let payment_id = "pay_mbabizu24mvu3mela5njyhpit10".to_string();
 | |
| 
 | |
|     let key_store = state
 | |
|         .store
 | |
|         .get_merchant_key_store_by_merchant_id(
 | |
|             "juspay_merchant",
 | |
|             &state.store.get_master_key().to_vec().into(),
 | |
|         )
 | |
|         .await
 | |
|         .unwrap();
 | |
| 
 | |
|     let merchant_account = state
 | |
|         .store
 | |
|         .find_merchant_account_by_merchant_id("juspay_merchant", &key_store)
 | |
|         .await
 | |
|         .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 10:11:12)),
 | |
|         confirm: Some(true),
 | |
|         customer_id: Some(id_type::CustomerId::from(customer_id.into()).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::OffSession),
 | |
|         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(),
 | |
|                 bank_code: None,
 | |
|                 card_issuer: None,
 | |
|                 card_network: None,
 | |
|                 card_type: None,
 | |
|                 card_issuing_country: 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: Some(payment_id.clone()),
 | |
|             status: api_enums::IntentStatus::Processing,
 | |
|             amount: MinorUnit::new(6540),
 | |
|             amount_capturable: None,
 | |
|             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,
 | |
|             ..Default::default()
 | |
|         },
 | |
|         vec![],
 | |
|     ));
 | |
|     let actual_response = Box::pin(payments::payments_core::<
 | |
|         api::Authorize,
 | |
|         api::PaymentsResponse,
 | |
|         _,
 | |
|         _,
 | |
|         _,
 | |
|     >(
 | |
|         state.clone(),
 | |
|         state.get_req_state(),
 | |
|         merchant_account,
 | |
|         key_store,
 | |
|         payments::PaymentCreate,
 | |
|         req,
 | |
|         services::AuthFlow::Merchant,
 | |
|         payments::CallConnectorAction::Trigger,
 | |
|         None,
 | |
|         api::HeaderPayload::default(),
 | |
|     ))
 | |
|     .await
 | |
|     .unwrap();
 | |
|     assert_eq!(expected_response, actual_response);
 | |
| }
 |