@@ -39,19 +39,27 @@ describe(`Rules: ${ruleId}`, () => {
3939 expect ( messages . length ) . toBe ( 0 )
4040 } )
4141
42- it ( 'Input tag nested inside label tag should result in no error' , ( ) => {
43- const code = '<label><input type="password" /></label>'
42+ it ( 'Input nested inside label with text before should result in no error' , ( ) => {
43+ const code = '<label>Password <input type="password" /></label>'
44+ const messages = HTMLHint . verify ( code , ruleOptions )
45+ expect ( messages . length ) . toBe ( 0 )
46+ } )
47+
48+ it ( 'Input nested inside label with text after should result in no error' , ( ) => {
49+ const code = '<label><input type="email" /> Email</label>'
50+ const messages = HTMLHint . verify ( code , ruleOptions )
51+ expect ( messages . length ) . toBe ( 0 )
52+ } )
53+
54+ it ( 'Input nested inside label with text in child element should result in no error' , ( ) => {
55+ const code = '<label><span>Email</span> <input type="email" /></label>'
4456 const messages = HTMLHint . verify ( code , ruleOptions )
4557 expect ( messages . length ) . toBe ( 0 )
4658 } )
4759
48- // Multiple inputs inside one label are all accepted. The HTML spec
49- // associates only the first labelable descendant with the label, but
50- // this rule is about "every input has a label nearby" for a11y, not
51- // strict spec conformance.
52- it ( 'Multiple inputs nested inside one label should result in no error' , ( ) => {
60+ it ( 'Multiple inputs nested inside label with text should result in no error' , ( ) => {
5361 const code =
54- '<label><input type="password " /><input type="text " /></label>'
62+ '<label>Credentials <input type="text " /><input type="password " /></label>'
5563 const messages = HTMLHint . verify ( code , ruleOptions )
5664 expect ( messages . length ) . toBe ( 0 )
5765 } )
@@ -136,5 +144,42 @@ describe(`Rules: ${ruleId}`, () => {
136144 expect ( messages [ 0 ] . rule . id ) . toBe ( ruleId )
137145 expect ( messages [ 0 ] . type ) . toBe ( 'warning' )
138146 } )
147+
148+ it ( 'Input nested inside label with no text should result in error' , ( ) => {
149+ const code = '<label><input type="password" /></label>'
150+ const messages = HTMLHint . verify ( code , ruleOptions )
151+ expect ( messages . length ) . toBe ( 1 )
152+ expect ( messages [ 0 ] . rule . id ) . toBe ( ruleId )
153+ expect ( messages [ 0 ] . type ) . toBe ( 'warning' )
154+ } )
155+
156+ it ( 'Input nested inside label with whitespace only should result in error' , ( ) => {
157+ const code = '<label> <input type="text" /> </label>'
158+ const messages = HTMLHint . verify ( code , ruleOptions )
159+ expect ( messages . length ) . toBe ( 1 )
160+ expect ( messages [ 0 ] . rule . id ) . toBe ( ruleId )
161+ expect ( messages [ 0 ] . type ) . toBe ( 'warning' )
162+ } )
163+
164+ it ( 'Multiple inputs nested inside label with no text should result in errors' , ( ) => {
165+ const code =
166+ '<label><input type="text" /><input type="password" /></label>'
167+ const messages = HTMLHint . verify ( code , ruleOptions )
168+ expect ( messages . length ) . toBe ( 2 )
169+ } )
170+
171+ it ( 'Valid label followed by empty label should only warn for the empty one' , ( ) => {
172+ const code =
173+ '<label>Username <input type="text" /></label><label><input type="password" /></label>'
174+ const messages = HTMLHint . verify ( code , ruleOptions )
175+ expect ( messages . length ) . toBe ( 1 )
176+ } )
177+
178+ it ( 'Nested labels: outer with text should not false-warn outer input' , ( ) => {
179+ const code =
180+ '<label>Outer <label><input type="checkbox" /></label><input type="text" /></label>'
181+ const messages = HTMLHint . verify ( code , ruleOptions )
182+ expect ( messages . length ) . toBe ( 1 )
183+ } )
139184 } )
140185} )
0 commit comments