fix(client): avoid calling the api for signed out users (#42383)

* feat(client): call api for singed in paypal subs

* feat(client): update tests

* feat(client): add kebab case

* fix: clarify tests
This commit is contained in:
Ahmad Abdolsaheb
2021-09-08 05:24:18 +03:00
committed by GitHub
parent bdcd6fa577
commit a48091a012
3 changed files with 69 additions and 5 deletions

View File

@ -273,7 +273,8 @@ class DonateForm extends Component<DonateFormProps, DonateFromComponentState> {
defaultTheme, defaultTheme,
theme, theme,
t, t,
isMinimalForm isMinimalForm,
isSignedIn
} = this.props; } = this.props;
const paymentButtonsLoading = loading.stripe && loading.paypal; const paymentButtonsLoading = loading.stripe && loading.paypal;
const priorityTheme = defaultTheme ? defaultTheme : theme; const priorityTheme = defaultTheme ? defaultTheme : theme;
@ -307,6 +308,7 @@ class DonateForm extends Component<DonateFormProps, DonateFromComponentState> {
handlePaymentButtonLoad={this.handlePaymentButtonLoad} handlePaymentButtonLoad={this.handlePaymentButtonLoad}
handleProcessing={handleProcessing} handleProcessing={handleProcessing}
isPaypalLoading={loading.paypal} isPaypalLoading={loading.paypal}
isSignedIn={isSignedIn}
onDonationStateChange={this.onDonationStateChange} onDonationStateChange={this.onDonationStateChange}
theme={defaultTheme ? defaultTheme : theme} theme={defaultTheme ? defaultTheme : theme}
/> />

View File

@ -2,7 +2,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable camelcase */ /* eslint-disable camelcase */
import React, { Component } from 'react'; import React, { Component, Ref } from 'react';
import { withTranslation } from 'react-i18next'; import { withTranslation } from 'react-i18next';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
@ -17,6 +17,7 @@ import PayPalButtonScriptLoader from './PayPalButtonScriptLoader';
type PaypalButtonProps = { type PaypalButtonProps = {
addDonation: (data: AddDonationData) => void; addDonation: (data: AddDonationData) => void;
isSignedIn: boolean;
donationAmount: number; donationAmount: number;
donationDuration: string; donationDuration: string;
handleProcessing: ( handleProcessing: (
@ -39,6 +40,7 @@ type PaypalButtonProps = {
isPaypalLoading: boolean; isPaypalLoading: boolean;
skipAddDonation?: boolean; skipAddDonation?: boolean;
t: (label: string) => string; t: (label: string) => string;
ref?: Ref<PaypalButton>;
theme: string; theme: string;
isSubscription?: boolean; isSubscription?: boolean;
handlePaymentButtonLoad: (provider: 'stripe' | 'paypal') => void; handlePaymentButtonLoad: (provider: 'stripe' | 'paypal') => void;
@ -106,10 +108,10 @@ export class PaypalButton extends Component<
handleApproval = (data: AddDonationData, isSubscription: boolean): void => { handleApproval = (data: AddDonationData, isSubscription: boolean): void => {
const { amount, duration } = this.state; const { amount, duration } = this.state;
const { skipAddDonation = false } = this.props; const { isSignedIn = false } = this.props;
// Skip the api if user is not signed in or if its a one-time donation // If the user is signed in and the payment is subscritipn call the api
if (!skipAddDonation || isSubscription) { if (isSignedIn && isSubscription) {
this.props.addDonation(data); this.props.addDonation(data);
} }

View File

@ -0,0 +1,60 @@
import { render } from '@testing-library/react';
import React from 'react';
import { PaypalButton } from './PaypalButton';
const commonProps = {
donationAmount: 500,
donationDuration: 'month',
handleProcessing: () => null,
isDonating: false,
onDonationStateChange: () => null,
isPaypalLoading: true,
t: jest.fn(),
theme: 'night',
handlePaymentButtonLoad: jest.fn()
};
const donationData = {
redirecting: false,
processing: false,
success: false,
error: null
};
jest.mock('../../analytics');
describe('<Paypal Button/>', () => {
it('does not call addDonate api on payment approval when user is not signed ', () => {
const ref = React.createRef<PaypalButton>();
const isSubscription = true;
const addDonation = jest.fn();
render(
<PaypalButton
{...commonProps}
addDonation={addDonation}
isSignedIn={false}
ref={ref}
/>
);
ref.current?.handleApproval(donationData, isSubscription);
expect(addDonation).toBeCalledTimes(0);
});
it('calls addDonate api on payment approval when user is signed in', () => {
const ref = React.createRef<PaypalButton>();
const isSubscription = true;
const addDonation = jest.fn();
render(
<PaypalButton
{...commonProps}
addDonation={addDonation}
isSignedIn={true}
ref={ref}
/>
);
ref.current?.handleApproval(donationData, isSubscription);
expect(addDonation).toBeCalledTimes(1);
});
});