Skip to content

Commit

Permalink
added files for cypress tests and made some error handling changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Sayak Bhattacharya authored and Sayak Bhattacharya committed Nov 25, 2024
1 parent 76fb9c5 commit ac53ed5
Show file tree
Hide file tree
Showing 5 changed files with 211 additions and 32 deletions.
52 changes: 26 additions & 26 deletions crates/hyperswitch_connectors/src/connectors/jpmorgan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,9 @@ use hyperswitch_interfaces::{
api::{
self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration,
ConnectorValidation,
},
configs::Connectors,
errors,
events::connector_api_logs::ConnectorEvent,
types::{self, RefreshTokenType, Response},
webhooks,
}, configs::Connectors, consts, errors, events::connector_api_logs::ConnectorEvent, types::{self, RefreshTokenType, Response}, webhooks
};
use transformers as jpmorgan;
use transformers::{self as jpmorgan, JpmorganErrorResponse};

use crate::{
constants::headers, types::{ResponseRouterData, RefreshTokenRouterData}, utils
Expand Down Expand Up @@ -130,25 +125,26 @@ impl ConnectorCommon for Jpmorgan {
}

fn build_error_response(
&self,
res: Response,
event_builder: Option<&mut ConnectorEvent>,
) -> CustomResult<ErrorResponse, errors::ConnectorError> {
let response: jpmorgan::JpmorganErrorResponse = res
.response
.parse_struct("JpmorganErrorResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
&self,
res: Response,
event_builder: Option<&mut ConnectorEvent>,
) -> CustomResult<ErrorResponse, errors::ConnectorError> {
let response : JpmorganErrorResponse = res.response.parse_struct("JpmorganErrorResponse").
change_context(errors::ConnectorError::ResponseDeserializationFailed)?;

event_builder.map(|i| i.set_response_body(&response));
router_env::logger::info!(connector_response=?response);
Ok(ErrorResponse {
status_code: res.status_code,
code: response.code,
message: response.message,
reason: response.reason,
attempt_status: None,
connector_transaction_id: None,
})
router_env::logger::info!(connector_response=?response);
event_builder.map(|i| i.set_response_body(&response));

let response_message = response.response_message.as_ref().map_or_else(|| consts::NO_ERROR_MESSAGE.to_string(), ToString::to_string);

Ok(ErrorResponse{
status_code : res.status_code,
code : response.response_code,
message : response_message.clone(),
reason : Some(response_message),
attempt_status : None,
connector_transaction_id : None,
})
}
}

Expand All @@ -162,9 +158,13 @@ impl ConnectorValidation for Jpmorgan {
let capture_method = capture_method.unwrap_or_default();
match capture_method {
enums::CaptureMethod::Automatic | enums::CaptureMethod::Manual => Ok(()),
enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::Scheduled => Err(
//enums::CaptureMethod::ManualMultiple |
enums::CaptureMethod::Scheduled => Err(
utils::construct_not_implemented_error_report(capture_method, self.id()),
),
enums::CaptureMethod::ManualMultiple => Err(errors::ConnectorError::NotImplemented( //ManualMultiple unimplemented
utils::get_unimplemented_payment_method_error_message("Jpmorgan"),
))?,
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1233,10 +1233,27 @@ impl<F> TryFrom<ResponseRouterData<F, JpmorganCancelResponse, PaymentsCancelData
}
}

#[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all="camelCase")]
pub struct JpmorganValidationErrors{
pub code : Option<String>,
pub message : Option<String>,
pub entity : Option<String>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all="camelCase")]
pub struct JpmorganErrorInformation{
pub code : Option<String>,
pub message : Option<String>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all="camelCase")]
pub struct JpmorganErrorResponse {
pub status_code: u16,
pub code: String,
pub message: String,
pub reason: Option<String>,
pub response_status : JpmorganTransactionStatus,
pub response_code : String,
pub response_message : Option<String>,
// pub validation_errors : Option<Vec<JpmorganValidationErrors>>,
// pub information : JpmorganErrorInformation,
}
160 changes: 160 additions & 0 deletions cypress-tests/cypress/e2e/PaymentUtils/Jpmorgan.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
const successfulNo3DSCardDetails = {
card_number : "6011016011016011",
card_exp_month : "10",
card_exp_year : "2027",
card_holder_name : "John Doe",
card_cvc : "123",
};

export const connectorDetails = {
card_pm : {
PaymentIntent : {
Request : {
currency : "USD",
customer_acceptance : null,
setup_future_usage : "on_session",
},
Response : {
status : 200,
body : {
status :
"requires_payment_method",
},
},
},
No3DSManualCapture: {
Request: {
currency: "USD",
payment_method: "card",
billing: {
address: {
line1: "1467",
line2: "CA",
line3: "CA",
city: "Musterhausen",
state: "California",
zip: "12345",
country: "US",
first_name: "Max",
last_name: "Mustermann",
},
email: "[email protected]",
phone: {
number: "9123456789",
country_code: "+91",
},
},
payment_method_data: {
card: successfulNo3DSCardDetails,
},
customer_acceptance: null,
setup_future_usage: "on_session",
},
Response: {
status: 200,
body: {
status: "requires_capture",
},
},
},
No3DSAutoCapture: {
Request: {
// Auto capture with different currency, so we need to pass currency in here
currency: "USD",
payment_method: "card",
// billing: {
// address: {
// line1: "1467",
// line2: "CA",
// line3: "CA",
// city: "Musterhausen",
// state: "California",
// zip: "12345",
// country: "US",
// first_name: "Max",
// last_name: "Mustermann",
// },
// email: "[email protected]",
// phone: {
// number: "9123456789",
// country_code: "+91",
// },
// },
payment_method_data: {
card: successfulNo3DSCardDetails,
},
customer_acceptance: null,
setup_future_usage: "on_session",
},
Response: {
status: 200,
body: {
status: "succeeded",
},
},
},
Capture: {
Request: {
payment_method: "card",
payment_method_data: {
card: successfulNo3DSCardDetails,
},
customer_acceptance: null,
},
Response: {
status: 200,
body: {
status: "succeeded",
amount: 6500,
amount_capturable: 0,
amount_received: 6500,
},
},
},
Refund: {
Request: {
payment_method: "card",
payment_method_data: {
card: successfulNo3DSCardDetails,
},
customer_acceptance: null,
},
Response: {
status: 200,
body: {
status: "succeeded",
},
},
},
PartialRefund: {
Request: {
payment_method: "card",
payment_method_data: {
card: successfulNo3DSCardDetails,
},
customer_acceptance: null,
},
Response: {
status: 200,
body: {
status: "succeeded",
},
},
},
SyncRefund: {
Request: {
payment_method: "card",
payment_method_data: {
card: successfulNo3DSCardDetails,
},
customer_acceptance: null,
},
Response: {
status: 200,
body: {
status: "succeeded",
},
},
},
}
}
2 changes: 2 additions & 0 deletions cypress-tests/cypress/e2e/PaymentUtils/Utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { connectorDetails as datatransConnectorDetails } from "./Datatrans.js";
import { connectorDetails as fiservemeaConnectorDetails } from "./Fiservemea.js";
import { connectorDetails as iatapayConnectorDetails } from "./Iatapay.js";
import { connectorDetails as itaubankConnectorDetails } from "./ItauBank.js";
import { connectorDetails as jpmorganConnectorDetails} from "./Jpmorgan.js";
import { connectorDetails as nexixpayConnectorDetails } from "./Nexixpay.js";
import { connectorDetails as nmiConnectorDetails } from "./Nmi.js";
import { connectorDetails as novalnetConnectorDetails } from "./Novalnet.js";
Expand All @@ -30,6 +31,7 @@ const connectorDetails = {
fiservemea: fiservemeaConnectorDetails,
iatapay: iatapayConnectorDetails,
itaubank: itaubankConnectorDetails,
jpmorgan : jpmorganConnectorDetails,
nexixpay: nexixpayConnectorDetails,
nmi: nmiConnectorDetails,
novalnet: novalnetConnectorDetails,
Expand Down
2 changes: 1 addition & 1 deletion cypress-tests/cypress/support/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -1470,7 +1470,7 @@ Cypress.Commands.add(
if (response.body.capture_method !== undefined) {
expect(response.body.payment_id).to.equal(payment_id);
for (const key in res_data.body) {
expect(res_data.body[key]).to.equal(response.body[key]);
expect(res_data.body[key]).to.equal(response.body[key]); //
}
} else {
defaultErrorHandler(response, res_data);
Expand Down

0 comments on commit ac53ed5

Please sign in to comment.