@@ -180,43 +180,74 @@ test("event type filters hide cards and lock the last active tag", async ({
180180 const tagBadge = ( tag : RegExp ) =>
181181 pastEventsSection . locator ( "a span:has(.Tag--bg)" ) . filter ( { hasText : tag } )
182182
183- const conferenceBadge = tagBadge ( / ^ c o n f e r e n c e $ / i)
184- const meetupBadge = tagBadge ( / ^ m e e t u p $ / i)
185- const workingGroupBadge = tagBadge ( / ^ w o r k i n g g r o u p $ / i)
186-
187- await expect ( conferenceBadge . first ( ) ) . toBeVisible ( )
188- await expect ( meetupBadge . first ( ) ) . toBeVisible ( )
189- await expect ( workingGroupBadge . first ( ) ) . toBeVisible ( )
190-
191- await conferenceChip . click ( )
192- await expect ( conferenceFilter ) . not . toBeChecked ( )
193- await expect ( conferenceBadge ) . toHaveCount ( 0 )
194- await conferenceChip . click ( )
195- await expect ( conferenceFilter ) . toBeChecked ( )
196- await expect ( conferenceBadge . first ( ) ) . toBeVisible ( )
197-
198- await meetupChip . click ( )
199- await expect ( meetupFilter ) . not . toBeChecked ( )
200- await expect ( meetupBadge ) . toHaveCount ( 0 )
201- await meetupChip . click ( )
202- await expect ( meetupFilter ) . toBeChecked ( )
203- await expect ( meetupBadge . first ( ) ) . toBeVisible ( )
204-
205- await workingGroupChip . click ( )
206- await expect ( workingGroupFilter ) . not . toBeChecked ( )
207- await expect ( workingGroupBadge ) . toHaveCount ( 0 )
208- await workingGroupChip . click ( )
209- await expect ( workingGroupFilter ) . toBeChecked ( )
210- await expect ( workingGroupBadge . first ( ) ) . toBeVisible ( )
211-
212- await conferenceChip . click ( )
213- await workingGroupChip . click ( )
214- await expect ( meetupFilter ) . toBeDisabled ( )
215- await expect ( meetupBadge . first ( ) ) . toBeVisible ( )
216-
217- await conferenceChip . click ( )
218- await workingGroupChip . click ( )
219- await expect ( meetupFilter ) . toBeEnabled ( )
183+ const filterDefinitions = [
184+ {
185+ kind : "conference" ,
186+ filterName : / c o n f e r e n c e / i,
187+ badgeText : / ^ c o n f e r e n c e $ / i,
188+ chip : conferenceChip ,
189+ filter : conferenceFilter ,
190+ } ,
191+ {
192+ kind : "meetup" ,
193+ filterName : / m e e t u p / i,
194+ badgeText : / ^ m e e t u p $ / i,
195+ chip : meetupChip ,
196+ filter : meetupFilter ,
197+ } ,
198+ {
199+ kind : "working group" ,
200+ filterName : / w o r k i n g g r o u p / i,
201+ badgeText : / ^ w o r k i n g g r o u p $ / i,
202+ chip : workingGroupChip ,
203+ filter : workingGroupFilter ,
204+ } ,
205+ ] as const
206+
207+ type FilterDefinition = ( typeof filterDefinitions ) [ number ]
208+ type ActiveFilter = FilterDefinition & { badges : Locator }
209+
210+ const activeFilters : ActiveFilter [ ] = [ ]
211+
212+ for ( const definition of filterDefinitions ) {
213+ const badgeLocator = tagBadge ( definition . badgeText )
214+ if ( ( await definition . filter . count ( ) ) === 0 ) continue
215+ activeFilters . push ( { ...definition , badges : badgeLocator } )
216+ }
217+
218+ expect ( activeFilters . length ) . toBeGreaterThan ( 0 )
219+
220+ for ( const activeFilter of activeFilters ) {
221+ await expect ( activeFilter . badges . first ( ) ) . toBeVisible ( )
222+ await activeFilter . chip . click ( )
223+ await expect ( activeFilter . filter ) . not . toBeChecked ( )
224+ await expect ( activeFilter . badges ) . toHaveCount ( 0 )
225+ await activeFilter . chip . click ( )
226+ await expect ( activeFilter . filter ) . toBeChecked ( )
227+ await expect ( activeFilter . badges . first ( ) ) . toBeVisible ( )
228+ }
229+
230+ if ( activeFilters . length < 2 ) {
231+ return
232+ }
233+
234+ const [ lockedFilter , ...filtersToToggle ] = activeFilters
235+
236+ for ( const filter of filtersToToggle ) {
237+ await filter . chip . click ( )
238+ await expect ( filter . filter ) . not . toBeChecked ( )
239+ }
240+
241+ await expect ( lockedFilter . filter ) . toBeChecked ( )
242+ await expect ( lockedFilter . filter ) . toBeDisabled ( )
243+ await expect ( lockedFilter . badges . first ( ) ) . toBeVisible ( )
244+
245+ for ( const filter of filtersToToggle ) {
246+ await filter . chip . click ( )
247+ await expect ( filter . filter ) . toBeChecked ( )
248+ }
249+
250+ await expect ( lockedFilter . filter ) . toBeEnabled ( )
220251} )
221252
222253test ( "upcoming and past sections only show events on the correct side of now" , async ( {
@@ -258,7 +289,10 @@ test("upcoming and past sections only show events on the correct side of now", a
258289 const upcomingDates = await readSectionDates ( upcomingSection )
259290 expect ( upcomingDates . length ) . toBeGreaterThan ( 0 )
260291 upcomingDates . forEach ( ( { iso, text } ) => {
261- expect ( iso . length , `${ text } is missing a datetime attribute` ) . toBeGreaterThan ( 0 )
292+ expect (
293+ iso . length ,
294+ `${ text } is missing a datetime attribute` ,
295+ ) . toBeGreaterThan ( 0 )
262296 const timestamp = Date . parse ( iso )
263297 expect (
264298 Number . isNaN ( timestamp ) ,
@@ -273,7 +307,10 @@ test("upcoming and past sections only show events on the correct side of now", a
273307 const pastDates = await readSectionDates ( pastEventsSection )
274308 expect ( pastDates . length ) . toBeGreaterThan ( 0 )
275309 pastDates . forEach ( ( { iso, text } ) => {
276- expect ( iso . length , `${ text } is missing a datetime attribute` ) . toBeGreaterThan ( 0 )
310+ expect (
311+ iso . length ,
312+ `${ text } is missing a datetime attribute` ,
313+ ) . toBeGreaterThan ( 0 )
277314 const timestamp = Date . parse ( iso )
278315 expect (
279316 Number . isNaN ( timestamp ) ,
0 commit comments