Skip to content

Commit

Permalink
Merge pull request #43 from mediaopt/feature/35066-negative-testing
Browse files Browse the repository at this point in the history
Feature/35066 negative testing
  • Loading branch information
LiudmylaMasliuk authored Dec 11, 2023
2 parents b30cf9f + ee9b6bc commit ceb93d9
Show file tree
Hide file tree
Showing 16 changed files with 246 additions and 195 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "paypal-commercetools-client",
"version": "0.0.81",
"version": "0.0.82",
"private": false,
"type": "module",
"license": "MIT",
Expand Down
109 changes: 55 additions & 54 deletions src/app/usePayment.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
ApproveVaultSetupTokenData,
CreateInvoiceData,
OrderDataLinks,
OrderData,
} from "../types";
import {
createPayment,
Expand All @@ -38,7 +39,7 @@ import { useSettings } from "./useSettings";
import { getClientToken } from "../services/getClientToken";
import { getActionIndex } from "../components/CardFields/constants";
import { useTranslation } from "react-i18next";
import { relevantError } from "../components/PayUponInvoice/RatepayErrorNote";
import { handleResponseError } from "../messages/errorMessages";

const PaymentInfoInitialObject = {
version: 0,
Expand All @@ -63,10 +64,10 @@ type PaymentContextT = {
vaultOnly: boolean;
orderDataLinks?: OrderDataLinks;
handleCreateVaultSetupToken: (
paymentSource: FUNDING_SOURCE
paymentSource: FUNDING_SOURCE,
) => Promise<string>;
handleApproveVaultSetupToken: (
data: ApproveVaultSetupTokenData
data: ApproveVaultSetupTokenData,
) => Promise<void>;
handleAuthenticateThreeDSOrder: (orderID: string) => Promise<number>;
orderId?: string;
Expand All @@ -75,7 +76,7 @@ type PaymentContextT = {
const setRelevantData = (
orderData?: CustomOrderData,
isInvoice?: boolean,
enableVaulting?: boolean
enableVaulting?: boolean,
) => {
if (isInvoice) {
return orderData as CreateInvoiceData;
Expand Down Expand Up @@ -136,14 +137,20 @@ export const PaymentProvider: FC<
const [orderId, setOrderId] = useState<string>();

const { settings } = useSettings();
const { t } = useTranslation();

const [paymentInfo, setPaymentInfo] = useState<PaymentInfo>(
PaymentInfoInitialObject
PaymentInfoInitialObject,
);

const { isLoading } = useLoader();
const { notify } = useNotifications();
const { t } = useTranslation();

const onSuccess = (orderData: OrderData) => {
setShowResult(true);
setResultSuccess(true);
purchaseCallback(orderData);
};

let latestPaymentVersion = paymentInfo.version;

Expand All @@ -161,14 +168,14 @@ export const PaymentProvider: FC<
};

const handleCreateVaultSetupToken = async (
paymentSource: FUNDING_SOURCE
paymentSource: FUNDING_SOURCE,
) => {
if (!createVaultSetupTokenUrl) return "";

const createVaultSetupTokenResult = await createVaultSetupToken(
requestHeader,
createVaultSetupTokenUrl,
paymentSource
paymentSource,
);

return createVaultSetupTokenResult
Expand All @@ -183,7 +190,7 @@ export const PaymentProvider: FC<
const result = await approveVaultSetupToken(
requestHeader,
approveVaultSetupTokenUrl,
vaultSetupToken
vaultSetupToken,
);
if (result) {
setShowResult(true);
Expand All @@ -194,13 +201,14 @@ export const PaymentProvider: FC<
setResultSuccess(false);
}
};

const handleCreateOrder = async (orderData?: CustomOrderData) => {
if (!createOrderUrl) return "";
const setRatepayMessage = orderData?.setRatepayMessage ?? undefined;
const relevantOrderData = setRelevantData(
orderData,
!!setRatepayMessage,
enableVaulting
enableVaulting,
);

const createOrderResult = await createOrder(
Expand All @@ -210,61 +218,52 @@ export const PaymentProvider: FC<
latestPaymentVersion,
{
...relevantOrderData,
}
},
);

if (createOrderResult) {
const { orderData, paymentVersion } = createOrderResult;
const { id, status, payment_source, details, links } = orderData;
const { id, status, payment_source, details, links, message } =
orderData;
latestPaymentVersion = paymentVersion;
if (setRatepayMessage) {
if (paymentVersion)
setPaymentInfo({ ...paymentInfo, version: paymentVersion });
if (id) {

if (!id) {
handleResponseError(
t,
notify,
details?.toString(),
message,
setRatepayMessage,
);
isLoading(false);
return "";
} else {
if (setRatepayMessage) {
setRatepayMessage && setRatepayMessage(undefined);
setShowResult(true);
setResultSuccess(true);
purchaseCallback(orderData);
return id;
onSuccess(orderData);
} else {
const errorDetails = details?.length && details[0];
if (errorDetails) {
const ratepayError = relevantError(errorDetails);
if (ratepayError) {
setRatepayMessage && setRatepayMessage(ratepayError);
return "";
}
if (status === "COMPLETED" && payment_source) {
onSuccess(orderData);
} else if (
status === "PAYER_ACTION_REQUIRED" &&
payment_source &&
links
) {
setOrderDataLinks(links);
setOrderId(id);
}
notify("Error", orderData?.message ?? t("thirdPartyIssue"));
return "";
}
} else {
if (status === "COMPLETED" && payment_source) {
setShowResult(true);
setResultSuccess(true);
purchaseCallback(orderData);
return "";
} else if (
status === "PAYER_ACTION_REQUIRED" &&
payment_source &&
links
) {
setPaymentInfo({ ...paymentInfo, version: paymentVersion });
setOrderDataLinks(links);
setOrderId(id);
return "";
} else {
return id;
}
}
return id;
} else return "";
};

const handleOnApprove = async (data: CustomOnApproveData) => {
if (!onApproveUrl && !authorizeOrderUrl && !onApproveRedirectionUrl)
return;
isLoading(true);

const { orderID, saveCard } = data;
isLoading(true);

if (onApproveRedirectionUrl) {
window.location.href = `${onApproveRedirectionUrl}?order_id=${orderID}`;
Expand All @@ -284,7 +283,7 @@ export const PaymentProvider: FC<
paymentInfo.id,
latestPaymentVersion,
orderID,
saveCard
saveCard,
);

const { orderData } = onApproveResult as OnApproveResponse;
Expand All @@ -301,6 +300,7 @@ export const PaymentProvider: FC<
}
isLoading(false);
};

const handleCreatePayment = async () => {
isLoading(true);

Expand All @@ -309,7 +309,7 @@ export const PaymentProvider: FC<
requestHeader,
createPaymentUrl,
cartInformation,
shippingMethodId
shippingMethodId,
)) as CreatePaymentResponse;

if (!createPaymentResult) {
Expand All @@ -325,7 +325,7 @@ export const PaymentProvider: FC<
getClientTokenUrl,
createPaymentResult.id,
createPaymentResult.version,
createPaymentResult.braintreeCustomerId
createPaymentResult.braintreeCustomerId,
)) as ClientTokenResponse;
setClientToken(clientTokenResult.clientToken);
paymentVersion = clientTokenResult.paymentVersion;
Expand All @@ -346,12 +346,13 @@ export const PaymentProvider: FC<
}
isLoading(false);
};

let vaultOnly: boolean = !!(
createVaultSetupTokenUrl && approveVaultSetupTokenUrl
);

const handleAuthenticateThreeDSOrder = async (
orderID: string
orderID: string,
): Promise<number> => {
if (!authenticateThreeDSOrderUrl) {
return 0;
Expand All @@ -361,7 +362,7 @@ export const PaymentProvider: FC<
authenticateThreeDSOrderUrl,
orderID,
latestPaymentVersion,
paymentInfo.id
paymentInfo.id,
);

if (!result) {
Expand All @@ -377,7 +378,7 @@ export const PaymentProvider: FC<
const action = getActionIndex(
result.approve.three_d_secure.enrollment_status,
result.approve.three_d_secure.authentication_status,
result.approve.liability_shift
result.approve.liability_shift,
);
return settings?.threeDSAction[action];
};
Expand Down
8 changes: 4 additions & 4 deletions src/components/HostedFields/HostedFieldsMask.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,17 @@ export const HostedFieldsMask: React.FC<HostedFieldsProps> = ({
options,
enableVaulting,
}) => {
const { handleCreateOrder, orderDataLinks, handleOnApprove, orderId } =
const { handleCreateOrder, orderDataLinks, orderId, clientToken } =
usePayment();
const { settings, paymentTokens } = useSettings();
const { clientToken } = usePayment();

const [addNew, setAddNew] = useState(false);
const [vaultId, setVaultId] = useState<string>();

let saveCard = false;

const cardPaymentTokens = paymentTokens?.payment_tokens?.filter(
(paymentToken) => paymentToken.payment_source.card !== undefined
(paymentToken) => paymentToken.payment_source.card !== undefined,
);

const hostedFieldClasses = useMemo(() => {
Expand All @@ -45,7 +45,7 @@ export const HostedFieldsMask: React.FC<HostedFieldsProps> = ({

useEffect(() => {
let oderDataPayerAction = orderDataLinks?.filter(
(orderDataLink) => orderDataLink.rel === "payer-action"
(orderDataLink) => orderDataLink.rel === "payer-action",
);

if (oderDataPayerAction && oderDataPayerAction[0]) {
Expand Down
16 changes: 10 additions & 6 deletions src/components/HostedFields/SubmitPayment.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import { CustomOnApproveData } from "../../types";
import { useNotifications } from "../../app/useNotifications";
import { useLoader } from "../../app/useLoader";
import { HOSTED_FIELDS_CARD_FIELDS, HOSTED_FIELDS_BUTTON } from "./constants";
import { errorFunc } from "../errorNotification";
import { useTranslation } from "react-i18next";

type SubmitPaymentProps = {
enableVaulting?: boolean;
Expand All @@ -25,6 +27,7 @@ export const SubmitPayment: React.FC<SubmitPaymentProps> = ({
const { settings } = useSettings();
const { notify } = useNotifications();
const { isLoading } = useLoader();
const { t } = useTranslation();
const [paying, setPaying] = useState(false);
const cardHolderName = useRef<HTMLInputElement>(null);

Expand All @@ -43,8 +46,7 @@ export const SubmitPayment: React.FC<SubmitPaymentProps> = ({
const approveTransaction = (approveData: CustomOnApproveData) => {
handleOnApprove(approveData).catch((err) => {
setPaying(false);
isLoading(false);
notify("Error", err.message);
errorFunc(err, isLoading, notify, t);
});
};

Expand All @@ -58,7 +60,7 @@ export const SubmitPayment: React.FC<SubmitPaymentProps> = ({
}
const isFormInvalid =
Object.values(hostedField.cardFields.getState().fields).some(
(field) => !field.isValid
(field) => !field.isValid,
) || !cardHolderName?.current?.value;

if (isFormInvalid) {
Expand All @@ -71,6 +73,7 @@ export const SubmitPayment: React.FC<SubmitPaymentProps> = ({
const hostedFieldsOptions: Record<string, unknown> = {
cardholderName: cardHolderName?.current?.value,
};

if (threeDSAuth) {
hostedFieldsOptions.contingencies = [threeDSAuth];
}
Expand All @@ -91,13 +94,14 @@ export const SubmitPayment: React.FC<SubmitPaymentProps> = ({
setPaying(false);
}
} else {
approveTransaction(approveData);
{
approveTransaction(approveData);
}
}
})
.catch((err) => {
notify("Error", err.message);
isLoading(false);
setPaying(false);
errorFunc(err, isLoading, notify, t);
});
};

Expand Down
Loading

0 comments on commit ceb93d9

Please sign in to comment.