mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-14 18:01:06 +00:00
test(breakpoint): add unit tests
This commit is contained in:
parent
67df81eac9
commit
1ba777ade8
5 changed files with 174 additions and 28 deletions
|
@ -1,28 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import {
|
|
||||||
Breakpoint,
|
|
||||||
breakpointObserver,
|
|
||||||
breakpoints,
|
|
||||||
} from "carbon-components-svelte";
|
|
||||||
import type { BreakpointProps } from "carbon-components-svelte/Breakpoint/Breakpoint.svelte";
|
|
||||||
|
|
||||||
let size: BreakpointProps["size"];
|
|
||||||
|
|
||||||
const sizeObserver = breakpointObserver();
|
|
||||||
const smaller = sizeObserver.smallerThan("md");
|
|
||||||
const larger = sizeObserver.largerThan("md");
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{smaller}
|
|
||||||
{larger}
|
|
||||||
{breakpoints.md}
|
|
||||||
|
|
||||||
<Breakpoint
|
|
||||||
bind:size
|
|
||||||
let:size={currentSize}
|
|
||||||
on:change={(e) => {
|
|
||||||
console.log(e.detail);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{currentSize}
|
|
||||||
</Breakpoint>
|
|
28
tests/Breakpoint/Breakpoint.test.svelte
Normal file
28
tests/Breakpoint/Breakpoint.test.svelte
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { Breakpoint } from "carbon-components-svelte";
|
||||||
|
import type { BreakpointSize } from "carbon-components-svelte/Breakpoint/breakpoints";
|
||||||
|
|
||||||
|
export let size: BreakpointSize | undefined = undefined;
|
||||||
|
export let sizes: Record<BreakpointSize, boolean> = {
|
||||||
|
sm: false,
|
||||||
|
md: false,
|
||||||
|
lg: false,
|
||||||
|
xlg: false,
|
||||||
|
max: false,
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Breakpoint
|
||||||
|
bind:size
|
||||||
|
bind:sizes
|
||||||
|
on:change
|
||||||
|
let:size={currentSize}
|
||||||
|
let:sizes={currentSizes}
|
||||||
|
>
|
||||||
|
<div data-testid="current-size">{currentSize}</div>
|
||||||
|
<div data-testid="is-sm">{currentSizes.sm}</div>
|
||||||
|
<div data-testid="is-md">{currentSizes.md}</div>
|
||||||
|
<div data-testid="is-lg">{currentSizes.lg}</div>
|
||||||
|
<div data-testid="is-xlg">{currentSizes.xlg}</div>
|
||||||
|
<div data-testid="is-max">{currentSizes.max}</div>
|
||||||
|
</Breakpoint>
|
116
tests/Breakpoint/Breakpoint.test.ts
Normal file
116
tests/Breakpoint/Breakpoint.test.ts
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
import { render, screen } from "@testing-library/svelte";
|
||||||
|
import Breakpoint from "./Breakpoint.test.svelte";
|
||||||
|
import BreakpointObserver from "./BreakpointObserver.test.svelte";
|
||||||
|
import Breakpoints from "./Breakpoints.test.svelte";
|
||||||
|
|
||||||
|
describe("Breakpoint", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.useFakeTimers();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
vi.unstubAllGlobals();
|
||||||
|
vi.useRealTimers();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("renders and detects breakpoint size", () => {
|
||||||
|
vi.stubGlobal("matchMedia", (query: string) => ({
|
||||||
|
matches: query.includes("(min-width: 1056px) and (max-width: 1312px)"),
|
||||||
|
media: query,
|
||||||
|
addEventListener: vi.fn(),
|
||||||
|
removeEventListener: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
render(Breakpoint);
|
||||||
|
|
||||||
|
expect(screen.getByTestId("current-size").textContent).toBe("lg");
|
||||||
|
expect(screen.getByTestId("is-sm").textContent).toBe("false");
|
||||||
|
expect(screen.getByTestId("is-md").textContent).toBe("false");
|
||||||
|
expect(screen.getByTestId("is-lg").textContent).toBe("true");
|
||||||
|
expect(screen.getByTestId("is-xlg").textContent).toBe("false");
|
||||||
|
expect(screen.getByTestId("is-max").textContent).toBe("false");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("updates when window size changes", async () => {
|
||||||
|
const mockChangeHandler = vi.fn();
|
||||||
|
const mediaQueryListeners = new Map();
|
||||||
|
|
||||||
|
vi.stubGlobal("matchMedia", (query: string) => {
|
||||||
|
const isLgQuery = query.includes(
|
||||||
|
"(min-width: 1056px) and (max-width: 1312px)",
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
matches: isLgQuery,
|
||||||
|
media: query,
|
||||||
|
addEventListener: (event: string, listener: MediaQueryList) => {
|
||||||
|
if (!mediaQueryListeners.has(query)) {
|
||||||
|
mediaQueryListeners.set(query, []);
|
||||||
|
}
|
||||||
|
mediaQueryListeners.get(query).push({ event, listener });
|
||||||
|
},
|
||||||
|
removeEventListener: vi.fn(),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const { component } = render(Breakpoint);
|
||||||
|
component.$on("change", mockChangeHandler);
|
||||||
|
|
||||||
|
expect(screen.getByTestId("current-size").textContent).toBe("lg");
|
||||||
|
mockChangeHandler.mockClear();
|
||||||
|
|
||||||
|
for (const [query, listeners] of mediaQueryListeners.entries()) {
|
||||||
|
const isXlgQuery = query.includes(
|
||||||
|
"(min-width: 1312px) and (max-width: 1584px)",
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const { event, listener } of listeners) {
|
||||||
|
if (event === "change") {
|
||||||
|
listener({ matches: isXlgQuery, media: query });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await vi.runOnlyPendingTimersAsync();
|
||||||
|
|
||||||
|
expect(mockChangeHandler).toHaveBeenCalled();
|
||||||
|
|
||||||
|
component.$set({
|
||||||
|
size: "xlg",
|
||||||
|
sizes: {
|
||||||
|
sm: false,
|
||||||
|
md: false,
|
||||||
|
lg: false,
|
||||||
|
xlg: true,
|
||||||
|
max: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(screen.getByTestId("current-size").textContent).toBe("xlg");
|
||||||
|
expect(screen.getByTestId("is-xlg").textContent).toBe("true");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("provides breakpointObserver utilities", () => {
|
||||||
|
vi.stubGlobal("matchMedia", (query: string) => ({
|
||||||
|
matches: query.includes("(min-width: 1056px) and (max-width: 1312px)"),
|
||||||
|
media: query,
|
||||||
|
addEventListener: vi.fn(),
|
||||||
|
removeEventListener: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
render(BreakpointObserver);
|
||||||
|
|
||||||
|
expect(screen.getByTestId("smaller-than-md").textContent).toBe("false");
|
||||||
|
expect(screen.getByTestId("larger-than-md").textContent).toBe("true");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("exposes breakpoint values", () => {
|
||||||
|
render(Breakpoints);
|
||||||
|
|
||||||
|
expect(screen.getByTestId("sm").textContent).toBe("320");
|
||||||
|
expect(screen.getByTestId("md").textContent).toBe("672");
|
||||||
|
expect(screen.getByTestId("lg").textContent).toBe("1056");
|
||||||
|
expect(screen.getByTestId("xlg").textContent).toBe("1312");
|
||||||
|
expect(screen.getByTestId("max").textContent).toBe("1584");
|
||||||
|
});
|
||||||
|
});
|
21
tests/Breakpoint/BreakpointObserver.test.svelte
Normal file
21
tests/Breakpoint/BreakpointObserver.test.svelte
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { breakpointObserver } from "carbon-components-svelte";
|
||||||
|
|
||||||
|
export let smallerThanMd = false;
|
||||||
|
export let largerThanMd = false;
|
||||||
|
|
||||||
|
const observer = breakpointObserver();
|
||||||
|
const smallerThan = observer.smallerThan("md");
|
||||||
|
const largerThan = observer.largerThan("md");
|
||||||
|
|
||||||
|
smallerThan.subscribe((value) => {
|
||||||
|
smallerThanMd = value;
|
||||||
|
});
|
||||||
|
|
||||||
|
largerThan.subscribe((value) => {
|
||||||
|
largerThanMd = value;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div data-testid="smaller-than-md">{smallerThanMd}</div>
|
||||||
|
<div data-testid="larger-than-md">{largerThanMd}</div>
|
9
tests/Breakpoint/Breakpoints.test.svelte
Normal file
9
tests/Breakpoint/Breakpoints.test.svelte
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { breakpoints } from "carbon-components-svelte";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div data-testid="sm">{breakpoints.sm}</div>
|
||||||
|
<div data-testid="md">{breakpoints.md}</div>
|
||||||
|
<div data-testid="lg">{breakpoints.lg}</div>
|
||||||
|
<div data-testid="xlg">{breakpoints.xlg}</div>
|
||||||
|
<div data-testid="max">{breakpoints.max}</div>
|
Loading…
Add table
Add a link
Reference in a new issue