Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/242 gateway assignment tests #7152

Merged
merged 10 commits into from
Nov 15, 2022
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[
{
"gatewayName": "Default Gateway Id",
"id": "Default Gateway Id",
"isACHEnabled": true,
"isCreditCardEnabled": true,
"isDefault": true
},
{
"gatewayName": "Non-default Gateway Id",
"id": "Non-default Gateway Id",
"isACHEnabled": true,
"isCreditCardEnabled": true,
"isDefault": false
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,298 @@
import { createElement } from "lwc";
import GeGatewaySelectWidget from "c/geGatewaySelectWidget";
import GeGatewaySettings from "c/geGatewaySettings";
import getGatewayAssignmentSettings from "@salesforce/apex/GE_GiftEntryController.getGatewayAssignmentSettings";
import getGatewaysFromElevate from "@salesforce/apex/GE_GiftEntryController.getGatewaysFromElevate";

const gatewaysFromElevate = require("./data/getGatewaysFromElevate.json");

const PAYMENT_METHOD_MODE = "PAYMENT";
const GATEWAY_MANAGEMENT_MODE = "MANAGEMENT";
const SELECTED_GATEWAY_ID = "Non-default Gateway Id";
const DEFAULT_GATEWAY_ID = "Default Gateway Id";
const DEFAULT_TEMPLATE_ID = "Default Template Id";

jest.mock(
"@salesforce/apex/GE_GiftEntryController.getGatewayAssignmentSettings",
() => {
return { default: jest.fn() };
},
{ virtual: true }
);

jest.mock(
"@salesforce/apex/GE_GiftEntryController.getGatewaysFromElevate",
() => {
return { default: jest.fn() };
},
{ virtual: true }
);

describe("c-ge-gateway-select-widget", () => {
beforeEach(() => {
getGatewaysFromElevate.mockResolvedValue(JSON.stringify(gatewaysFromElevate));
});

afterEach(() => {
GeGatewaySettings.clearDecryptedElevateSettings();
jest.clearAllMocks();
clearDOM();
});

describe("gateway assignment mode", () => {
beforeEach(() => {
getGatewayAssignmentSettings.mockResolvedValue(JSON.stringify({
defaultGatewayId: DEFAULT_GATEWAY_ID,
defaultTemplateId: DEFAULT_TEMPLATE_ID,
gatewayAssignmentEnabled: true,
}));
});

it("renders widget contents when not default template", async () => {
GeGatewaySettings.setElevateSettings(null, SELECTED_GATEWAY_ID);
const element = createGeGatewaySelectWidget(null);
document.body.appendChild(element);
await flushPromises();

expect(element).toBeTruthy();
expect(getDiv(element)).toBeTruthy();
});

it("does not render widget contents when default template", async () => {
GeGatewaySettings.setElevateSettings(null, DEFAULT_TEMPLATE_ID);
const element = createGeGatewaySelectWidget(null);
document.body.appendChild(element);
await flushPromises();

expect(element).toBeTruthy();
expect(getDiv(element)).toBeFalsy();
});

it("displays spinner if no gateways found", async () => {
GeGatewaySettings.setElevateSettings(null, null);
getGatewaysFromElevate.mockResolvedValueOnce(null);
const element = createGeGatewaySelectWidget(null);
document.body.appendChild(element);
await flushPromises();

expect(getSpinner(element)).toBeTruthy();
});

it("displays gateways and payment methods when expanded", async () => {
GeGatewaySettings.setElevateSettings(null, null);
const element = createGeGatewaySelectWidget(null);
document.body.appendChild(element);
await flushPromises();

const expandGatewayControl = getExpandGatewayControl(element);
expect(expandGatewayControl).toBeTruthy();
expandGatewayControl.click();
await flushPromises();

expect(getComboBox(element)).toBeTruthy();
expect(getACHCheckBox(element)).toBeTruthy();
expect(getCCCheckBox(element)).toBeTruthy();
})

it("does not display gateways and payment methods when collapsed", async () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This and the test above could probably be the same test, just need to add the expectations after it's expanded 🤷

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had initially combined the tests, but thought it might be more clear what was being tested if they were separate. I'll put them back together.

GeGatewaySettings.setElevateSettings(null, null);
const element = createGeGatewaySelectWidget(null);
document.body.appendChild(element);
await flushPromises();

const expandGatewayControl = getExpandGatewayControl(element);
expect(expandGatewayControl).toBeTruthy();
expandGatewayControl.click();
await flushPromises();

const collapseControl = shadowQuerySelector(element,'[data-id="ga-hide-button"]');
expect(collapseControl).toBeTruthy();
collapseControl.click();
await flushPromises();

expect(getComboBox(element)).toBeFalsy();
expect(getACHCheckBox(element)).toBeFalsy();
expect(getCCCheckBox(element)).toBeFalsy();
})
});

describe("payment method mode", () => {
beforeEach(() => {
getGatewayAssignmentSettings.mockResolvedValue(JSON.stringify({
defaultGatewayId: DEFAULT_GATEWAY_ID,
defaultTemplateId: DEFAULT_TEMPLATE_ID,
gatewayAssignmentEnabled: false,
}));
});

it("renders widget contents when not default template", async () => {
GeGatewaySettings.setElevateSettings(null, SELECTED_GATEWAY_ID);
const element = createGeGatewaySelectWidget(PAYMENT_METHOD_MODE);
document.body.appendChild(element);
await flushPromises();

expect(element).toBeTruthy();
expect(getDiv(element)).toBeTruthy();
});

it("does not render widget contents when default template", async () => {
GeGatewaySettings.setElevateSettings(null, DEFAULT_TEMPLATE_ID);
const element = createGeGatewaySelectWidget(PAYMENT_METHOD_MODE);
document.body.appendChild(element);
await flushPromises();

expect(element).toBeTruthy();
expect(getDiv(element)).toBeFalsy();
});

it("does not display spinner if no gateways found", async () => {
getGatewaysFromElevate.mockResolvedValueOnce(null);
GeGatewaySettings.setElevateSettings(null, null);
const element = createGeGatewaySelectWidget(null);
document.body.appendChild(element);
await flushPromises();

expect(getSpinner(element)).toBeFalsy();
});

it("displays payment methods, but not gateways when expanded", async () => {
GeGatewaySettings.setElevateSettings(null, null);
const element = createGeGatewaySelectWidget(null);
document.body.appendChild(element);
await flushPromises();

const expandPaymentControl = getExpandPaymentControl(element);
expect(expandPaymentControl).toBeTruthy();
expandPaymentControl.click();
await flushPromises();

expect(getComboBox(element)).toBeFalsy();
expect(getACHCheckBox(element)).toBeTruthy();
expect(getCCCheckBox(element)).toBeTruthy();
})

it("does not display payment methods when collapsed", async () => {
GeGatewaySettings.setElevateSettings(null, null);
const element = createGeGatewaySelectWidget(null);
document.body.appendChild(element);
await flushPromises();

const expandPaymentControl = getExpandPaymentControl(element);
expect(expandPaymentControl).toBeTruthy();
expandPaymentControl.click();
await flushPromises();

const collapseControl = shadowQuerySelector(element,'[data-id="pm-hide-button"]');
expect(collapseControl).toBeTruthy();
collapseControl.click();
await flushPromises();

expect(getComboBox(element)).toBeFalsy();
expect(getACHCheckBox(element)).toBeFalsy();
expect(getCCCheckBox(element)).toBeFalsy();
})
});

describe("gateway management mode", () => {
beforeEach(() => {
getGatewayAssignmentSettings.mockResolvedValue(JSON.stringify({
defaultGatewayId: DEFAULT_GATEWAY_ID,
defaultTemplateId: DEFAULT_TEMPLATE_ID,
gatewayAssignmentEnabled: true,
}));
});

it("renders widget contents when not default template", async () => {
GeGatewaySettings.setElevateSettings(null, SELECTED_GATEWAY_ID);
const element = createGeGatewaySelectWidget(GATEWAY_MANAGEMENT_MODE);
document.body.appendChild(element);
await flushPromises();

expect(element).toBeTruthy();
expect(getDiv(element)).toBeTruthy();
});

it("renders widget contents when default template", async () => {
GeGatewaySettings.setElevateSettings(null, DEFAULT_TEMPLATE_ID);
const element = createGeGatewaySelectWidget(GATEWAY_MANAGEMENT_MODE);
document.body.appendChild(element);
await flushPromises();

expect(element).toBeTruthy();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? Isn't Gateway Management Mode for the NPSP Settings page? The template has nothing to do with that, right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can eliminate the test if that seems right. What it is testing is to make sure that gateway management isn't affected by that setting. It should always be null, so seems fine to cut it out.

expect(getDiv(element)).toBeTruthy();
});

it("does not display spinner if no gateways found", async () => {
getGatewaysFromElevate.mockResolvedValueOnce(null);
GeGatewaySettings.setElevateSettings(null, null);
const element = createGeGatewaySelectWidget(GATEWAY_MANAGEMENT_MODE);
document.body.appendChild(element);
await flushPromises();

expect(getSpinner(element)).toBeFalsy();
});

it("Only gateway combo-box is displayed", async () => {
GeGatewaySettings.setElevateSettings(null, null);
const element = createGeGatewaySelectWidget(GATEWAY_MANAGEMENT_MODE);
document.body.appendChild(element);
await flushPromises();

expect(getExpandGatewayControl(element)).toBeFalsy();
expect(getExpandPaymentControl(element)).toBeFalsy();
expect(getComboBox(element)).toBeTruthy();
expect(getACHCheckBox(element)).toBeFalsy();
expect(getCCCheckBox(element)).toBeFalsy();
});
});
});

const createGeGatewaySelectWidget = (mode) => {
const element = createElement("c-ge-gateway-select-widget", { is: GeGatewaySelectWidget });
element.parentContext = mode;
return element;
};

const getShadowRoot = (element) => {
if (!element || !element.shadowRoot) {
const tagName =
element && element.tagName && element.tagName.toLowerCase();
throw new Error(
`Attempting to retrieve the shadow root of '${tagName || element}'
but no shadowRoot property found`
);
}
return element.shadowRoot;
}

const shadowQuerySelector = (element, selector) => {
return getShadowRoot(element).querySelector(selector);
}

const getComboBox = (element) => {
return shadowQuerySelector(element,'[data-id="gateway-combobox"]');
}

const getACHCheckBox = (element) => {
return shadowQuerySelector(element,'[data-id="checkboxACH"]');
}

const getCCCheckBox = (element) => {
return shadowQuerySelector(element,'[data-id="checkboxCreditCard"]');
}

const getExpandGatewayControl = (element) => {
return shadowQuerySelector(element,'[data-id="ga-show-button"]');
}

const getExpandPaymentControl = (element) => {
return shadowQuerySelector(element,'[data-id="pm-show-button"]');
}

const getDiv = (element) => {
return shadowQuerySelector(element,'div');
}

const getSpinner = (element) => {
return shadowQuerySelector(element,'[data-id="spinner"]');
}
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@
<lightning-input data-id="checkboxACH"
label={CUSTOM_LABELS.psACH}
checked={isACHEnabled}
disabled={isACHDisabled}
disabled={isACHUnavailable}
onchange={handleACHChange}
variant="standard"
type="checkbox"
Expand All @@ -126,7 +126,7 @@
<lightning-input data-id="checkboxCreditCard"
label={CUSTOM_LABELS.RD2_Credit_Card_Payment_Method_Label}
checked={isCreditCardEnabled}
disabled={isCreditCardDisabled}
disabled={isCreditCardUnavailable}
onchange={handleCreditCardChange}
variant="standard"
type="checkbox"
Expand Down
Loading