From ee5f8c0173c3a6dbadda9ff3877c4663b98eeccc Mon Sep 17 00:00:00 2001 From: wuyangfan <1102042793@qq.com> Date: Tue, 26 May 2026 23:01:04 +0800 Subject: [PATCH] test(docs): assert independent radio groups across duplicate Controls blocks Extend the duplicate- regression story to use inline-radio args, verify unique radio group names per block, and assert selections in one block do not affect the other. Closes #34864 Co-authored-by: Cursor --- .../src/blocks/blocks/Controls.stories.tsx | 33 ++++++++++++++++--- .../examples/ControlsParameters.stories.tsx | 10 ++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/code/addons/docs/src/blocks/blocks/Controls.stories.tsx b/code/addons/docs/src/blocks/blocks/Controls.stories.tsx index d1289aadb7f3..b637dd5f8a9c 100644 --- a/code/addons/docs/src/blocks/blocks/Controls.stories.tsx +++ b/code/addons/docs/src/blocks/blocks/Controls.stories.tsx @@ -4,7 +4,7 @@ import type { PlayFunctionContext } from 'storybook/internal/csf'; import type { Meta, StoryObj } from '@storybook/react-vite'; -import { expect, within } from 'storybook/test'; +import { expect, userEvent } from 'storybook/test'; import * as ExampleStories from '../examples/ControlsParameters.stories'; import * as SubcomponentsExampleStories from '../examples/ControlsWithSubcomponentsParameters.stories'; @@ -185,13 +185,14 @@ export const MultipleControlsOnSamePage: Story = { /** * When multiple Controls blocks for the SAME story are on the same docs page, each control should * still have a unique id (and unique name across blocks, so that radio button groups remain - * independent). This verifies the fix for https://github.com/storybookjs/storybook/issues/29295. + * independent). This verifies the fix for https://github.com/storybookjs/storybook/issues/29295 + * and https://github.com/storybookjs/storybook/issues/34864. */ export const MultipleControlsForSameStoryOnSamePage: Story = { render: () => ( <> - - + + ), play: async ({ canvasElement }) => { @@ -201,5 +202,29 @@ export const MultipleControlsForSameStoryOnSamePage: Story = { const uniqueIds = new Set(allIds); await expect(allIds.length).toBeGreaterThan(0); await expect(uniqueIds.size).toBe(allIds.length); + + const radioInputs = Array.from( + canvasElement.querySelectorAll('input[type="radio"]') + ); + const radioNames = radioInputs.map((input) => input.name); + await expect(radioNames.length).toBeGreaterThan(0); + await expect(new Set(radioNames).size).toBe(radioNames.length); + + const tables = canvasElement.querySelectorAll('.docblock-argstable'); + await expect(tables.length).toBe(2); + + const getCheckedValues = (table: Element) => + Array.from(table.querySelectorAll('input[type="radio"]:checked')).map( + (input) => input.value + ); + + const firstBlockRadios = tables[0].querySelectorAll('input[type="radio"]'); + const secondBlockRadios = tables[1].querySelectorAll('input[type="radio"]'); + + await userEvent.click(firstBlockRadios[1]); + await userEvent.click(secondBlockRadios[2]); + + await expect(getCheckedValues(tables[0])).toEqual(['medium']); + await expect(getCheckedValues(tables[1])).toEqual(['large']); }, }; diff --git a/code/addons/docs/src/blocks/examples/ControlsParameters.stories.tsx b/code/addons/docs/src/blocks/examples/ControlsParameters.stories.tsx index 497c543d728c..303cdffe230d 100644 --- a/code/addons/docs/src/blocks/examples/ControlsParameters.stories.tsx +++ b/code/addons/docs/src/blocks/examples/ControlsParameters.stories.tsx @@ -33,6 +33,16 @@ export const NoParameters: Story = { }, }; +export const WithInlineRadio: Story = { + args: { a: 'small' }, + argTypes: { + a: { + control: { type: 'inline-radio' }, + options: ['small', 'medium', 'large'], + }, + }, +}; + export const Include: Story = { ...NoParameters, parameters: { docs: { controls: { include: ['a'] } } },