11import type { Meta , StoryObj } from '@storybook/react-vite' ;
2+ import { expect , fn , userEvent , within } from 'storybook/test' ;
23import DsVerticalTabs from './ds-vertical-tabs' ;
34import { DsTypography } from '../ds-typography' ;
45import styles from './ds-vertical-tabs.stories.module.scss' ;
@@ -108,9 +109,12 @@ const TabLabel = ({ item }: { item: TabItem }) => (
108109) ;
109110
110111export const Default : Story = {
111- render : ( ) => (
112+ args : {
113+ onValueChange : fn ( ) ,
114+ } ,
115+ render : ( args ) => (
112116 < div className = { styles . storyContainer } >
113- < DsVerticalTabs >
117+ < DsVerticalTabs onValueChange = { args . onValueChange } >
114118 < DsVerticalTabs . List >
115119 { sampleItems . map ( ( item ) => (
116120 < DsVerticalTabs . Tab key = { item . id } value = { item . id } disabled = { item . disabled } >
@@ -126,12 +130,35 @@ export const Default: Story = {
126130 </ DsVerticalTabs >
127131 </ div >
128132 ) ,
133+ play : async ( { args, canvas } ) => {
134+ const firstTab = canvas . getByRole ( 'tab' , { name : / s t a t u s / i } ) ;
135+ await userEvent . click ( firstTab ) ;
136+ await expect ( firstTab ) . toHaveAttribute ( 'data-selected' ) ;
137+ await expect ( canvas . getByText ( / s e l e c t e d t a b c o n t e n t : s t a t u s / i) ) . toBeVisible ( ) ;
138+
139+ const categoryTab = canvas . getByRole ( 'tab' , { name : / ^ c a t e g o r y $ / i } ) ;
140+ await userEvent . click ( categoryTab ) ;
141+
142+ await expect ( args . onValueChange ) . toHaveBeenCalledWith ( 'category' ) ;
143+ await expect ( categoryTab ) . toHaveAttribute ( 'data-selected' ) ;
144+ await expect ( canvas . getByText ( / s e l e c t e d t a b c o n t e n t : c a t e g o r y / i) ) . toBeVisible ( ) ;
145+
146+ const versionTab = canvas . getByRole ( 'tab' , { name : / ^ v e r s i o n $ / i } ) ;
147+ await userEvent . click ( versionTab ) ;
148+
149+ await expect ( versionTab ) . toHaveAttribute ( 'data-selected' ) ;
150+ await expect ( canvas . getByText ( / s e l e c t e d t a b c o n t e n t : v e r s i o n / i) ) . toBeVisible ( ) ;
151+ await expect ( args . onValueChange ) . toHaveBeenCalledWith ( 'version' ) ;
152+ } ,
129153} ;
130154
131155export const WithDisabledItems : Story = {
132- render : ( ) => (
156+ args : {
157+ onValueChange : fn ( ) ,
158+ } ,
159+ render : ( args ) => (
133160 < div className = { styles . storyContainer } >
134- < DsVerticalTabs >
161+ < DsVerticalTabs onValueChange = { args . onValueChange } >
135162 < DsVerticalTabs . List >
136163 { sampleItemsWithDisabled . map ( ( item ) => (
137164 < DsVerticalTabs . Tab key = { item . id } value = { item . id } disabled = { item . disabled } >
@@ -147,13 +174,33 @@ export const WithDisabledItems: Story = {
147174 </ DsVerticalTabs >
148175 </ div >
149176 ) ,
177+ play : async ( { args, canvasElement } ) => {
178+ const canvas = within ( canvasElement ) ;
179+
180+ const disabledTab = canvas . getByRole ( 'tab' , { name : / s t a t u s / i } ) ;
181+ await expect ( disabledTab ) . toBeDisabled ( ) ;
182+
183+ await userEvent . click ( disabledTab ) ;
184+ await expect ( args . onValueChange ) . not . toHaveBeenCalled ( ) ;
185+
186+ const runningTab = canvas . getByRole ( 'tab' , { name : / r u n n i n g \/ c o m p l e t e d / i } ) ;
187+ await userEvent . click ( runningTab ) ;
188+
189+ await expect ( args . onValueChange ) . toHaveBeenCalledWith ( 'running' ) ;
190+ await expect ( runningTab ) . toHaveAttribute ( 'data-selected' ) ;
191+ await expect ( canvas . getByText ( / s e l e c t e d t a b c o n t e n t : r u n n i n g / i) ) . toBeVisible ( ) ;
192+ await expect ( disabledTab ) . toBeDisabled ( ) ;
193+ } ,
150194} ;
151195
152196export const LongLabels : Story = {
153- render : ( ) => {
197+ args : {
198+ onValueChange : fn ( ) ,
199+ } ,
200+ render : ( args ) => {
154201 return (
155202 < div className = { styles . storyContainerShort } >
156- < DsVerticalTabs >
203+ < DsVerticalTabs onValueChange = { args . onValueChange } >
157204 < DsVerticalTabs . List >
158205 { itemsWithLongLabels . map ( ( item ) => (
159206 < DsVerticalTabs . Tab key = { item . id } value = { item . id } disabled = { item . disabled } >
@@ -170,13 +217,41 @@ export const LongLabels: Story = {
170217 </ div >
171218 ) ;
172219 } ,
220+ play : async ( { args, canvasElement } ) => {
221+ const canvas = within ( canvasElement ) ;
222+
223+ const longLabel1 = canvas . getByRole ( 'tab' , {
224+ name : / v e r y l o n g n a v i g a t i o n i t e m l a b e l t h a t m i g h t o v e r f l o w / i,
225+ } ) ;
226+ const longLabel2 = canvas . getByRole ( 'tab' , { name : / a n o t h e r r e a l l y l o n g l a b e l f o r t e s t i n g p u r p o s e s / i } ) ;
227+ const shortLabel = canvas . getByRole ( 'tab' , { name : / ^ s h o r t / i } ) ;
228+
229+ await expect ( longLabel1 ) . toBeVisible ( ) ;
230+ await expect ( longLabel2 ) . toBeVisible ( ) ;
231+ await expect ( shortLabel ) . toBeVisible ( ) ;
232+
233+ await userEvent . click ( longLabel2 ) ;
234+
235+ await expect ( longLabel2 ) . toHaveAttribute ( 'data-selected' ) ;
236+ await expect ( canvas . getByText ( / s e l e c t e d t a b c o n t e n t : 2 / i) ) . toBeVisible ( ) ;
237+ await expect ( args . onValueChange ) . toHaveBeenCalledWith ( '2' ) ;
238+
239+ await userEvent . click ( shortLabel ) ;
240+
241+ await expect ( shortLabel ) . toHaveAttribute ( 'data-selected' ) ;
242+ await expect ( canvas . getByText ( / s e l e c t e d t a b c o n t e n t : 3 / i) ) . toBeVisible ( ) ;
243+ await expect ( args . onValueChange ) . toHaveBeenCalledWith ( '3' ) ;
244+ } ,
173245} ;
174246
175247export const HighCounts : Story = {
176- render : ( ) => {
248+ args : {
249+ onValueChange : fn ( ) ,
250+ } ,
251+ render : ( args ) => {
177252 return (
178253 < div className = { styles . storyContainerShort } >
179- < DsVerticalTabs >
254+ < DsVerticalTabs onValueChange = { args . onValueChange } >
180255 < DsVerticalTabs . List >
181256 { itemsWithHighCounts . map ( ( item ) => (
182257 < DsVerticalTabs . Tab key = { item . id } value = { item . id } disabled = { item . disabled } >
@@ -193,4 +268,35 @@ export const HighCounts: Story = {
193268 </ div >
194269 ) ;
195270 } ,
271+ play : async ( { args, canvasElement } ) => {
272+ const canvas = within ( canvasElement ) ;
273+
274+ await expect ( canvas . getByText ( '999' ) ) . toBeVisible ( ) ;
275+ await expect ( canvas . getByText ( '1000' ) ) . toBeVisible ( ) ;
276+ await expect ( canvas . getByText ( '12345' ) ) . toBeVisible ( ) ;
277+
278+ const statusTab = canvas . getByRole ( 'tab' , { name : / s t a t u s / i } ) ;
279+ const categoryTab = canvas . getByRole ( 'tab' , { name : / c a t e g o r y / i } ) ;
280+ const versionTab = canvas . getByRole ( 'tab' , { name : / v e r s i o n / i } ) ;
281+
282+ await expect ( statusTab ) . toBeVisible ( ) ;
283+ await expect ( categoryTab ) . toBeVisible ( ) ;
284+ await expect ( versionTab ) . toBeVisible ( ) ;
285+
286+ await userEvent . click ( categoryTab ) ;
287+
288+ await expect ( categoryTab ) . toHaveAttribute ( 'data-selected' ) ;
289+ await expect ( canvas . getByText ( / s e l e c t e d t a b c o n t e n t : c a t e g o r y / i) ) . toBeVisible ( ) ;
290+ await expect ( args . onValueChange ) . toHaveBeenCalledWith ( 'category' ) ;
291+
292+ await userEvent . click ( versionTab ) ;
293+
294+ await expect ( versionTab ) . toHaveAttribute ( 'data-selected' ) ;
295+ await expect ( canvas . getByText ( / s e l e c t e d t a b c o n t e n t : v e r s i o n / i) ) . toBeVisible ( ) ;
296+ await expect ( args . onValueChange ) . toHaveBeenCalledWith ( 'version' ) ;
297+
298+ await expect ( canvas . getByText ( '999' ) ) . toBeVisible ( ) ;
299+ await expect ( canvas . getByText ( '1000' ) ) . toBeVisible ( ) ;
300+ await expect ( canvas . getByText ( '12345' ) ) . toBeVisible ( ) ;
301+ } ,
196302} ;
0 commit comments