@@ -68,9 +68,10 @@ describe("FilterPopover", () => {
6868 const trigger = screen . getByRole ( "button" , { name : / F i l t e r b y R e v i e w / i } ) ;
6969 fireEvent . click ( trigger ) ;
7070 vi . advanceTimersByTime ( 0 ) ;
71- // "All" option should appear (now role="option")
72- const allOption = screen . getAllByRole ( "option" ) . find ( ( o ) => o . textContent ?. includes ( "All" ) ) ;
73- expect ( allOption ) . toBeDefined ( ) ;
71+ // "All" option should appear as a button in the popover
72+ const buttons = screen . getAllByRole ( "button" ) . filter ( b => b !== trigger ) ;
73+ const allBtn = buttons . find ( b => b . textContent ?. includes ( "All" ) ) ;
74+ expect ( allBtn ) . toBeDefined ( ) ;
7475 screen . getByText ( "Approved" ) ;
7576 screen . getByText ( "Changes requested" ) ;
7677 } ) ;
@@ -99,9 +100,9 @@ describe("FilterPopover", () => {
99100 const trigger = screen . getByRole ( "button" , { name : / F i l t e r b y R e v i e w / i } ) ;
100101 fireEvent . click ( trigger ) ;
101102 vi . advanceTimersByTime ( 0 ) ;
102- const options = screen . getAllByRole ( "option" ) ;
103- const approvedOpt = options . find ( ( o ) => o . textContent ?. includes ( "Approved" ) ) ;
104- expect ( approvedOpt ?. textContent ) . toContain ( "✓" ) ;
103+ const buttons = screen . getAllByRole ( "button" ) . filter ( b => b !== trigger ) ;
104+ const approvedBtn = buttons . find ( b => b . textContent ?. includes ( "Approved" ) ) ;
105+ expect ( approvedBtn ?. textContent ) . toContain ( "✓" ) ;
105106 } ) ;
106107
107108 it ( "clicking option calls onChange and closes popover" , ( ) => {
@@ -122,9 +123,9 @@ describe("FilterPopover", () => {
122123 const trigger = screen . getByRole ( "button" , { name : / F i l t e r b y R e v i e w / i } ) ;
123124 fireEvent . click ( trigger ) ;
124125 vi . advanceTimersByTime ( 0 ) ;
125- const options = screen . getAllByRole ( "option" ) ;
126- const allOption = options . find ( ( o ) => o . textContent ?. includes ( "All" ) ) ;
127- fireEvent . click ( allOption ! ) ;
126+ const buttons = screen . getAllByRole ( "button" ) . filter ( b => b !== trigger ) ;
127+ const allBtn = buttons . find ( b => b . textContent ?. includes ( "All" ) ) ;
128+ fireEvent . click ( allBtn ! ) ;
128129 expect ( onChange ) . toHaveBeenCalledWith ( "reviewDecision" , "all" ) ;
129130 } ) ;
130131
@@ -150,26 +151,43 @@ describe("FilterPopover", () => {
150151 expect ( trigger . getAttribute ( "aria-expanded" ) ) . toBe ( "false" ) ;
151152 } ) ;
152153
153- it ( "option buttons use role='option' and aria-selected " , ( ) => {
154+ it ( "selected option has aria-pressed='true', unselected has 'false' " , ( ) => {
154155 render ( ( ) => < FilterPopover group = { reviewGroup } value = "APPROVED" onChange = { ( ) => { } } /> ) ;
155156 const trigger = screen . getByRole ( "button" , { name : / F i l t e r b y R e v i e w / i } ) ;
156157 fireEvent . click ( trigger ) ;
157158 vi . advanceTimersByTime ( 0 ) ;
158- const options = screen . getAllByRole ( "option" ) ;
159- expect ( options . length ) . toBeGreaterThan ( 0 ) ;
160- const approvedOpt = options . find ( o => o . textContent ?. includes ( "Approved" ) ) ;
161- expect ( approvedOpt ?. getAttribute ( "aria-selected" ) ) . toBe ( "true" ) ;
162- const changesOpt = options . find ( o => o . textContent ?. includes ( "Changes requested" ) ) ;
163- expect ( changesOpt ?. getAttribute ( "aria-selected" ) ) . toBe ( "false" ) ;
159+ const buttons = screen . getAllByRole ( "button" ) . filter ( b => b !== trigger ) ;
160+ const approvedBtn = buttons . find ( b => b . textContent ?. includes ( "Approved" ) ) ;
161+ expect ( approvedBtn ?. getAttribute ( "aria-pressed" ) ) . toBe ( "true" ) ;
162+ const changesBtn = buttons . find ( b => b . textContent ?. includes ( "Changes requested" ) ) ;
163+ expect ( changesBtn ?. getAttribute ( "aria-pressed" ) ) . toBe ( "false" ) ;
164164 } ) ;
165165
166- it ( "popover content has role='listbox' with group label " , ( ) => {
166+ it ( "'All' button has aria-pressed='true' when value is 'all' " , ( ) => {
167167 render ( ( ) => < FilterPopover group = { reviewGroup } value = "all" onChange = { ( ) => { } } /> ) ;
168168 const trigger = screen . getByRole ( "button" , { name : / F i l t e r b y R e v i e w / i } ) ;
169169 fireEvent . click ( trigger ) ;
170170 vi . advanceTimersByTime ( 0 ) ;
171- const listbox = document . querySelector ( "[role='listbox']" ) ;
172- expect ( listbox ) . toBeTruthy ( ) ;
173- expect ( listbox ?. getAttribute ( "aria-label" ) ) . toBe ( "Review" ) ;
171+ const buttons = screen . getAllByRole ( "button" ) . filter ( b => b !== trigger ) ;
172+ const allBtn = buttons . find ( b => b . textContent ?. includes ( "All" ) ) ;
173+ expect ( allBtn ?. getAttribute ( "aria-pressed" ) ) . toBe ( "true" ) ;
174+ const approvedBtn = buttons . find ( b => b . textContent ?. includes ( "Approved" ) ) ;
175+ expect ( approvedBtn ?. getAttribute ( "aria-pressed" ) ) . toBe ( "false" ) ;
176+ } ) ;
177+
178+ it ( "popover content has aria-label with group label" , ( ) => {
179+ render ( ( ) => < FilterPopover group = { reviewGroup } value = "all" onChange = { ( ) => { } } /> ) ;
180+ const trigger = screen . getByRole ( "button" , { name : / F i l t e r b y R e v i e w / i } ) ;
181+ fireEvent . click ( trigger ) ;
182+ vi . advanceTimersByTime ( 0 ) ;
183+ const content = document . querySelector ( "[aria-label='Review']" ) ;
184+ expect ( content ) . toBeTruthy ( ) ;
185+ } ) ;
186+
187+ it ( "shows raw value as label for unknown/stale filter values" , ( ) => {
188+ render ( ( ) => < FilterPopover group = { reviewGroup } value = "STALE_VALUE" onChange = { ( ) => { } } /> ) ;
189+ const trigger = screen . getByRole ( "button" , { name : / F i l t e r b y R e v i e w / i } ) ;
190+ expect ( trigger . className ) . toContain ( "btn-primary" ) ;
191+ expect ( trigger . textContent ) . toContain ( "Review: STALE_VALUE" ) ;
174192 } ) ;
175193} ) ;
0 commit comments