@@ -9,16 +9,16 @@ class IntegrationTextAreaTest < System::TestCase
99 def test_character_limit_updates_on_input
1010 visit_preview ( :with_character_limit )
1111
12- assert_selector "span.FormControl-caption[data-max-length='10']" , text : "10 characters remaining. "
13- assert_selector "div .FormControl-inlineValidation[data-target='primer-text-area.validationElement' ]", visible : :hidden
12+ assert_selector "span.FormControl-caption[data-max-length='10'] .FormControl-caption-text " , text : "10 characters remaining"
13+ refute_selector "span .FormControl-caption .FormControl-caption-icon[hidden ]", visible : :all
1414
1515 textarea = find ( "textarea[data-target='primer-text-area.inputElement']" )
1616 textarea . fill_in ( with : "Hello" )
1717
1818 sleep 0.3
1919
20- assert_selector "span.FormControl-caption[data-max-length='10']" , text : "5 characters remaining. "
21- assert_selector "div .FormControl-inlineValidation[data-target='primer-text-area.validationElement' ]", visible : :hidden
20+ assert_selector "span.FormControl-caption[data-max-length='10'] .FormControl-caption-text " , text : "5 characters remaining"
21+ refute_selector "span .FormControl-caption .FormControl-caption-icon[hidden ]", visible : :all
2222 end
2323
2424 def test_character_limit_shows_validation_when_exceeded
@@ -29,18 +29,11 @@ def test_character_limit_shows_validation_when_exceeded
2929
3030 sleep 0.3
3131
32- assert_selector "span.FormControl-caption[data-max-length='10']" , text : "2 characters over."
33- assert_selector "div.FormControl-inlineValidation[data-target='primer-text-area.validationElement']" , visible : :visible do |element |
34- assert_includes element . text , "You've exceeded the character limit"
35- end
32+ assert_selector "span.FormControl-caption[data-max-length='10'] .FormControl-caption-text" , text : "2 characters over"
33+ assert_selector "span.FormControl-caption .FormControl-caption-icon:not([hidden])" , visible : :visible
34+ assert_selector "span.FormControl-caption.fgColor-danger"
3635
3736 assert_selector "textarea[invalid='true'][aria-invalid='true']"
38-
39- validation_element = find ( "div.FormControl-inlineValidation[data-target='primer-text-area.validationElement']" )
40- validation_id = validation_element [ "id" ]
41-
42- textarea_aria_describedby = textarea [ "aria-describedby" ]
43- assert_includes textarea_aria_describedby , validation_id , "textarea aria-describedby should include validation element ID"
4437 end
4538
4639 def test_character_limit_clears_validation_when_back_under_limit
@@ -50,14 +43,15 @@ def test_character_limit_clears_validation_when_back_under_limit
5043 textarea . fill_in ( with : "Hello World!" ) # 12 characters
5144 sleep 0.3
5245
53- assert_selector "div .FormControl-inlineValidation[data-target='primer-text-area.validationElement'] " , visible : :visible
46+ assert_selector "span .FormControl-caption .FormControl-caption-icon:not([hidden]) " , visible : :visible
5447 assert_selector "textarea[invalid='true'][aria-invalid='true']"
5548
5649 textarea . fill_in ( with : "Hello" ) # 5 characters
5750 sleep 0.3
5851
59- assert_selector "span.FormControl-caption[data-max-length='10']" , text : "5 characters remaining."
60- assert_selector "div.FormControl-inlineValidation[data-target='primer-text-area.validationElement']" , visible : :hidden
52+ assert_selector "span.FormControl-caption[data-max-length='10'] .FormControl-caption-text" , text : "5 characters remaining"
53+ refute_selector "span.FormControl-caption .FormControl-caption-icon[hidden]" , visible : :all
54+ refute_selector "span.FormControl-caption.fgColor-danger"
6155
6256 refute_selector "textarea[invalid='true']"
6357 refute_selector "textarea[aria-invalid='true']"
@@ -74,12 +68,12 @@ def test_character_limit_screen_reader_text_updates
7468 # Wait for debounced update (500ms + buffer)
7569 sleep 0.6
7670
77- assert_equal "6 characters remaining. " , sr_element . text
71+ assert_equal "6 characters remaining" , sr_element . text
7872
7973 textarea . fill_in ( with : "Hello World!" ) # 12 characters
8074 sleep 0.6
8175
82- assert_equal "2 characters over. " , sr_element . text
76+ assert_equal "2 characters over" , sr_element . text
8377 end
8478
8579 def test_character_limit_singular_vs_plural
@@ -89,12 +83,53 @@ def test_character_limit_singular_vs_plural
8983 textarea . fill_in ( with : "123456789" ) # 9 characters, limit is 10
9084 sleep 0.3
9185
92- assert_selector "span.FormControl-caption[data-max-length='10']" , text : "1 character remaining. "
86+ assert_selector "span.FormControl-caption[data-max-length='10'] .FormControl-caption-text " , text : "1 character remaining"
9387
9488 textarea . fill_in ( with : "12345678901" ) # 11 characters
9589 sleep 0.3
9690
97- assert_selector "span.FormControl-caption[data-max-length='10']" , text : "1 character over."
91+ assert_selector "span.FormControl-caption[data-max-length='10'] .FormControl-caption-text" , text : "1 character over"
92+ end
93+
94+ def test_character_limit_screen_reader_not_announced_on_load
95+ visit_preview ( :with_character_limit )
96+
97+ sr_element = find ( "span.sr-only[aria-live='polite']" )
98+
99+ # Screen reader element should be empty on initial load
100+ assert_equal "" , sr_element . text
101+
102+ # Only populated after user input
103+ textarea = find ( "textarea[data-target='primer-text-area.inputElement']" )
104+ textarea . fill_in ( with : "Test" )
105+
106+ sleep 0.6 # Wait for debounced update
107+
108+ assert_equal "6 characters remaining" , sr_element . text
109+ end
110+
111+ def test_character_limit_icon_visibility
112+ visit_preview ( :with_character_limit )
113+
114+ # Icon should be hidden initially
115+ assert_selector "span.FormControl-caption .FormControl-caption-icon[hidden]"
116+
117+ textarea = find ( "textarea[data-target='primer-text-area.inputElement']" )
118+
119+ # Icon should remain hidden when under limit
120+ textarea . fill_in ( with : "Hello" )
121+ sleep 0.3
122+ assert_selector "span.FormControl-caption .FormControl-caption-icon[hidden]"
123+
124+ # Icon should be visible when over limit
125+ textarea . fill_in ( with : "Hello World!" )
126+ sleep 0.3
127+ assert_selector "span.FormControl-caption .FormControl-caption-icon:not([hidden])" , visible : :visible
128+
129+ # Icon should be hidden again when back under limit
130+ textarea . fill_in ( with : "Hi" )
131+ sleep 0.3
132+ assert_selector "span.FormControl-caption .FormControl-caption-icon[hidden]"
98133 end
99134 end
100135end
0 commit comments