Skip to content

test(commonTests, alert, combobox, dropdown, input-date-picker, modal, popover, tooltip): extracts a general test utility OpenClose for all components implementing openCloseComponent util #7379

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

Merged
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
04f2697
test(commonTests): extracts a general test utility emitsOpenCloseTran…
Elijbet Jul 25, 2023
57d3038
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Jul 25, 2023
b25d73e
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Jul 27, 2023
16ed200
refactor to simplify var and test names and to eliminate repetitive code
Elijbet Jul 27, 2023
d4b1978
add extra checks and move selectors to resources to avoid hard coding
Elijbet Jul 27, 2023
dfbc66e
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Jul 27, 2023
858848f
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 4, 2023
7307dda
Split into 2 test coverages for with and without animation and refact…
Elijbet Aug 4, 2023
1dd336b
get the initial value of toggleProp dynamically and toggle accordingly
Elijbet Aug 4, 2023
00ba742
assume the element will be visible (or not visible) to avoid checking…
Elijbet Aug 4, 2023
01d09d6
wire up this helper in comobobox and alert
Elijbet Aug 4, 2023
136c9dc
rename HTML block
Elijbet Aug 4, 2023
c304d33
cleanup
Elijbet Aug 4, 2023
1979adf
add modal test imports of openClose util: regular use case and when i…
Elijbet Aug 4, 2023
4d6d984
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 4, 2023
bb73ff5
applied to popover, to-do: fix failing tests with disabled animation
Elijbet Aug 5, 2023
4d1ae22
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 7, 2023
13a0f1f
fix for popover
Elijbet Aug 7, 2023
bb3e086
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 7, 2023
62ba3bd
add tooltip tests for checking openClose emits via prop as well as us…
Elijbet Aug 8, 2023
0b4737e
userInputDevice - Optional argument with functions to simulate user i…
Elijbet Aug 8, 2023
3b08700
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 8, 2023
4e6caad
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 8, 2023
5728d42
modify test for
Elijbet Aug 8, 2023
b805d7c
resolve merge
Elijbet Aug 15, 2023
8d28259
cleanups and refactors
Elijbet Aug 15, 2023
c8774f5
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 15, 2023
59a3ee7
cleanups and refactors
Elijbet Aug 15, 2023
8d99c26
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 15, 2023
fb3a2ce
Refactor the commonTest util to include newProgrammaticE2EPage setup …
Elijbet Aug 16, 2023
228035a
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 16, 2023
49814ec
merge
Elijbet Aug 29, 2023
bd76e7c
worked out merge conflicts
Elijbet Aug 29, 2023
c162352
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 29, 2023
d31d215
WIP: cleanup
Elijbet Aug 30, 2023
8f5588a
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Aug 30, 2023
90390fb
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 4, 2023
7984977
revert unrelated eslint change
Elijbet Sep 4, 2023
c061a29
refactors
Elijbet Sep 4, 2023
0524a93
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 6, 2023
4048fe5
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 6, 2023
3afe7c7
simplify util by extracting a OpenCloseOptions interface
Elijbet Sep 6, 2023
967d2eb
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 7, 2023
07c0b55
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 7, 2023
2fc3686
merge conflicts
Elijbet Sep 11, 2023
66ed1a9
rename togglePropName to openPropName; since the pattern use open/clo…
Elijbet Sep 11, 2023
39d4518
rename togglePropName to openPropName; since the pattern use open/clo…
Elijbet Sep 11, 2023
e82808b
rename userInputDevice to inputOptions
Elijbet Sep 11, 2023
f3d01b3
revert
Elijbet Sep 11, 2023
c4c3ade
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 13, 2023
536e87d
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 18, 2023
62aa8a0
refactor openClose call signature in the individual test and add a mo…
Elijbet Sep 19, 2023
1ac7257
for methods, use setUp (verb) vs setup (noun) convention
Elijbet Sep 19, 2023
f19a24c
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 19, 2023
7d3f147
Shorten comment
Elijbet Sep 19, 2023
fe48292
Merge branch 'main' into elijbet/4968-add-common-test-util-for-all-Op…
Elijbet Sep 19, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 24 additions & 63 deletions packages/calcite-components/src/components/dropdown/dropdown.e2e.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
import { E2EPage, newE2EPage } from "@stencil/core/testing";
import dedent from "dedent";
import { html } from "../../../support/formatting";
import { focusable, accessible, defaults, disabled, floatingUIOwner, hidden, renders } from "../../tests/commonTests";
import {
focusable,
accessible,
defaults,
disabled,
floatingUIOwner,
hidden,
renders,
emitsOpenCloseTransitionChainedEvents,
} from "../../tests/commonTests";
import { GlobalTestProps } from "../../tests/utils";
import { CSS } from "./resources";

const simpleDropdownHTML = html`<calcite-dropdown>
<calcite-button slot="trigger">Open dropdown</calcite-button>
<calcite-dropdown-group id="group-1">
<calcite-dropdown-item id="item-1"> Dropdown Item Content </calcite-dropdown-item>
<calcite-dropdown-item id="item-2" selected> Dropdown Item Content </calcite-dropdown-item>
<calcite-dropdown-item id="item-3"> Dropdown Item Content </calcite-dropdown-item>
</calcite-dropdown-group>
</calcite-dropdown>`;
const simpleDropdownHTML = html`
<calcite-dropdown>
<calcite-button slot="trigger">Open dropdown</calcite-button>
<calcite-dropdown-group id="group-1">
<calcite-dropdown-item id="item-1"> Dropdown Item Content </calcite-dropdown-item>
<calcite-dropdown-item id="item-2" selected> Dropdown Item Content </calcite-dropdown-item>
<calcite-dropdown-item id="item-3"> Dropdown Item Content </calcite-dropdown-item>
</calcite-dropdown-group>
</calcite-dropdown>
`;

describe("calcite-dropdown", () => {
describe("focusable", () => {
Expand Down Expand Up @@ -51,6 +61,10 @@ describe("calcite-dropdown", () => {
});
});

describe("emitsOpenCloseTransitionChainedEvents", () => {
emitsOpenCloseTransitionChainedEvents(simpleDropdownHTML, "open", ".container");
});

interface SelectedItemsAssertionOptions {
/**
* IDs from items to assert selection
Expand Down Expand Up @@ -1097,57 +1111,4 @@ describe("calcite-dropdown", () => {
}
);
});

it("should emit component status for transition-chained events: 'calciteDropdownBeforeOpen', 'calciteDropdownOpen', 'calciteDropdownBeforeClose', 'calciteDropdownClose'", async () => {
const page = await newE2EPage();
await page.setContent(html`
<calcite-dropdown>
<calcite-button slot="trigger">Open dropdown</calcite-button>
<calcite-dropdown-group id="group-1">
<calcite-dropdown-item id="item-1"> Dropdown Item Content </calcite-dropdown-item>
<calcite-dropdown-item id="item-2" selected> Dropdown Item Content </calcite-dropdown-item>
<calcite-dropdown-item id="item-3"> Dropdown Item Content </calcite-dropdown-item>
</calcite-dropdown-group>
</calcite-dropdown>
`);
const element = await page.find(`calcite-dropdown`);
const group = await page.find(`calcite-dropdown >>> .${CSS.calciteDropdownContent}`);

expect(await group.isVisible()).toBe(false);

const calciteDropdownBeforeOpenEvent = page.waitForEvent("calciteDropdownBeforeOpen");
const calciteDropdownOpenEvent = page.waitForEvent("calciteDropdownOpen");

const calciteDropdownBeforeOpenSpy = await element.spyOnEvent("calciteDropdownBeforeOpen");
const calciteDropdownOpenSpy = await element.spyOnEvent("calciteDropdownOpen");

element.setProperty("open", true);
await page.waitForChanges();

expect(await element.getProperty("open")).toBe(true);
await calciteDropdownBeforeOpenEvent;
await calciteDropdownOpenEvent;

expect(calciteDropdownBeforeOpenSpy).toHaveReceivedEventTimes(1);
expect(calciteDropdownOpenSpy).toHaveReceivedEventTimes(1);

expect(await group.isVisible()).toBe(true);

const calciteDropdownBeforeCloseEvent = page.waitForEvent("calciteDropdownBeforeClose");
const calciteDropdownCloseEvent = page.waitForEvent("calciteDropdownClose");

const calciteDropdownBeforeCloseSpy = await element.spyOnEvent("calciteDropdownBeforeClose");
const calciteDropdownCloseSpy = await element.spyOnEvent("calciteDropdownClose");

element.setProperty("open", false);
await page.waitForChanges();

await calciteDropdownBeforeCloseEvent;
await calciteDropdownCloseEvent;

expect(calciteDropdownBeforeCloseSpy).toHaveReceivedEventTimes(1);
expect(calciteDropdownCloseSpy).toHaveReceivedEventTimes(1);

expect(await group.isVisible()).toBe(false);
});
});
64 changes: 64 additions & 0 deletions packages/calcite-components/src/tests/commonTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1323,3 +1323,67 @@ export async function t9n(componentTestSetup: ComponentTestSetup): Promise<void>
await page.waitForChanges();
}
}

/*
* @param {ComponentTestSetup} ComponentTestSetup - A component tag, html, or the tag and e2e page for setting up a test.
* @param {string} toggleProp - Toggle property to test. Currently, either "open" or "expanded".
* @param {string} containerSelector - Container element selector to test for visibility.
*
* @example
* import { emitsOpenCloseTransitionChainedEvents } from "../../tests/commonTests";
*
* describe("emitsOpenCloseTransitionChainedEvents", () => {
* emitsOpenCloseTransitionChainedEvents("calcite-dropdown", "open", ".container");
* });
*
*/
export function emitsOpenCloseTransitionChainedEvents(
componentTestSetup: ComponentTestSetup,
toggleProp: string,
containerSelector: string
): void {
it(`should emit component status for transition-chained events: 'calciteComponentBeforeOpen', 'calciteComponentOpen', 'calciteComponentBeforeClose', 'calciteComponentClose'`, async () => {
const { page, tag } = await getTagAndPage(componentTestSetup);
await page.setContent(`${componentTestSetup}`);
const element = await page.find(tag);

const camelCaseTag = tag.replace(/-([a-z])/g, (g) => g[1].toUpperCase());

const beforeOpenEvent = page.waitForEvent(`${camelCaseTag}BeforeOpen`);
const openEvent = page.waitForEvent(`${camelCaseTag}Open`);

const beforeOpenSpy = await element.spyOnEvent(`${camelCaseTag}BeforeOpen`);
const openSpy = await element.spyOnEvent(`${camelCaseTag}Open`);

const beforeCloseEvent = page.waitForEvent(`${camelCaseTag}BeforeClose`);
const closeEvent = page.waitForEvent(`${camelCaseTag}Close`);

const beforeCloseSpy = await element.spyOnEvent(`${camelCaseTag}BeforeClose`);
const closeSpy = await element.spyOnEvent(`${camelCaseTag}Close`);

element.setProperty(toggleProp, true);
await page.waitForChanges();

const container = await page.find(`calcite-dropdown-group >>> ${containerSelector}`);
await page.waitForChanges();

expect(await container.isVisible()).toBe(true);

await beforeOpenEvent;
await openEvent;

expect(beforeOpenSpy).toHaveReceivedEventTimes(1);
expect(openSpy).toHaveReceivedEventTimes(1);

element.setProperty(toggleProp, false);
await page.waitForChanges();

expect(await container.isVisible()).toBe(false);

await beforeCloseEvent;
await closeEvent;

expect(beforeCloseSpy).toHaveReceivedEventTimes(1);
expect(closeSpy).toHaveReceivedEventTimes(1);
});
}