diff --git a/force-app/main/default/lwc/__tests__/data/apexError.json b/force-app/main/default/lwc/__tests__/data/apexError.json new file mode 100644 index 000000000..fa3f27887 --- /dev/null +++ b/force-app/main/default/lwc/__tests__/data/apexError.json @@ -0,0 +1,6 @@ +{ + "body": { "message": "An internal server error has occurred" }, + "ok": false, + "status": 400, + "statusText": "Bad Request" +} diff --git a/force-app/main/default/lwc/__tests__/lightning/uiRecordApi.js b/force-app/main/default/lwc/__tests__/lightning/uiRecordApi.js new file mode 100644 index 000000000..1db4367bd --- /dev/null +++ b/force-app/main/default/lwc/__tests__/lightning/uiRecordApi.js @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018, salesforce.com, inc. + * All rights reserved. + * SPDX-License-Identifier: MIT + * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT + */ +export const getRecord = jest.fn(); +export const getRecordCreateDefaults = jest.fn(); +export const updateRecord = jest.fn(); +export const createRecord = jest.fn().mockResolvedValue({}); +export const deleteRecord = jest.fn().mockResolvedValue(); +export const generateRecordInputForCreate = jest.fn(); +export const generateRecordInputForUpdate = jest.fn(); +export const createRecordInputFilteredByEditedFields = jest.fn(); +export const getRecordInput = jest.fn(); +export const refresh = jest.fn().mockResolvedValue(); +export const getRecordUi = jest.fn(); +export const getFieldValue = jest.fn((data, fieldReference) => { + if (data) { + const fields = fieldReference.fieldApiName.split("."); + if (data.result) { + const fieldData = fields.reduce((o, i) => o[i], data.result.fields); + if (fieldData && fieldData.value) { + return fieldData.value; + } + } else { + const fieldData = fields.reduce((o, i) => o[i], data.fields); + if (fieldData && fieldData.value) { + return fieldData.value; + } + } + return null; + } + return null; +}); +export const getFieldDisplayValue = jest.fn(); diff --git a/force-app/main/default/lwc/accordionSection/__tests__/accordionSection.test.js b/force-app/main/default/lwc/accordionSection/__tests__/accordionSection.test.js new file mode 100644 index 000000000..4f66a2b93 --- /dev/null +++ b/force-app/main/default/lwc/accordionSection/__tests__/accordionSection.test.js @@ -0,0 +1,113 @@ +/* + * + * * Copyright (c) 2020, salesforce.com, inc. + * * All rights reserved. + * * SPDX-License-Identifier: BSD-3-Clause + * * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * + */ + +import { createElement } from "lwc"; +import AccordionSection from "c/accordionSection"; + +describe("c-accordionSection", () => { + let element; + + afterEach(global.clearDOM); + + beforeEach(() => { + element = createElement("c-accordionSection", { + is: AccordionSection, + }); + }); + + it("is closed by default", () => { + document.body.appendChild(element); + + return global.flushPromises().then(() => { + const button = element.shadowRoot.querySelector("button"); + expect(button.ariaExpanded).toBe("false"); + return global.isAccessible(element); + }); + }); + + it("is open when open current section is true", () => { + element.openCurrentSection = true; + document.body.appendChild(element); + + return global.flushPromises().then(() => { + const button = element.shadowRoot.querySelector("button"); + expect(button.ariaExpanded).toBe("true"); + return global.isAccessible(element); + }); + }); + + it("is accessible with background shaded", () => { + element.shadeOnOpen = "#EFEFEF"; + element.openCurrentSection = true; + document.body.appendChild(element); + + return global.flushPromises().then(() => { + // TODO: see if we can verify background color + return global.isAccessible(element); + }); + }); + + it("opens", () => { + document.body.appendChild(element); + element.open(); + + return global.flushPromises().then(() => { + const button = element.shadowRoot.querySelector("button"); + expect(button.ariaExpanded).toBe("true"); + return global.isAccessible(element); + }); + }); + + it("closes", () => { + element.openCurrentSection = true; + document.body.appendChild(element); + element.close(); + + return global.flushPromises().then(() => { + const button = element.shadowRoot.querySelector("button"); + expect(button.ariaExpanded).toBe("false"); + return global.isAccessible(element); + }); + }); + + it("does not open when prevent toggle is set", () => { + element.preventToggle = true; + document.body.appendChild(element); + element.open(); + + return global.flushPromises().then(() => { + const button = element.shadowRoot.querySelector("button"); + expect(button.ariaExpanded).toBe("false"); + return global.isAccessible(element); + }); + }); + + it("override open overrides prevent toggle and opens", () => { + element.preventToggle = true; + document.body.appendChild(element); + element.overrideOpen(); + + return global.flushPromises().then(() => { + const button = element.shadowRoot.querySelector("button"); + expect(button.ariaExpanded).toBe("true"); + return global.isAccessible(element); + }); + }); + + it("opens on button click", () => { + document.body.appendChild(element); + const button = element.shadowRoot.querySelector("button"); + button.click(); + + return global.flushPromises().then(() => { + expect(button.ariaExpanded).toBe("true"); + return global.isAccessible(element); + }); + }); +}); diff --git a/force-app/main/default/lwc/accordionSection/accordionSection.html b/force-app/main/default/lwc/accordionSection/accordionSection.html index 2c435e652..9706a17d3 100644 --- a/force-app/main/default/lwc/accordionSection/accordionSection.html +++ b/force-app/main/default/lwc/accordionSection/accordionSection.html @@ -1,3 +1,4 @@ +