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
178 lines
6.2 KiB
JavaScript
178 lines
6.2 KiB
JavaScript
import { test, expect } from "@playwright/test";
|
|
|
|
test.describe("RadioButton Storybook Tests", () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.goto(
|
|
"http://localhost:6006/iframe.html?id=forms-radiobutton--default",
|
|
);
|
|
});
|
|
|
|
test("renders default story", async ({ page }) => {
|
|
const radioButton = page.locator('[role="radio"]');
|
|
await expect(radioButton).toBeVisible();
|
|
await expect(radioButton).toHaveAttribute("aria-checked", "false");
|
|
});
|
|
|
|
test("renders checked story", async ({ page }) => {
|
|
await page.goto(
|
|
"http://localhost:6006/iframe.html?id=forms-radiobutton--checked",
|
|
);
|
|
|
|
const radioButton = page.locator('[role="radio"]');
|
|
await expect(radioButton).toBeVisible();
|
|
await expect(radioButton).toHaveAttribute("aria-checked", "true");
|
|
});
|
|
|
|
test("renders standard story", async ({ page }) => {
|
|
await page.goto(
|
|
"http://localhost:6006/iframe.html?id=forms-radiobutton--standard",
|
|
);
|
|
|
|
const radioButtons = page.locator('[role="radio"]');
|
|
await expect(radioButtons).toHaveCount(2);
|
|
|
|
// First should be unchecked
|
|
await expect(radioButtons.first()).toHaveAttribute("aria-checked", "false");
|
|
// Second should be checked
|
|
await expect(radioButtons.nth(1)).toHaveAttribute("aria-checked", "true");
|
|
});
|
|
|
|
test("renders inverse story", async ({ page }) => {
|
|
await page.goto(
|
|
"http://localhost:6006/iframe.html?id=forms-radiobutton--inverse",
|
|
);
|
|
|
|
const radioButtons = page.locator('[role="radio"]');
|
|
await expect(radioButtons).toHaveCount(2);
|
|
|
|
// First should be unchecked
|
|
await expect(radioButtons.first()).toHaveAttribute("aria-checked", "false");
|
|
// Second should be checked
|
|
await expect(radioButtons.nth(1)).toHaveAttribute("aria-checked", "true");
|
|
});
|
|
|
|
test("interacts with controls", async ({ page }) => {
|
|
// Test checked control
|
|
await page.check('[data-testid="checked-control"]');
|
|
const radioButton = page.locator('[role="radio"]');
|
|
await expect(radioButton).toHaveAttribute("aria-checked", "true");
|
|
|
|
await page.uncheck('[data-testid="checked-control"]');
|
|
await expect(radioButton).toHaveAttribute("aria-checked", "false");
|
|
});
|
|
|
|
test("interacts with mode control", async ({ page }) => {
|
|
// Test mode control
|
|
await page.selectOption('[data-testid="mode-control"]', "inverse");
|
|
const radioButton = page.locator('[role="radio"]');
|
|
await expect(radioButton).toHaveClass(
|
|
/outline-\[var\(--color-border-inverse-primary\)\]/,
|
|
);
|
|
|
|
await page.selectOption('[data-testid="mode-control"]', "standard");
|
|
await expect(radioButton).toHaveClass(
|
|
/outline-\[var\(--color-border-default-tertiary\)\]/,
|
|
);
|
|
});
|
|
|
|
test("interacts with state control", async ({ page }) => {
|
|
// Test state control
|
|
await page.selectOption('[data-testid="state-control"]', "focus");
|
|
const radioButton = page.locator('[role="radio"]');
|
|
await expect(radioButton).toHaveClass(/focus:outline/);
|
|
|
|
await page.selectOption('[data-testid="state-control"]', "hover");
|
|
await expect(radioButton).toHaveClass(/hover:outline/);
|
|
});
|
|
|
|
test("interacts with label control", async ({ page }) => {
|
|
// Test label control
|
|
await page.fill('[data-testid="label-control"]', "Custom Label");
|
|
await expect(page.locator('text="Custom Label"')).toBeVisible();
|
|
});
|
|
|
|
test("handles keyboard interaction", async ({ page }) => {
|
|
const radioButton = page.locator('[role="radio"]');
|
|
await radioButton.focus();
|
|
await expect(radioButton).toBeFocused();
|
|
|
|
// Test Space key
|
|
await page.keyboard.press("Space");
|
|
await expect(radioButton).toHaveAttribute("aria-checked", "true");
|
|
|
|
// Test Enter key
|
|
await page.keyboard.press("Enter");
|
|
await expect(radioButton).toHaveAttribute("aria-checked", "false");
|
|
});
|
|
|
|
test("has proper accessibility attributes", async ({ page }) => {
|
|
const radioButton = page.locator('[role="radio"]');
|
|
|
|
await expect(radioButton).toHaveAttribute("role", "radio");
|
|
await expect(radioButton).toHaveAttribute("aria-checked");
|
|
await expect(radioButton).toHaveAttribute("tabIndex", "0");
|
|
});
|
|
|
|
test("shows dot indicator when checked", async ({ page }) => {
|
|
await page.check('[data-testid="checked-control"]');
|
|
|
|
const radioButton = page.locator('[role="radio"]');
|
|
const dot = radioButton.locator("div").first();
|
|
await expect(dot).toHaveClass(/w-\[16px\]/, /h-\[16px\]/, /rounded-full/);
|
|
});
|
|
|
|
test("hides dot indicator when unchecked", async ({ page }) => {
|
|
await page.uncheck('[data-testid="checked-control"]');
|
|
|
|
const radioButton = page.locator('[role="radio"]');
|
|
const dot = radioButton.locator("div").first();
|
|
await expect(dot).toHaveCSS("background-color", "rgba(0, 0, 0, 0)");
|
|
});
|
|
|
|
test("maintains focus state", async ({ page }) => {
|
|
const radioButton = page.locator('[role="radio"]');
|
|
await radioButton.focus();
|
|
await expect(radioButton).toBeFocused();
|
|
|
|
// Should maintain focus after interaction
|
|
await page.keyboard.press("Space");
|
|
await expect(radioButton).toBeFocused();
|
|
});
|
|
|
|
test("handles mouse interaction", async ({ page }) => {
|
|
const radioButton = page.locator('[role="radio"]');
|
|
|
|
// Click to check
|
|
await radioButton.click();
|
|
await expect(radioButton).toHaveAttribute("aria-checked", "true");
|
|
|
|
// Click to uncheck
|
|
await radioButton.click();
|
|
await expect(radioButton).toHaveAttribute("aria-checked", "false");
|
|
});
|
|
|
|
test("shows proper styling for different modes", async ({ page }) => {
|
|
// Test standard mode
|
|
await page.selectOption('[data-testid="mode-control"]', "standard");
|
|
const radioButton = page.locator('[role="radio"]');
|
|
await expect(radioButton).toHaveClass(
|
|
/outline-\[var\(--color-border-default-tertiary\)\]/,
|
|
);
|
|
|
|
// Test inverse mode
|
|
await page.selectOption('[data-testid="mode-control"]', "inverse");
|
|
await expect(radioButton).toHaveClass(
|
|
/outline-\[var\(--color-border-inverse-primary\)\]/,
|
|
);
|
|
});
|
|
|
|
test("handles form submission", async ({ page }) => {
|
|
const hiddenInput = page.locator('input[type="radio"]');
|
|
await expect(hiddenInput).toBeVisible();
|
|
|
|
// Should be included in form data
|
|
await page.check('[data-testid="checked-control"]');
|
|
await expect(hiddenInput).toBeChecked();
|
|
});
|
|
});
|