c4a631a5d8
CI Pipeline / test (20) (pull_request) Successful in 2m55s
CI Pipeline / test (18) (pull_request) Successful in 3m32s
CI Pipeline / e2e (webkit) (pull_request) Has been cancelled
CI Pipeline / visual-regression (pull_request) Has been cancelled
CI Pipeline / performance (pull_request) Has been cancelled
CI Pipeline / storybook (pull_request) Has been cancelled
CI Pipeline / lint (pull_request) Has been cancelled
CI Pipeline / build (pull_request) Has been cancelled
CI Pipeline / e2e (chromium) (pull_request) Has been cancelled
CI Pipeline / e2e (firefox) (pull_request) Has been cancelled
281 lines
8.7 KiB
TypeScript
281 lines
8.7 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
|
|
test.describe("Select Component Storybook Tests", () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.goto("http://localhost:6006/?path=/story/forms-select--default");
|
|
});
|
|
|
|
test("renders default select component", async ({ page }) => {
|
|
const selectButton = page.getByRole("button", { name: /select/i });
|
|
await expect(selectButton).toBeVisible();
|
|
|
|
const label = page.getByText("Test Select");
|
|
await expect(label).toBeVisible();
|
|
});
|
|
|
|
test("opens dropdown when clicked", async ({ page }) => {
|
|
const selectButton = page.getByRole("button", { name: /select/i });
|
|
await selectButton.click();
|
|
|
|
// Wait for dropdown to appear
|
|
await expect(page.getByRole("listbox")).toBeVisible();
|
|
await expect(page.getByText("Option 1")).toBeVisible();
|
|
await expect(page.getByText("Option 2")).toBeVisible();
|
|
await expect(page.getByText("Option 3")).toBeVisible();
|
|
});
|
|
|
|
test("selects option when clicked", async ({ page }) => {
|
|
const selectButton = page.getByRole("button", { name: /select/i });
|
|
await selectButton.click();
|
|
|
|
await expect(page.getByRole("listbox")).toBeVisible();
|
|
|
|
await page.getByText("Option 1").click();
|
|
|
|
// Check that the selected value is displayed
|
|
await expect(selectButton).toContainText("Option 1");
|
|
|
|
// Check that dropdown is closed
|
|
await expect(page.getByRole("listbox")).not.toBeVisible();
|
|
});
|
|
|
|
test("closes dropdown when clicking outside", async ({ page }) => {
|
|
const selectButton = page.getByRole("button", { name: /select/i });
|
|
await selectButton.click();
|
|
|
|
await expect(page.getByRole("listbox")).toBeVisible();
|
|
|
|
// Click outside the dropdown
|
|
await page.click("body", { position: { x: 10, y: 10 } });
|
|
|
|
await expect(page.getByRole("listbox")).not.toBeVisible();
|
|
});
|
|
|
|
test("handles keyboard navigation", async ({ page }) => {
|
|
const selectButton = page.getByRole("button", { name: /select/i });
|
|
await selectButton.focus();
|
|
|
|
// Open with Enter key
|
|
await page.keyboard.press("Enter");
|
|
await expect(page.getByRole("listbox")).toBeVisible();
|
|
|
|
// Close with Escape key
|
|
await page.keyboard.press("Escape");
|
|
await expect(page.getByRole("listbox")).not.toBeVisible();
|
|
|
|
// Open with Space key
|
|
await page.keyboard.press(" ");
|
|
await expect(page.getByRole("listbox")).toBeVisible();
|
|
});
|
|
|
|
test("shows different sizes correctly", async ({ page }) => {
|
|
// Navigate to All Sizes story
|
|
await page.goto(
|
|
"http://localhost:6006/?path=/story/forms-select--all-sizes",
|
|
);
|
|
|
|
const selectButtons = page.getByRole("button");
|
|
const count = await selectButtons.count();
|
|
|
|
// Should have multiple select components
|
|
expect(count).toBeGreaterThan(1);
|
|
|
|
// Test that all sizes are visible
|
|
for (let i = 0; i < count; i++) {
|
|
await expect(selectButtons.nth(i)).toBeVisible();
|
|
}
|
|
});
|
|
|
|
test("shows different states correctly", async ({ page }) => {
|
|
// Navigate to All States story
|
|
await page.goto(
|
|
"http://localhost:6006/?path=/story/forms-select--all-states",
|
|
);
|
|
|
|
const selectButtons = page.getByRole("button");
|
|
const count = await selectButtons.count();
|
|
|
|
// Should have multiple select components in different states
|
|
expect(count).toBeGreaterThan(1);
|
|
|
|
// Test that all states are visible
|
|
for (let i = 0; i < count; i++) {
|
|
await expect(selectButtons.nth(i)).toBeVisible();
|
|
}
|
|
});
|
|
|
|
test("hover state shows correct styling", async ({ page }) => {
|
|
// Navigate to Hover story
|
|
await page.goto("http://localhost:6006/?path=/story/forms-select--hover");
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await expect(selectButton).toBeVisible();
|
|
|
|
// Check that hover state is applied (shadow effect)
|
|
const boxShadow = await selectButton.evaluate((el) => {
|
|
const styles = window.getComputedStyle(el);
|
|
return styles.boxShadow;
|
|
});
|
|
|
|
expect(boxShadow).toContain("2px");
|
|
});
|
|
|
|
test("focus state shows correct styling", async ({ page }) => {
|
|
// Navigate to Focus story
|
|
await page.goto("http://localhost:6006/?path=/story/forms-select--focus");
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await expect(selectButton).toBeVisible();
|
|
|
|
// Check that focus state is applied (blue border and shadow)
|
|
const borderColor = await selectButton.evaluate((el) => {
|
|
const styles = window.getComputedStyle(el);
|
|
return styles.borderColor;
|
|
});
|
|
|
|
const boxShadow = await selectButton.evaluate((el) => {
|
|
const styles = window.getComputedStyle(el);
|
|
return styles.boxShadow;
|
|
});
|
|
|
|
expect(boxShadow).toContain("3px");
|
|
});
|
|
|
|
test("error state shows correct styling", async ({ page }) => {
|
|
// Navigate to Error story
|
|
await page.goto("http://localhost:6006/?path=/story/forms-select--error");
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await expect(selectButton).toBeVisible();
|
|
|
|
// Check that error state is applied (red border)
|
|
const borderColor = await selectButton.evaluate((el) => {
|
|
const styles = window.getComputedStyle(el);
|
|
return styles.borderColor;
|
|
});
|
|
|
|
expect(borderColor).toContain("rgb");
|
|
});
|
|
|
|
test("disabled state prevents interaction", async ({ page }) => {
|
|
// Navigate to Disabled story
|
|
await page.goto(
|
|
"http://localhost:6006/?path=/story/forms-select--disabled",
|
|
);
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await expect(selectButton).toBeVisible();
|
|
await expect(selectButton).toBeDisabled();
|
|
|
|
// Try to click disabled select
|
|
await selectButton.click();
|
|
|
|
// Dropdown should not open
|
|
await expect(page.getByRole("listbox")).not.toBeVisible();
|
|
});
|
|
|
|
test("interactive story allows selection", async ({ page }) => {
|
|
// Navigate to Interactive story
|
|
await page.goto(
|
|
"http://localhost:6006/?path=/story/forms-select--interactive",
|
|
);
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await selectButton.click();
|
|
|
|
await expect(page.getByRole("listbox")).toBeVisible();
|
|
|
|
// Select an option
|
|
await page.getByText("Option 1").click();
|
|
|
|
// Check that selection is reflected
|
|
await expect(selectButton).toContainText("Option 1");
|
|
});
|
|
|
|
test("horizontal label variant displays correctly", async ({ page }) => {
|
|
// Navigate to Horizontal Label story
|
|
await page.goto(
|
|
"http://localhost:6006/?path=/story/forms-select--horizontal-label",
|
|
);
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await expect(selectButton).toBeVisible();
|
|
|
|
const label = page.getByText("Test Select");
|
|
await expect(label).toBeVisible();
|
|
|
|
// Check that label and select are in horizontal layout
|
|
const labelBox = await label.boundingBox();
|
|
const selectBox = await selectButton.boundingBox();
|
|
|
|
expect(labelBox?.y).toBeCloseTo(selectBox?.y || 0, 5);
|
|
});
|
|
|
|
test("small size has correct height", async ({ page }) => {
|
|
// Navigate to Small story
|
|
await page.goto("http://localhost:6006/?path=/story/forms-select--small");
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await expect(selectButton).toBeVisible();
|
|
|
|
const height = await selectButton.evaluate((el) => {
|
|
const styles = window.getComputedStyle(el);
|
|
return styles.height;
|
|
});
|
|
|
|
expect(height).toBe("30px");
|
|
});
|
|
|
|
test("medium size has correct height", async ({ page }) => {
|
|
// Navigate to Medium story
|
|
await page.goto("http://localhost:6006/?path=/story/forms-select--medium");
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await expect(selectButton).toBeVisible();
|
|
|
|
const height = await selectButton.evaluate((el) => {
|
|
const styles = window.getComputedStyle(el);
|
|
return styles.height;
|
|
});
|
|
|
|
expect(height).toBe("36px");
|
|
});
|
|
|
|
test("large size has correct height", async ({ page }) => {
|
|
// Navigate to Large story
|
|
await page.goto("http://localhost:6006/?path=/story/forms-select--large");
|
|
|
|
const selectButton = page.getByRole("button");
|
|
await expect(selectButton).toBeVisible();
|
|
|
|
const height = await selectButton.evaluate((el) => {
|
|
const styles = window.getComputedStyle(el);
|
|
return styles.height;
|
|
});
|
|
|
|
expect(height).toBe("40px");
|
|
});
|
|
|
|
test("focus behavior works correctly", async ({ page }) => {
|
|
// Navigate to Interactive story
|
|
await page.goto(
|
|
"http://localhost:6006/?path=/story/forms-select--interactive",
|
|
);
|
|
|
|
const selectButton = page.getByRole("button");
|
|
|
|
// Tab to focus the select
|
|
await page.keyboard.press("Tab");
|
|
await expect(selectButton).toBeFocused();
|
|
|
|
// Check that focus-visible styles are applied
|
|
const boxShadow = await selectButton.evaluate((el) => {
|
|
const styles = window.getComputedStyle(el);
|
|
return styles.boxShadow;
|
|
});
|
|
|
|
// Should have focus indicator
|
|
expect(boxShadow).toContain("3px");
|
|
});
|
|
});
|