Skip to content

Commit

Permalink
Merge pull request #7152 from SalesforceFoundation/feature/242__gatew…
Browse files Browse the repository at this point in the history
…ay-assignment-tests

Feature/242  gateway assignment tests
  • Loading branch information
daniel-fuller authored Nov 15, 2022
2 parents 7e56d00 + 596cbda commit 15858f0
Show file tree
Hide file tree
Showing 4 changed files with 293 additions and 19 deletions.
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,254 @@
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();

const collapseGatewayControl = shadowQuerySelector(element,'[data-id="ga-hide-button"]');
expect(collapseGatewayControl).toBeTruthy();
collapseGatewayControl.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();

const collapsePaymentControl = shadowQuerySelector(element,'[data-id="pm-hide-button"]');
expect(collapsePaymentControl).toBeTruthy();
collapsePaymentControl.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("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
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ export default class GeGatewaySelectWidget extends LightningElement {
@track selectedGateway = null;
@track gatewayOptions = [];
@track isACHEnabled = true;
@track isACHDisabled = false;
@track isACHUnavailable = false;
@track isCreditCardEnabled = true;
@track isCreditCardDisabled = false;
@track isCreditCardUnavailable = false;
@track isLoading = true;
@track isDefaultTemplate = false;
@track isGatewayAssignmentEnabled = false;
Expand Down Expand Up @@ -90,7 +90,7 @@ export default class GeGatewaySelectWidget extends LightningElement {

initWidgetSettings() {
if (this._defaultTemplateId === GeGatewaySettings.getTemplateRecordId()) {
this.isDefaultTemplate = true;
this.isDefaultTemplate = !this.onGatewayManagementPage();
this.isLoading = false;
return;
}
Expand Down Expand Up @@ -217,19 +217,23 @@ export default class GeGatewaySelectWidget extends LightningElement {

async selectDefaultGateway() {
this.selectedGateway = this.onGatewayManagementPage() ? this._defaultGatewayId : null;
this.updateACHSettings();
this.updateCreditCardSettings();
this.updateDisabledPaymentTypes();
if (!this.onGatewayManagementPage()) {
this.updateACHSettings();
this.updateCreditCardSettings();
this.updateDisabledPaymentTypes();
}
}

async selectSavedGateway(elevateSettings) {
let savedGatewayId = await decryptGatewayId({encryptedGatewayId: elevateSettings.uniqueKey});

if (this.isValidSavedGatewayId(savedGatewayId)) {
this.selectedGateway = savedGatewayId;
this.isACHEnabled = elevateSettings.isACHEnabled;
this.isCreditCardEnabled = elevateSettings.isCreditCardEnabled;
this.updateDisabledPaymentTypes();
if (!this.onGatewayManagementPage()) {
this.isACHEnabled = elevateSettings.isACHEnabled;
this.isCreditCardEnabled = elevateSettings.isCreditCardEnabled;
this.updateDisabledPaymentTypes();
}
} else {
this._savedGatewayNotFound = true;
this.handleErrors();
Expand Down Expand Up @@ -291,10 +295,10 @@ export default class GeGatewaySelectWidget extends LightningElement {

updateDisabledPaymentTypes() {
if (!this.isACHAvailableFor(this.selectedGateway)) {
this.isACHDisabled = true;
this.isACHUnavailable = true;
}
if (!this.isCreditCardAvailableFor(this.selectedGateway)) {
this.isCreditCardDisabled = true;
this.isCreditCardUnavailable = true;
}
}

Expand All @@ -311,20 +315,20 @@ export default class GeGatewaySelectWidget extends LightningElement {
updateACHSettings() {
if (!this.isACHAvailableFor(this.selectedGateway)) {
this.isACHEnabled = false;
this.isACHDisabled = true;
this.isACHUnavailable = true;
}
else {
this.isACHDisabled = false;
this.isACHUnavailable = false;
}
}

updateCreditCardSettings() {
if (!this.isCreditCardAvailableFor(this.selectedGateway)) {
this.isCreditCardEnabled = false;
this.isCreditCardDisabled = true;
this.isCreditCardUnavailable = true;
}
else {
this.isCreditCardDisabled = false;
this.isCreditCardUnavailable = false;
}
}

Expand Down Expand Up @@ -353,9 +357,9 @@ export default class GeGatewaySelectWidget extends LightningElement {
this.selectedGateway = null;
this.gatewayOptions = [];
this.isACHEnabled = true;
this.isACHDisabled = false;
this.isACHUnavailable = false;
this.isCreditCardEnabled = true;
this.isCreditCardDisabled = false;
this.isCreditCardUnavailable = false;
}

enableGatewaySelection() {
Expand Down

0 comments on commit 15858f0

Please sign in to comment.