@@ -4,6 +4,7 @@ import DsfrInput from './DsfrInput.vue'
44import DsfrInputGroup from './DsfrInputGroup.vue'
55
66import VIcon from '../VIcon/VIcon.vue'
7+ import { within , expect } from '@storybook/test'
78
89/**
910 * [Voir quand l’utiliser sur la documentation du DSFR](https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/champ-de-saisie)
@@ -117,6 +118,13 @@ ChampSansLabel.args = {
117118 modelValue : '' ,
118119 disabled : false ,
119120}
121+ ChampSansLabel . play = async ( { canvasElement } ) => {
122+ const canvas = within ( canvasElement )
123+ const label = canvas . getByText ( ChampSansLabel . args . label )
124+ expect ( label ) . toHaveClass ( 'fr-label' )
125+ const input = canvas . getByRole ( 'textbox' )
126+ expect ( input ) . not . toHaveAttribute ( 'required' )
127+ }
120128
121129export const LabelVisible = ( args ) => ( {
122130 components : {
@@ -146,6 +154,14 @@ LabelVisible.args = {
146154 modelValue : '' ,
147155 disabled : false ,
148156}
157+ ChampSansLabel . play = async ( { canvasElement } ) => {
158+ const canvas = within ( canvasElement )
159+ const label = canvas . getByText ( ChampSansLabel . args . label )
160+ expect ( label ) . toHaveClass ( 'fr-label' )
161+ expect ( label ) . toBeVisible ( )
162+ const input = canvas . getByRole ( 'textbox' )
163+ expect ( input ) . not . toHaveAttribute ( 'required' )
164+ }
149165
150166export const ChampRequis = ( args ) => ( {
151167 components : {
@@ -181,6 +197,13 @@ ChampRequis.args = {
181197 disabled : false ,
182198 isTextarea : true ,
183199}
200+ ChampRequis . play = async ( { canvasElement } ) => {
201+ const canvas = within ( canvasElement )
202+ const label = canvas . getByText ( ChampRequis . args . label )
203+ expect ( label ) . toHaveClass ( 'fr-label' )
204+ const input = canvas . getByRole ( 'textbox' )
205+ expect ( input ) . toHaveAttribute ( 'required' )
206+ }
184207
185208export const ChampAvecLabelPersonnalise = ( args ) => ( {
186209 components : {
@@ -260,6 +283,13 @@ ChampAvecLabelPersonnalise.args = {
260283 disabled : false ,
261284 isTextarea : true ,
262285}
286+ ChampAvecLabelPersonnalise . play = async ( { canvasElement } ) => {
287+ const canvas = within ( canvasElement )
288+ const label = canvas . getByText ( ChampAvecLabelPersonnalise . args . label ) . parentElement
289+ expect ( label ) . toHaveClass ( 'fr-label' )
290+ const input = canvas . getByRole ( 'textbox' )
291+ expect ( input ) . toHaveAttribute ( 'required' )
292+ }
263293
264294export const ChampRequisPersonnalise = ( args ) => ( {
265295 components : {
@@ -280,7 +310,7 @@ export const ChampRequisPersonnalise = (args) => ({
280310 :required="true"
281311 >
282312 <template #required-tip>
283- <em> (obligatoire) </em>
313+ <em> {{ requiredText }} </em>
284314 </template>
285315 </DsfrInput>
286316 ` ,
@@ -292,6 +322,16 @@ ChampRequisPersonnalise.args = {
292322 modelValue : '' ,
293323 disabled : false ,
294324 isTextarea : true ,
325+ requiredText : '(obligatoire)' ,
326+ }
327+ ChampRequisPersonnalise . play = async ( { canvasElement } ) => {
328+ const canvas = within ( canvasElement )
329+ const label = canvas . getByText ( ChampRequisPersonnalise . args . label )
330+ const em = canvas . getByText ( ChampRequisPersonnalise . args . requiredText )
331+ expect ( em ) . toHaveProperty ( 'tagName' , 'EM' )
332+ expect ( label ) . toHaveClass ( 'fr-label' )
333+ const input = canvas . getByRole ( 'textbox' )
334+ expect ( input ) . toHaveAttribute ( 'required' )
295335}
296336
297337export const ChampEnErreur = ( args ) => ( {
@@ -328,6 +368,16 @@ ChampEnErreur.args = {
328368 errorMessage : 'Message d’erreur' ,
329369 isInvalid : true ,
330370}
371+ ChampEnErreur . play = async ( { canvasElement } ) => {
372+ const canvas = within ( canvasElement )
373+ const inputWrapper = canvas . getByText ( ChampEnErreur . args . label ) . parentElement
374+ const messageEl = canvas . getByText ( ChampEnErreur . args . errorMessage )
375+
376+ expect ( inputWrapper ) . toHaveClass ( 'fr-input-group' )
377+ expect ( inputWrapper ) . toHaveClass ( 'fr-input-group--error' )
378+ expect ( messageEl ) . toHaveClass ( 'fr-error-text' )
379+ expect ( messageEl . parentElement ) . toHaveClass ( 'fr-messages-group' )
380+ }
331381
332382export const ChampValide = ( args ) => ( {
333383 components : {
@@ -361,6 +411,16 @@ ChampValide.args = {
361411 validMessage : 'Message de validation' ,
362412 isValid : true ,
363413}
414+ ChampValide . play = async ( { canvasElement } ) => {
415+ const canvas = within ( canvasElement )
416+ const inputWrapper = canvas . getByText ( ChampValide . args . label ) . parentElement
417+ const messageEl = canvas . getByText ( ChampValide . args . validMessage )
418+
419+ expect ( inputWrapper ) . toHaveClass ( 'fr-input-group' )
420+ expect ( inputWrapper ) . toHaveClass ( 'fr-input-group--valid' )
421+ expect ( messageEl ) . toHaveClass ( 'fr-valid-text' )
422+ expect ( messageEl . parentElement ) . toHaveClass ( 'fr-messages-group' )
423+ }
364424
365425export const ChampDeSaisieDeDate = ( args ) => ( {
366426 components : {
@@ -392,6 +452,11 @@ ChampDeSaisieDeDate.args = {
392452 label : 'Date de naissance' ,
393453 hint : 'JJ/MM/AAAA' ,
394454}
455+ ChampDeSaisieDeDate . play = async ( { canvasElement } ) => {
456+ const canvas = within ( canvasElement )
457+ const input = canvas . getByText ( ChampDeSaisieDeDate . args . label ) . nextElementSibling ?. querySelector ( 'input' )
458+ expect ( input ) . toHaveAttribute ( 'type' , 'date' )
459+ }
395460
396461export const FocusSurChamp = ( args ) => ( {
397462 components : {
@@ -413,7 +478,7 @@ export const FocusSurChamp = (args) => ({
413478 } ,
414479 template : `
415480 <DsfrButton @click="focusInput()">
416- Focus sur l’input
481+ {{ inputButtonText }}
417482 </DsfrButton>
418483
419484 <DsfrInput
@@ -427,7 +492,7 @@ export const FocusSurChamp = (args) => ({
427492 />
428493
429494 <DsfrButton @click="focusTextarea()">
430- Focus sur le textarea
495+ {{ textareaButtonText }}
431496 </DsfrButton>
432497
433498 <DsfrInput
@@ -450,6 +515,18 @@ FocusSurChamp.args = {
450515 isTextarea : true ,
451516 label : 'Label du champ' ,
452517 hint : '' ,
518+ inputButtonText : 'Focus sur l’input' ,
519+ textareaButtonText : 'Focus sur le textarea' ,
520+ }
521+ ChampValide . play = async ( { canvasElement } ) => {
522+ const canvas = within ( canvasElement )
523+ const inputWrapper = canvas . getByText ( ChampValide . args . label ) . parentElement
524+ const messageEl = canvas . getByText ( ChampValide . args . validMessage )
525+
526+ expect ( inputWrapper ) . toHaveClass ( 'fr-input-group' )
527+ expect ( inputWrapper ) . toHaveClass ( 'fr-input-group--valid' )
528+ expect ( messageEl ) . toHaveClass ( 'fr-valid-text' )
529+ expect ( messageEl . parentElement ) . toHaveClass ( 'fr-messages-group' )
453530}
454531
455532export const ZoneDeTexte = ( args ) => ( {
@@ -480,3 +557,8 @@ ZoneDeTexte.args = {
480557 disabled : false ,
481558 isTextarea : true ,
482559}
560+ ZoneDeTexte . play = async ( { canvasElement } ) => {
561+ const canvas = within ( canvasElement )
562+ const textarea = canvas . getByRole ( 'textbox' )
563+ expect ( textarea ) . toHaveProperty ( 'tagName' , 'TEXTAREA' )
564+ }
0 commit comments