mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-31 01:57:45 +08:00
fix: mandate_type change & unittests (#132)
This commit is contained in:
@ -95,7 +95,11 @@ impl<'de> serde::Deserialize<'de> for ListPaymentMethodRequest {
|
|||||||
while let Some(key) = map.next_key()? {
|
while let Some(key) = map.next_key()? {
|
||||||
match key {
|
match key {
|
||||||
"client_secret" => {
|
"client_secret" => {
|
||||||
output.client_secret = Some(map.next_value()?);
|
set_or_reject_duplicate(
|
||||||
|
&mut output.client_secret,
|
||||||
|
"client_secret",
|
||||||
|
map.next_value()?,
|
||||||
|
)?;
|
||||||
}
|
}
|
||||||
"accepted_countries" => match output.accepted_countries.as_mut() {
|
"accepted_countries" => match output.accepted_countries.as_mut() {
|
||||||
Some(inner) => inner.push(map.next_value()?),
|
Some(inner) => inner.push(map.next_value()?),
|
||||||
@ -110,13 +114,25 @@ impl<'de> serde::Deserialize<'de> for ListPaymentMethodRequest {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"amount" => {
|
"amount" => {
|
||||||
output.amount = Some(map.next_value()?);
|
set_or_reject_duplicate(
|
||||||
|
&mut output.amount,
|
||||||
|
"amount",
|
||||||
|
map.next_value()?,
|
||||||
|
)?;
|
||||||
}
|
}
|
||||||
"recurring_enabled" => {
|
"recurring_enabled" => {
|
||||||
output.recurring_enabled = Some(map.next_value()?);
|
set_or_reject_duplicate(
|
||||||
|
&mut output.recurring_enabled,
|
||||||
|
"recurring_enabled",
|
||||||
|
map.next_value()?,
|
||||||
|
)?;
|
||||||
}
|
}
|
||||||
"installment_payment_enabled" => {
|
"installment_payment_enabled" => {
|
||||||
output.installment_payment_enabled = Some(map.next_value()?);
|
set_or_reject_duplicate(
|
||||||
|
&mut output.installment_payment_enabled,
|
||||||
|
"installment_payment_enabled",
|
||||||
|
map.next_value()?,
|
||||||
|
)?;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
@ -130,6 +146,21 @@ impl<'de> serde::Deserialize<'de> for ListPaymentMethodRequest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try to set the provided value to the data otherwise throw an error
|
||||||
|
fn set_or_reject_duplicate<T, E: de::Error>(
|
||||||
|
data: &mut Option<T>,
|
||||||
|
name: &'static str,
|
||||||
|
value: T,
|
||||||
|
) -> Result<(), E> {
|
||||||
|
match data {
|
||||||
|
Some(_inner) => Err(de::Error::duplicate_field(name)),
|
||||||
|
None => {
|
||||||
|
*data = Some(value);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
||||||
pub struct ListPaymentMethodResponse {
|
pub struct ListPaymentMethodResponse {
|
||||||
pub payment_method: api_enums::PaymentMethodType,
|
pub payment_method: api_enums::PaymentMethodType,
|
||||||
|
|||||||
@ -149,6 +149,7 @@ pub struct MandateAmountData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Eq, PartialEq, Debug, serde::Deserialize, serde::Serialize, Clone)]
|
#[derive(Eq, PartialEq, Debug, serde::Deserialize, serde::Serialize, Clone)]
|
||||||
|
#[serde(rename_all = "snake_case")]
|
||||||
pub enum MandateType {
|
pub enum MandateType {
|
||||||
SingleUse(MandateAmountData),
|
SingleUse(MandateAmountData),
|
||||||
MultiUse(Option<MandateAmountData>),
|
MultiUse(Option<MandateAmountData>),
|
||||||
@ -838,3 +839,17 @@ mod amount {
|
|||||||
deserializer.deserialize_option(OptionalAmountVisitor)
|
deserializer.deserialize_option(OptionalAmountVisitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_mandate_type() {
|
||||||
|
let mandate_type = MandateType::default();
|
||||||
|
assert_eq!(
|
||||||
|
serde_json::to_string(&mandate_type).unwrap(),
|
||||||
|
r#"{"multi_use":null}"#
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -142,3 +142,30 @@ pub async fn payment_method_delete_api(
|
|||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use api_models::payment_methods::ListPaymentMethodRequest;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_custom_list_deserialization() {
|
||||||
|
let dummy_data = "amount=120&recurring_enabled=true&installment_payment_enabled=true&accepted_countries=US&accepted_countries=IN";
|
||||||
|
let de_query: web::Query<payment_methods::ListPaymentMethodRequest> =
|
||||||
|
web::Query::from_query(dummy_data).unwrap();
|
||||||
|
let de_struct = de_query.into_inner();
|
||||||
|
assert_eq!(
|
||||||
|
de_struct.accepted_countries,
|
||||||
|
Some(vec!["US".to_string(), "IN".to_string()])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_custom_list_deserialization_multi_amount() {
|
||||||
|
let dummy_data = "amount=120&recurring_enabled=true&amount=1000";
|
||||||
|
let de_query: Result<web::Query<ListPaymentMethodRequest>, _> =
|
||||||
|
web::Query::from_query(dummy_data);
|
||||||
|
assert!(de_query.is_err())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user