Skip to content

Commit 023e466

Browse files
committed
fix(storybook): prevent link navigation in plays
1 parent e89da97 commit 023e466

10 files changed

Lines changed: 444 additions & 4 deletions

File tree

.agents/skills/storybook/SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ If the user asks to “review the component library in terms of Storybook best p
4141
- Prefer minimal decorators; if needed, document why they exist.
4242
- Interaction tests should include at least one assertion so failures are meaningful; use them for behaviors, not purely visual states.
4343
- Add play functions when user interactions change the UI, trigger callbacks, or guard accessibility flows; skip for static-only components.
44+
- For links in play functions, prevent default navigation before clicking to avoid browser disconnects during Vitest runs.
4445

4546
## Repo-specific conventions
4647

.github/workflows/ci.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@ jobs:
2323
- name: Install dependencies
2424
run: bun install
2525

26+
- name: Install Playwright browsers
27+
run: bun x playwright install --with-deps chromium
28+
2629
- name: Lint
2730
run: bun run lint
2831

2932
- name: Typecheck
3033
run: bun run typecheck
3134

3235
- name: Storybook tests
33-
run: bun run storybook:test
36+
run: npx vitest --project=storybook
3437

3538
- name: Build
3639
run: bun run build

.storybook/vitest.setup.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { setProjectAnnotations } from "@storybook/react";
2+
import * as previewAnnotations from "./preview";
3+
4+
setProjectAnnotations([previewAnnotations]);

bun.lock

Lines changed: 391 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"typecheck": "astro check",
1414
"format": "prettier --write \"src/**/*.{ts,tsx,astro,css,md,mdx}\"",
1515
"storybook": "storybook dev -p 6006",
16-
"storybook:test": "bun x @storybook/cli@10.2.15 test",
16+
"storybook:test": "vitest --project=storybook",
1717
"storybook:build": "storybook build"
1818
},
1919
"dependencies": {
@@ -32,15 +32,19 @@
3232
"@storybook/addon-a11y": "^10.2.15",
3333
"@storybook/addon-docs": "^10.2.15",
3434
"@storybook/addon-vitest": "^10.2.15",
35+
"@storybook/builder-vite": "10.2.15",
3536
"@storybook/react-vite": "10.2.15",
3637
"@tailwindcss/typography": "^0.5.15",
3738
"@types/node": "^22.10.5",
3839
"@typescript-eslint/parser": "^8.56.0",
40+
"@vitest/browser": "^4.0.18",
41+
"@vitest/browser-playwright": "^4.0.18",
3942
"autoprefixer": "^10.4.27",
4043
"eslint": "^9.17.0",
4144
"eslint-import-resolver-typescript": "^4.4.4",
4245
"eslint-plugin-astro": "^1.3.1",
4346
"eslint-plugin-boundaries": "^5.4.0",
47+
"playwright": "^1.58.2",
4448
"postcss": "^8.5.8",
4549
"prettier": "^3.4.2",
4650
"prettier-plugin-astro": "^0.14.1",

src/components/molecules/HeroActions/HeroActions.stories.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ export const Default: Story = {};
4242
export const PrimaryActionClick: Story = {
4343
play: async ({ canvasElement }) => {
4444
const canvas = within(canvasElement);
45-
await userEvent.click(canvas.getByRole("link", { name: "Learn More" }));
45+
const link = canvas.getByRole("link", { name: "Learn More" });
46+
link.addEventListener("click", (event) => event.preventDefault());
47+
await userEvent.click(link);
4648
await expect(primaryClick).toHaveBeenCalled();
4749
},
4850
};

src/components/organisms/CallToActionSection/CallToActionSection.stories.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const ActionButtonLink: Story = {
3838
play: async ({ canvasElement }) => {
3939
const canvas = within(canvasElement);
4040
const link = canvas.getByRole("link", { name: "About Us" });
41+
link.addEventListener("click", (event) => event.preventDefault());
4142
await userEvent.click(link);
4243
await expect(link).toHaveAttribute("href", "/about");
4344
},

src/components/organisms/HomeHero/HomeHero.stories.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export const PrimaryActionLink: Story = {
4444
play: async ({ canvasElement }) => {
4545
const canvas = within(canvasElement);
4646
const link = canvas.getByRole("link", { name: "Learn More" });
47+
link.addEventListener("click", (event) => event.preventDefault());
4748
await userEvent.click(link);
4849
await expect(link).toHaveAttribute("href", "/about");
4950
},

src/components/organisms/Navbar/Navbar.stories.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export const NavigatesToLink: Story = {
3535
play: async ({ canvasElement }) => {
3636
const canvas = within(canvasElement);
3737
const link = canvas.getByRole("link", { name: "About" });
38+
link.addEventListener("click", (event) => event.preventDefault());
3839
await userEvent.click(link);
3940
await expect(link).toHaveAttribute("href", "/about");
4041
},

vitest.config.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import path from "node:path";
2+
import { fileURLToPath } from "node:url";
3+
4+
import { playwright } from "@vitest/browser-playwright";
5+
import { storybookTest } from "@storybook/addon-vitest/vitest-plugin";
6+
import { defineConfig } from "vitest/config";
7+
8+
const dirname = path.dirname(fileURLToPath(import.meta.url));
9+
10+
export default defineConfig({
11+
test: {
12+
projects: [
13+
{
14+
plugins: [
15+
storybookTest({
16+
configDir: path.join(dirname, ".storybook"),
17+
storybookScript: "bun run storybook -- --no-open",
18+
}),
19+
],
20+
test: {
21+
name: "storybook",
22+
browser: {
23+
enabled: true,
24+
provider: playwright({}),
25+
headless: true,
26+
instances: [{ browser: "chromium" }],
27+
},
28+
setupFiles: ["./.storybook/vitest.setup.ts"],
29+
},
30+
},
31+
],
32+
},
33+
});

0 commit comments

Comments
 (0)