mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-14 18:01:06 +00:00
test(overflow-menu): add unit tests
This commit is contained in:
parent
88f4304d5a
commit
306e09961f
4 changed files with 120 additions and 81 deletions
|
@ -10,6 +10,7 @@
|
||||||
import RecursiveList from "./RecursiveList/RecursiveList.test.svelte";
|
import RecursiveList from "./RecursiveList/RecursiveList.test.svelte";
|
||||||
import RecursiveListHierarchy from "./RecursiveList/RecursiveList.hierarchy.test.svelte";
|
import RecursiveListHierarchy from "./RecursiveList/RecursiveList.hierarchy.test.svelte";
|
||||||
import Tag from "./Tag/Tag.test.svelte";
|
import Tag from "./Tag/Tag.test.svelte";
|
||||||
|
import OverflowMenu from "./OverflowMenu/OverflowMenu.test.svelte";
|
||||||
import { onMount } from "svelte";
|
import { onMount } from "svelte";
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
|
@ -63,6 +64,11 @@
|
||||||
name: "Tag",
|
name: "Tag",
|
||||||
component: Tag,
|
component: Tag,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/overflow-menu",
|
||||||
|
name: "OverflowMenu",
|
||||||
|
component: OverflowMenu,
|
||||||
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
let currentPath = window.location.pathname;
|
let currentPath = window.location.pathname;
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import { OverflowMenu, OverflowMenuItem } from "carbon-components-svelte";
|
|
||||||
import Add from "carbon-icons-svelte/lib/Add.svelte";
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<OverflowMenu
|
|
||||||
on:close={(e) => {
|
|
||||||
console.log(e.detail); // { index: number; text: string; }
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<OverflowMenuItem text="Manage credentials" />
|
|
||||||
<OverflowMenuItem
|
|
||||||
href="https://cloud.ibm.com/docs/api-gateway/"
|
|
||||||
text="API documentation"
|
|
||||||
/>
|
|
||||||
<OverflowMenuItem danger text="Delete service" />
|
|
||||||
</OverflowMenu>
|
|
||||||
|
|
||||||
<OverflowMenu open flipped>
|
|
||||||
<OverflowMenuItem text="Manage credentials" />
|
|
||||||
<OverflowMenuItem
|
|
||||||
href="https://cloud.ibm.com/docs/api-gateway/"
|
|
||||||
text="API documentation"
|
|
||||||
/>
|
|
||||||
<OverflowMenuItem danger text="Delete service" />
|
|
||||||
</OverflowMenu>
|
|
||||||
|
|
||||||
<OverflowMenu flipped direction="top">
|
|
||||||
<OverflowMenuItem text="Manage credentials" />
|
|
||||||
<OverflowMenuItem
|
|
||||||
href="https://cloud.ibm.com/docs/api-gateway/"
|
|
||||||
text="API documentation"
|
|
||||||
/>
|
|
||||||
<OverflowMenuItem danger text="Delete service" />
|
|
||||||
</OverflowMenu>
|
|
||||||
|
|
||||||
<OverflowMenu size="xl">
|
|
||||||
<OverflowMenuItem text="Manage credentials" />
|
|
||||||
<OverflowMenuItem
|
|
||||||
href="https://cloud.ibm.com/docs/api-gateway/"
|
|
||||||
text="API documentation"
|
|
||||||
/>
|
|
||||||
<OverflowMenuItem danger text="Delete service" />
|
|
||||||
</OverflowMenu>
|
|
||||||
|
|
||||||
<OverflowMenu size="sm">
|
|
||||||
<OverflowMenuItem text="Manage credentials" />
|
|
||||||
<OverflowMenuItem
|
|
||||||
href="https://cloud.ibm.com/docs/api-gateway/"
|
|
||||||
text="API documentation"
|
|
||||||
/>
|
|
||||||
<OverflowMenuItem danger text="Delete service" />
|
|
||||||
</OverflowMenu>
|
|
||||||
|
|
||||||
<OverflowMenu>
|
|
||||||
<OverflowMenuItem text="Manage credentials" />
|
|
||||||
<OverflowMenuItem
|
|
||||||
href="https://cloud.ibm.com/docs/api-gateway/"
|
|
||||||
text="API documentation"
|
|
||||||
/>
|
|
||||||
<OverflowMenuItem primaryFocus danger text="Delete service" />
|
|
||||||
</OverflowMenu>
|
|
||||||
|
|
||||||
<OverflowMenu icon={Add}>
|
|
||||||
<OverflowMenuItem text="Manage credentials" />
|
|
||||||
<OverflowMenuItem
|
|
||||||
href="https://cloud.ibm.com/docs/api-gateway/"
|
|
||||||
text="API documentation"
|
|
||||||
/>
|
|
||||||
<OverflowMenuItem danger text="Delete service" />
|
|
||||||
</OverflowMenu>
|
|
||||||
|
|
||||||
<OverflowMenu style="width: auto;">
|
|
||||||
<div slot="menu" style="padding: 1rem; color: red;">Custom trigger</div>
|
|
||||||
<OverflowMenuItem text="Manage credentials" />
|
|
||||||
<OverflowMenuItem
|
|
||||||
href="https://cloud.ibm.com/docs/api-gateway/"
|
|
||||||
text="API documentation"
|
|
||||||
/>
|
|
||||||
<OverflowMenuItem danger text="Delete service" />
|
|
||||||
</OverflowMenu>
|
|
30
tests/OverflowMenu/OverflowMenu.test.svelte
Normal file
30
tests/OverflowMenu/OverflowMenu.test.svelte
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { OverflowMenu, OverflowMenuItem } from "carbon-components-svelte";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<OverflowMenu
|
||||||
|
on:close={(e) => {
|
||||||
|
console.log("close", e.detail); // { index: number; text: string; }
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<OverflowMenuItem
|
||||||
|
text="Manage credentials"
|
||||||
|
on:click={() => {
|
||||||
|
console.log("click", "Manage credentials");
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<OverflowMenuItem
|
||||||
|
href="https://cloud.ibm.com/docs/api-gateway/"
|
||||||
|
text="API documentation"
|
||||||
|
on:click={() => {
|
||||||
|
console.log("click", "API documentation");
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<OverflowMenuItem
|
||||||
|
danger
|
||||||
|
text="Delete service"
|
||||||
|
on:click={() => {
|
||||||
|
console.log("click", "Delete service");
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</OverflowMenu>
|
84
tests/OverflowMenu/OverflowMenu.test.ts
Normal file
84
tests/OverflowMenu/OverflowMenu.test.ts
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
import { render, screen } from "@testing-library/svelte";
|
||||||
|
import { user } from "../setup-tests";
|
||||||
|
import OverflowMenu from "./OverflowMenu.test.svelte";
|
||||||
|
|
||||||
|
describe("OverflowMenu", () => {
|
||||||
|
it("renders and functions correctly", async () => {
|
||||||
|
render(OverflowMenu);
|
||||||
|
|
||||||
|
const menuButton = screen.getByRole("button");
|
||||||
|
expect(menuButton).toHaveAttribute("aria-haspopup", "true");
|
||||||
|
expect(menuButton).toHaveAttribute("aria-expanded", "false");
|
||||||
|
|
||||||
|
await user.click(menuButton);
|
||||||
|
expect(menuButton).toHaveAttribute("aria-expanded", "true");
|
||||||
|
|
||||||
|
const menuItems = screen.getAllByRole("menuitem");
|
||||||
|
expect(menuItems).toHaveLength(3);
|
||||||
|
expect(menuItems[0]).toHaveFocus();
|
||||||
|
|
||||||
|
expect(menuItems[0]).toHaveTextContent("Manage credentials");
|
||||||
|
expect(menuItems[1]).toHaveTextContent("API documentation");
|
||||||
|
expect(menuItems[2]).toHaveTextContent("Delete service");
|
||||||
|
|
||||||
|
expect(menuItems[1]).toHaveAttribute(
|
||||||
|
"href",
|
||||||
|
"https://cloud.ibm.com/docs/api-gateway/",
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(menuItems[2].parentElement).toHaveClass(
|
||||||
|
"bx--overflow-menu-options__option--danger",
|
||||||
|
);
|
||||||
|
|
||||||
|
const spy = vi.spyOn(console, "log");
|
||||||
|
await user.click(menuItems[0]);
|
||||||
|
expect(spy).toHaveBeenCalledWith("click", "Manage credentials");
|
||||||
|
|
||||||
|
expect(menuButton).toHaveAttribute("aria-expanded", "false");
|
||||||
|
expect(spy).toHaveBeenCalledWith("close", {
|
||||||
|
index: 0,
|
||||||
|
text: "Manage credentials",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("handles keyboard navigation", async () => {
|
||||||
|
render(OverflowMenu);
|
||||||
|
|
||||||
|
const spy = vi.spyOn(console, "log");
|
||||||
|
|
||||||
|
const menuButton = screen.getByRole("button");
|
||||||
|
await user.click(menuButton);
|
||||||
|
expect(menuButton).toHaveAttribute("aria-expanded", "true");
|
||||||
|
|
||||||
|
let menuItems = screen.getAllByRole("menuitem");
|
||||||
|
expect(menuItems[0]).toHaveFocus();
|
||||||
|
|
||||||
|
await user.keyboard("{ArrowDown}");
|
||||||
|
expect(menuItems[1]).toHaveFocus();
|
||||||
|
|
||||||
|
await user.keyboard("{Enter}");
|
||||||
|
expect(spy).toHaveBeenCalledWith("click", "API documentation");
|
||||||
|
|
||||||
|
await user.click(menuButton);
|
||||||
|
menuItems = screen.getAllByRole("menuitem");
|
||||||
|
expect(menuItems[0]).toHaveFocus();
|
||||||
|
|
||||||
|
await user.keyboard("{ArrowUp}");
|
||||||
|
expect(menuItems[2]).toHaveFocus();
|
||||||
|
|
||||||
|
await user.keyboard("{Escape}");
|
||||||
|
expect(menuButton).toHaveAttribute("aria-expanded", "false");
|
||||||
|
expect(spy).toHaveBeenCalledWith("close", null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("closes when clicking outside", async () => {
|
||||||
|
render(OverflowMenu);
|
||||||
|
|
||||||
|
const menuButton = screen.getByRole("button");
|
||||||
|
await user.click(menuButton);
|
||||||
|
expect(menuButton).toHaveAttribute("aria-expanded", "true");
|
||||||
|
|
||||||
|
await user.click(document.body);
|
||||||
|
expect(menuButton).toHaveAttribute("aria-expanded", "false");
|
||||||
|
});
|
||||||
|
});
|
Loading…
Add table
Add a link
Reference in a new issue