fix: mandate_type change & unittests (#132)

This commit is contained in:
Nishant Joshi
2022-12-13 16:56:58 +05:30
committed by GitHub
parent 97ccfd33b7
commit 529c28feea
3 changed files with 77 additions and 4 deletions

View File

@ -95,7 +95,11 @@ impl<'de> serde::Deserialize<'de> for ListPaymentMethodRequest {
while let Some(key) = map.next_key()? {
match key {
"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() {
Some(inner) => inner.push(map.next_value()?),
@ -110,13 +114,25 @@ impl<'de> serde::Deserialize<'de> for ListPaymentMethodRequest {
}
},
"amount" => {
output.amount = Some(map.next_value()?);
set_or_reject_duplicate(
&mut output.amount,
"amount",
map.next_value()?,
)?;
}
"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" => {
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)]
pub struct ListPaymentMethodResponse {
pub payment_method: api_enums::PaymentMethodType,

View File

@ -149,6 +149,7 @@ pub struct MandateAmountData {
}
#[derive(Eq, PartialEq, Debug, serde::Deserialize, serde::Serialize, Clone)]
#[serde(rename_all = "snake_case")]
pub enum MandateType {
SingleUse(MandateAmountData),
MultiUse(Option<MandateAmountData>),
@ -838,3 +839,17 @@ mod amount {
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}"#
)
}
}

View File

@ -142,3 +142,30 @@ pub async fn payment_method_delete_api(
)
.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())
}
}