refactor: use strum::EnumString implementation for connector name conversions (#1052)

Co-authored-by: Sanchith Hegde <22217505+SanchithHegde@users.noreply.github.com>
This commit is contained in:
Nachiket Kanore
2023-05-19 18:07:48 +05:30
committed by GitHub
parent cf000599dd
commit 2809425154
5 changed files with 93 additions and 53 deletions

View File

@ -569,7 +569,6 @@ pub enum MandateStatus {
Clone, Clone,
Copy, Copy,
Debug, Debug,
Default,
Eq, Eq,
PartialEq, PartialEq,
ToSchema, ToSchema,
@ -586,7 +585,6 @@ pub enum Connector {
Aci, Aci,
Adyen, Adyen,
Airwallex, Airwallex,
Applepay,
Authorizedotnet, Authorizedotnet,
Bitpay, Bitpay,
Bluesnap, Bluesnap,
@ -594,8 +592,6 @@ pub enum Connector {
Checkout, Checkout,
Coinbase, Coinbase,
Cybersource, Cybersource,
#[default]
Dummy,
Iatapay, Iatapay,
#[cfg(feature = "dummy_connector")] #[cfg(feature = "dummy_connector")]
#[serde(rename = "dummyconnector1")] #[serde(rename = "dummyconnector1")]
@ -632,7 +628,6 @@ pub enum Connector {
Worldline, Worldline,
Worldpay, Worldpay,
Zen, Zen,
Signifyd,
} }
impl Connector { impl Connector {

View File

@ -199,50 +199,94 @@ impl ConnectorData {
_connectors: &Connectors, _connectors: &Connectors,
connector_name: &str, connector_name: &str,
) -> CustomResult<BoxedConnector, errors::ApiErrorResponse> { ) -> CustomResult<BoxedConnector, errors::ApiErrorResponse> {
match connector_name { match enums::Connector::from_str(connector_name) {
"aci" => Ok(Box::new(&connector::Aci)), Ok(name) => match name {
"adyen" => Ok(Box::new(&connector::Adyen)), enums::Connector::Aci => Ok(Box::new(&connector::Aci)),
"airwallex" => Ok(Box::new(&connector::Airwallex)), enums::Connector::Adyen => Ok(Box::new(&connector::Adyen)),
"authorizedotnet" => Ok(Box::new(&connector::Authorizedotnet)), enums::Connector::Airwallex => Ok(Box::new(&connector::Airwallex)),
"bambora" => Ok(Box::new(&connector::Bambora)), enums::Connector::Authorizedotnet => Ok(Box::new(&connector::Authorizedotnet)),
"bitpay" => Ok(Box::new(&connector::Bitpay)), enums::Connector::Bambora => Ok(Box::new(&connector::Bambora)),
"bluesnap" => Ok(Box::new(&connector::Bluesnap)), enums::Connector::Bitpay => Ok(Box::new(&connector::Bitpay)),
"braintree" => Ok(Box::new(&connector::Braintree)), enums::Connector::Bluesnap => Ok(Box::new(&connector::Bluesnap)),
"checkout" => Ok(Box::new(&connector::Checkout)), enums::Connector::Braintree => Ok(Box::new(&connector::Braintree)),
"coinbase" => Ok(Box::new(&connector::Coinbase)), enums::Connector::Checkout => Ok(Box::new(&connector::Checkout)),
"cybersource" => Ok(Box::new(&connector::Cybersource)), enums::Connector::Coinbase => Ok(Box::new(&connector::Coinbase)),
"dlocal" => Ok(Box::new(&connector::Dlocal)), enums::Connector::Cybersource => Ok(Box::new(&connector::Cybersource)),
#[cfg(feature = "dummy_connector")] enums::Connector::Dlocal => Ok(Box::new(&connector::Dlocal)),
"dummyconnector1" => Ok(Box::new(&connector::DummyConnector::<1>)), #[cfg(feature = "dummy_connector")]
#[cfg(feature = "dummy_connector")] enums::Connector::DummyConnector1 => Ok(Box::new(&connector::DummyConnector::<1>)),
"dummyconnector2" => Ok(Box::new(&connector::DummyConnector::<2>)), #[cfg(feature = "dummy_connector")]
#[cfg(feature = "dummy_connector")] enums::Connector::DummyConnector2 => Ok(Box::new(&connector::DummyConnector::<2>)),
"dummyconnector3" => Ok(Box::new(&connector::DummyConnector::<3>)), #[cfg(feature = "dummy_connector")]
"fiserv" => Ok(Box::new(&connector::Fiserv)), enums::Connector::DummyConnector3 => Ok(Box::new(&connector::DummyConnector::<3>)),
"forte" => Ok(Box::new(&connector::Forte)), enums::Connector::Fiserv => Ok(Box::new(&connector::Fiserv)),
"globalpay" => Ok(Box::new(&connector::Globalpay)), enums::Connector::Forte => Ok(Box::new(&connector::Forte)),
"iatapay" => Ok(Box::new(&connector::Iatapay)), enums::Connector::Globalpay => Ok(Box::new(&connector::Globalpay)),
"klarna" => Ok(Box::new(&connector::Klarna)), enums::Connector::Iatapay => Ok(Box::new(&connector::Iatapay)),
"mollie" => Ok(Box::new(&connector::Mollie)), enums::Connector::Klarna => Ok(Box::new(&connector::Klarna)),
"nmi" => Ok(Box::new(&connector::Nmi)), enums::Connector::Mollie => Ok(Box::new(&connector::Mollie)),
// "noon" => Ok(Box::new(&connector::Noon)), added as template code for future usage enums::Connector::Nmi => Ok(Box::new(&connector::Nmi)),
"nuvei" => Ok(Box::new(&connector::Nuvei)), // "noon" => Ok(Box::new(&connector::Noon)), added as template code for future usage
"opennode" => Ok(Box::new(&connector::Opennode)), enums::Connector::Nuvei => Ok(Box::new(&connector::Nuvei)),
// "payeezy" => Ok(Box::new(&connector::Payeezy)), As psync and rsync are not supported by this connector, it is added as template code for future usage enums::Connector::Opennode => Ok(Box::new(&connector::Opennode)),
"payu" => Ok(Box::new(&connector::Payu)), // "payeezy" => Ok(Box::new(&connector::Payeezy)), As psync and rsync are not supported by this connector, it is added as template code for future usage
"rapyd" => Ok(Box::new(&connector::Rapyd)), enums::Connector::Payu => Ok(Box::new(&connector::Payu)),
"shift4" => Ok(Box::new(&connector::Shift4)), enums::Connector::Rapyd => Ok(Box::new(&connector::Rapyd)),
"stripe" => Ok(Box::new(&connector::Stripe)), enums::Connector::Shift4 => Ok(Box::new(&connector::Shift4)),
"worldline" => Ok(Box::new(&connector::Worldline)), enums::Connector::Stripe => Ok(Box::new(&connector::Stripe)),
"worldpay" => Ok(Box::new(&connector::Worldpay)), enums::Connector::Worldline => Ok(Box::new(&connector::Worldline)),
"multisafepay" => Ok(Box::new(&connector::Multisafepay)), enums::Connector::Worldpay => Ok(Box::new(&connector::Worldpay)),
"nexinets" => Ok(Box::new(&connector::Nexinets)), enums::Connector::Multisafepay => Ok(Box::new(&connector::Multisafepay)),
"paypal" => Ok(Box::new(&connector::Paypal)), enums::Connector::Nexinets => Ok(Box::new(&connector::Nexinets)),
"trustpay" => Ok(Box::new(&connector::Trustpay)), enums::Connector::Paypal => Ok(Box::new(&connector::Paypal)),
"zen" => Ok(Box::new(&connector::Zen)), enums::Connector::Trustpay => Ok(Box::new(&connector::Trustpay)),
_ => Err(report!(errors::ConnectorError::InvalidConnectorName) enums::Connector::Zen => Ok(Box::new(&connector::Zen)),
},
Err(_) => Err(report!(errors::ConnectorError::InvalidConnectorName)
.attach_printable(format!("invalid connector name: {connector_name}"))) .attach_printable(format!("invalid connector name: {connector_name}")))
.change_context(errors::ApiErrorResponse::InternalServerError), .change_context(errors::ApiErrorResponse::InternalServerError),
} }
} }
} }
#[cfg(test)]
mod test {
#![allow(clippy::unwrap_used)]
use super::*;
#[test]
fn test_convert_connector_parsing_success() {
let result = enums::Connector::from_str("aci");
assert!(result.is_ok());
assert_eq!(result.unwrap(), enums::Connector::Aci);
let result = enums::Connector::from_str("shift4");
assert!(result.is_ok());
assert_eq!(result.unwrap(), enums::Connector::Shift4);
let result = enums::Connector::from_str("authorizedotnet");
assert!(result.is_ok());
assert_eq!(result.unwrap(), enums::Connector::Authorizedotnet);
}
#[test]
fn test_convert_connector_parsing_fail_for_unknown_type() {
let result = enums::Connector::from_str("unknowntype");
assert!(result.is_err());
let result = enums::Connector::from_str("randomstring");
assert!(result.is_err());
}
#[test]
fn test_convert_connector_parsing_fail_for_camel_case() {
let result = enums::Connector::from_str("Paypal");
assert!(result.is_err());
let result = enums::Connector::from_str("Authorizedotnet");
assert!(result.is_err());
let result = enums::Connector::from_str("Opennode");
assert!(result.is_err());
}
}

View File

@ -12,6 +12,7 @@ pub struct RoutingData {
impl crate::utils::storage_partitioning::KvStorePartition for PaymentAttempt {} impl crate::utils::storage_partitioning::KvStorePartition for PaymentAttempt {}
#[cfg(test)] #[cfg(test)]
#[cfg(feature = "dummy_connector")]
mod tests { mod tests {
#![allow(clippy::expect_used, clippy::unwrap_used)] #![allow(clippy::expect_used, clippy::unwrap_used)]
use tokio::sync::oneshot; use tokio::sync::oneshot;
@ -34,7 +35,7 @@ mod tests {
let payment_id = Uuid::new_v4().to_string(); let payment_id = Uuid::new_v4().to_string();
let current_time = common_utils::date_time::now(); let current_time = common_utils::date_time::now();
let connector = types::Connector::Dummy.to_string(); let connector = types::Connector::DummyConnector1.to_string();
let payment_attempt = PaymentAttemptNew { let payment_attempt = PaymentAttemptNew {
payment_id: payment_id.clone(), payment_id: payment_id.clone(),
connector: Some(connector), connector: Some(connector),
@ -66,7 +67,7 @@ mod tests {
let payment_id = Uuid::new_v4().to_string(); let payment_id = Uuid::new_v4().to_string();
let attempt_id = Uuid::new_v4().to_string(); let attempt_id = Uuid::new_v4().to_string();
let merchant_id = Uuid::new_v4().to_string(); let merchant_id = Uuid::new_v4().to_string();
let connector = types::Connector::Dummy.to_string(); let connector = types::Connector::DummyConnector1.to_string();
let payment_attempt = PaymentAttemptNew { let payment_attempt = PaymentAttemptNew {
payment_id: payment_id.clone(), payment_id: payment_id.clone(),
@ -105,11 +106,11 @@ mod tests {
async fn test_payment_attempt_mandate_field() { async fn test_payment_attempt_mandate_field() {
use crate::configs::settings::Settings; use crate::configs::settings::Settings;
let conf = Settings::new().expect("invalid settings"); let conf = Settings::new().expect("invalid settings");
let uuid = uuid::Uuid::new_v4().to_string(); let uuid = Uuid::new_v4().to_string();
let tx: oneshot::Sender<()> = oneshot::channel().0; let tx: oneshot::Sender<()> = oneshot::channel().0;
let state = routes::AppState::with_storage(conf, StorageImpl::PostgresqlTest, tx).await; let state = routes::AppState::with_storage(conf, StorageImpl::PostgresqlTest, tx).await;
let current_time = common_utils::date_time::now(); let current_time = common_utils::date_time::now();
let connector = types::Connector::Dummy.to_string(); let connector = types::Connector::DummyConnector1.to_string();
let payment_attempt = PaymentAttemptNew { let payment_attempt = PaymentAttemptNew {
payment_id: uuid.clone(), payment_id: uuid.clone(),

View File

@ -16,7 +16,7 @@ impl utils::Connector for NoonTest {
use router::connector::Noon; use router::connector::Noon;
types::api::ConnectorData { types::api::ConnectorData {
connector: Box::new(&Noon), connector: Box::new(&Noon),
connector_name: types::Connector::Dummy, connector_name: types::Connector::DummyConnector1,
get_token: types::api::GetToken::Connector, get_token: types::api::GetToken::Connector,
} }
} }

View File

@ -22,7 +22,7 @@ impl utils::Connector for PayeezyTest {
use router::connector::Payeezy; use router::connector::Payeezy;
types::api::ConnectorData { types::api::ConnectorData {
connector: Box::new(&Payeezy), connector: Box::new(&Payeezy),
connector_name: types::Connector::Dummy, connector_name: types::Connector::DummyConnector1,
get_token: types::api::GetToken::Connector, get_token: types::api::GetToken::Connector,
} }
} }