Skip to content

feat: Test utils API audit, additional feature coverage (RTL, grid nav, etc) in prep for RC/1.0#9998

Open
LFDanLu wants to merge 25 commits intomainfrom
test-utils-1.0
Open

feat: Test utils API audit, additional feature coverage (RTL, grid nav, etc) in prep for RC/1.0#9998
LFDanLu wants to merge 25 commits intomainfrom
test-utils-1.0

Conversation

@LFDanLu
Copy link
Copy Markdown
Member

@LFDanLu LFDanLu commented Apr 29, 2026

See commits for what changed

Some additional pattern support to be opened in a different PR maybe, to discuss if we think they are worth it or not.

✅ Pull Request Checklist:

  • Included link to corresponding React Spectrum GitHub Issue.
  • Added/updated unit tests and storybook for this change (for new code or code which already has tests).
  • Filled out test instructions.
  • Updated documentation (if it already exists for this component).
  • Looked at the Accessibility Practices for this feature - Aria Practices

📝 Test Instructions:

🧢 Your Project:

RSP

@rspbot
Copy link
Copy Markdown

rspbot commented Apr 30, 2026

@rspbot
Copy link
Copy Markdown

rspbot commented Apr 30, 2026

@LFDanLu LFDanLu marked this pull request as ready for review April 30, 2026 22:47
@rspbot
Copy link
Copy Markdown

rspbot commented May 1, 2026

@rspbot
Copy link
Copy Markdown

rspbot commented May 1, 2026

@rspbot
Copy link
Copy Markdown

rspbot commented May 1, 2026

## API Changes

@react-aria/test-utils

/@react-aria/test-utils:CheckboxGroupTester

 CheckboxGroupTester {
-  checkboxes: Array<HTMLElement>
-  checkboxgroup: HTMLElement
+  checkboxes: () => Array<HTMLElement>
+  checkboxgroup: () => HTMLElement
   constructor: (CheckboxGroupTesterOpts) => void
   findCheckbox: ({
-    checkboxIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  selectedCheckboxes: Array<HTMLElement>
+  selectedCheckboxes: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
   toggleCheckbox: (TriggerCheckboxOptions) => Promise<void>
 }

/@react-aria/test-utils:ComboBoxTester

 ComboBoxTester {
   close: () => Promise<void>
-  combobox: HTMLElement
+  combobox: () => HTMLElement
   constructor: (ComboBoxTesterOpts) => void
   findOption: ({
-    optionIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  focusedOption: HTMLElement | null
-  listbox: HTMLElement | null
+  focusedOption: () => HTMLElement | null
+  listbox: () => HTMLElement | null
   open: (ComboBoxOpenOpts) => Promise<void>
   options: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  sections: Array<HTMLElement>
-  selectOption: (ComboBoxSelectOpts) => Promise<void>
+  sections: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
-  trigger: HTMLElement
+  toggleOptionSelection: (ComboBoxSelectOpts) => Promise<void>
+  trigger: () => HTMLElement
 }

/@react-aria/test-utils:DialogTester

 DialogTester {
   close: () => Promise<void>
   constructor: (DialogTesterOpts) => void
-  dialog: HTMLElement | null
+  dialog: () => HTMLElement | null
   open: (DialogOpenOpts) => Promise<void>
   setInteractionType: (UserOpts['interactionType']) => void
-  trigger: HTMLElement
+  trigger: () => HTMLElement
 }

/@react-aria/test-utils:GridListTester

 GridListTester {
   cells: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
   constructor: (GridListTesterOpts) => void
   findRow: ({
-    rowIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  gridlist: HTMLElement
-  rows: Array<HTMLElement>
-  selectedRows: Array<HTMLElement>
+  gridlist: () => HTMLElement
+  rows: () => Array<HTMLElement>
+  selectedRows: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
   toggleRowSelection: (GridListToggleRowOpts) => Promise<void>
   triggerRowAction: (GridListRowActionOpts) => Promise<void>
 }

/@react-aria/test-utils:ListBoxTester

 ListBoxTester {
   constructor: (ListBoxTesterOpts) => void
   findOption: ({
-    optionIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  listbox: HTMLElement
+  listbox: () => HTMLElement
   options: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  sections: Array<HTMLElement>
-  selectedOptions: Array<HTMLElement>
+  sections: () => Array<HTMLElement>
+  selectedOptions: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
   toggleOptionSelection: (ListBoxToggleOptionOpts) => Promise<void>
   triggerOptionAction: (ListBoxOptionActionOpts) => Promise<void>
 }

/@react-aria/test-utils:MenuTester

 MenuTester {
   close: () => Promise<void>
   constructor: (MenuTesterOpts) => void
   findOption: ({
-    optionIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  menu: HTMLElement | null
+  menu: () => HTMLElement | null
   open: (MenuOpenOpts) => Promise<void>
-  openSubmenu: (MenuOpenSubmenuOpts) => Promise<MenuTester | null>
+  openSubmenu: (MenuOpenSubmenuOpts) => Promise<MenuTester>
   options: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  sections: Array<HTMLElement>
-  selectOption: (MenuSelectOpts) => Promise<void>
+  sections: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
-  submenuTriggers: Array<HTMLElement>
-  trigger: HTMLElement
+  submenuTriggers: () => Array<HTMLElement>
+  toggleOptionSelection: (MenuSelectOpts) => Promise<void>
+  trigger: () => HTMLElement
 }

/@react-aria/test-utils:RadioGroupTester

 RadioGroupTester {
   constructor: (RadioGroupTesterOpts) => void
   findRadio: ({
-    radioIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  radiogroup: HTMLElement
-  radios: Array<HTMLElement>
-  selectedRadio: HTMLElement | null
+  radiogroup: () => HTMLElement
+  radios: () => Array<HTMLElement>
+  selectedRadio: () => HTMLElement | null
   setInteractionType: (UserOpts['interactionType']) => void
   triggerRadio: (TriggerRadioOptions) => Promise<void>
 }

/@react-aria/test-utils:SelectTester

 SelectTester {
   close: () => Promise<void>
   constructor: (SelectTesterOpts) => void
   findOption: ({
-    optionIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  listbox: HTMLElement | null
+  listbox: () => HTMLElement | null
   open: (SelectOpenOpts) => Promise<void>
   options: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  sections: Array<HTMLElement>
-  selectOption: (SelectTriggerOptionOpts) => Promise<void>
+  sections: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
-  trigger: HTMLElement
+  toggleOptionSelection: (SelectTriggerOptionOpts) => Promise<void>
+  trigger: () => HTMLElement
 }

/@react-aria/test-utils:TableTester

 TableTester {
   cells: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  columns: Array<HTMLElement>
+  columns: () => Array<HTMLElement>
   constructor: (TableTesterOpts) => void
   findCell: ({
     text: string
 }) => HTMLElement
   findRow: ({
-    rowIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  rowGroups: Array<HTMLElement>
-  rowHeaders: Array<HTMLElement>
-  rows: Array<HTMLElement>
-  selectedRows: Array<HTMLElement>
+  footerRows: () => Array<HTMLElement>
+  rowGroups: () => Array<HTMLElement>
+  rowHeaders: () => Array<HTMLElement>
+  rows: () => Array<HTMLElement>
+  selectedRows: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
-  table: HTMLElement
+  table: () => HTMLElement
   toggleRowExpansion: (TableToggleExpansionOpts) => Promise<void>
   toggleRowSelection: (TableToggleRowOpts) => Promise<void>
   toggleSelectAll: ({
     interactionType?: UserOpts['interactionType']
   toggleSort: (TableToggleSortOpts) => Promise<void>
   triggerColumnHeaderAction: (TableColumnHeaderActionOpts) => Promise<void>
   triggerRowAction: (TableRowActionOpts) => Promise<void>
 }

/@react-aria/test-utils:TabsTester

 TabsTester {
-  activeTabpanel: HTMLElement | null
+  activeTabpanel: () => HTMLElement | null
   constructor: (TabsTesterOpts) => void
   findTab: ({
-    tabIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  selectedTab: HTMLElement | null
+  selectedTab: () => HTMLElement | null
   setInteractionType: (UserOpts['interactionType']) => void
-  tablist: HTMLElement
-  tabpanels: Array<HTMLElement>
-  tabs: Array<HTMLElement>
+  tablist: () => HTMLElement
+  tabpanels: () => Array<HTMLElement>
+  tabs: () => Array<HTMLElement>
   triggerTab: (TriggerTabOptions) => Promise<void>
 }

/@react-aria/test-utils:TreeTester

 TreeTester {
   cells: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
   constructor: (TreeTesterOpts) => void
   findRow: ({
-    rowIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  rows: Array<HTMLElement>
-  selectedRows: Array<HTMLElement>
+  rows: () => Array<HTMLElement>
+  selectedRows: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
   toggleRowExpansion: (TreeToggleExpansionOpts) => Promise<void>
   toggleRowSelection: (TreeToggleRowOpts) => Promise<void>
-  tree: HTMLElement
+  tree: () => HTMLElement
   triggerRowAction: (TreeRowActionOpts) => Promise<void>
 }

@react-spectrum/test-utils

/@react-spectrum/test-utils:CheckboxGroupTester

 CheckboxGroupTester {
-  checkboxes: Array<HTMLElement>
-  checkboxgroup: HTMLElement
+  checkboxes: () => Array<HTMLElement>
+  checkboxgroup: () => HTMLElement
   constructor: (CheckboxGroupTesterOpts) => void
   findCheckbox: ({
-    checkboxIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  selectedCheckboxes: Array<HTMLElement>
+  selectedCheckboxes: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
   toggleCheckbox: (TriggerCheckboxOptions) => Promise<void>
 }

/@react-spectrum/test-utils:ComboBoxTester

 ComboBoxTester {
   close: () => Promise<void>
-  combobox: HTMLElement
+  combobox: () => HTMLElement
   constructor: (ComboBoxTesterOpts) => void
   findOption: ({
-    optionIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  focusedOption: HTMLElement | null
-  listbox: HTMLElement | null
+  focusedOption: () => HTMLElement | null
+  listbox: () => HTMLElement | null
   open: (ComboBoxOpenOpts) => Promise<void>
   options: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  sections: Array<HTMLElement>
-  selectOption: (ComboBoxSelectOpts) => Promise<void>
+  sections: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
-  trigger: HTMLElement
+  toggleOptionSelection: (ComboBoxSelectOpts) => Promise<void>
+  trigger: () => HTMLElement
 }

/@react-spectrum/test-utils:DialogTester

 DialogTester {
   close: () => Promise<void>
   constructor: (DialogTesterOpts) => void
-  dialog: HTMLElement | null
+  dialog: () => HTMLElement | null
   open: (DialogOpenOpts) => Promise<void>
   setInteractionType: (UserOpts['interactionType']) => void
-  trigger: HTMLElement
+  trigger: () => HTMLElement
 }

/@react-spectrum/test-utils:GridListTester

 GridListTester {
   cells: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
   constructor: (GridListTesterOpts) => void
   findRow: ({
-    rowIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  gridlist: HTMLElement
-  rows: Array<HTMLElement>
-  selectedRows: Array<HTMLElement>
+  gridlist: () => HTMLElement
+  rows: () => Array<HTMLElement>
+  selectedRows: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
   toggleRowSelection: (GridListToggleRowOpts) => Promise<void>
   triggerRowAction: (GridListRowActionOpts) => Promise<void>
 }

/@react-spectrum/test-utils:ListBoxTester

 ListBoxTester {
   constructor: (ListBoxTesterOpts) => void
   findOption: ({
-    optionIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  listbox: HTMLElement
+  listbox: () => HTMLElement
   options: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  sections: Array<HTMLElement>
-  selectedOptions: Array<HTMLElement>
+  sections: () => Array<HTMLElement>
+  selectedOptions: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
   toggleOptionSelection: (ListBoxToggleOptionOpts) => Promise<void>
   triggerOptionAction: (ListBoxOptionActionOpts) => Promise<void>
 }

/@react-spectrum/test-utils:MenuTester

 MenuTester {
   close: () => Promise<void>
   constructor: (MenuTesterOpts) => void
   findOption: ({
-    optionIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  menu: HTMLElement | null
+  menu: () => HTMLElement | null
   open: (MenuOpenOpts) => Promise<void>
-  openSubmenu: (MenuOpenSubmenuOpts) => Promise<MenuTester | null>
+  openSubmenu: (MenuOpenSubmenuOpts) => Promise<MenuTester>
   options: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  sections: Array<HTMLElement>
-  selectOption: (MenuSelectOpts) => Promise<void>
+  sections: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
-  submenuTriggers: Array<HTMLElement>
-  trigger: HTMLElement
+  submenuTriggers: () => Array<HTMLElement>
+  toggleOptionSelection: (MenuSelectOpts) => Promise<void>
+  trigger: () => HTMLElement
 }

/@react-spectrum/test-utils:RadioGroupTester

 RadioGroupTester {
   constructor: (RadioGroupTesterOpts) => void
   findRadio: ({
-    radioIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  radiogroup: HTMLElement
-  radios: Array<HTMLElement>
-  selectedRadio: HTMLElement | null
+  radiogroup: () => HTMLElement
+  radios: () => Array<HTMLElement>
+  selectedRadio: () => HTMLElement | null
   setInteractionType: (UserOpts['interactionType']) => void
   triggerRadio: (TriggerRadioOptions) => Promise<void>
 }

/@react-spectrum/test-utils:SelectTester

 SelectTester {
   close: () => Promise<void>
   constructor: (SelectTesterOpts) => void
   findOption: ({
-    optionIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  listbox: HTMLElement | null
+  listbox: () => HTMLElement | null
   open: (SelectOpenOpts) => Promise<void>
   options: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  sections: Array<HTMLElement>
-  selectOption: (SelectTriggerOptionOpts) => Promise<void>
+  sections: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
-  trigger: HTMLElement
+  toggleOptionSelection: (SelectTriggerOptionOpts) => Promise<void>
+  trigger: () => HTMLElement
 }

/@react-spectrum/test-utils:TableTester

 TableTester {
   cells: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
-  columns: Array<HTMLElement>
+  columns: () => Array<HTMLElement>
   constructor: (TableTesterOpts) => void
   findCell: ({
     text: string
 }) => HTMLElement
   findRow: ({
-    rowIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  rowGroups: Array<HTMLElement>
-  rowHeaders: Array<HTMLElement>
-  rows: Array<HTMLElement>
-  selectedRows: Array<HTMLElement>
+  footerRows: () => Array<HTMLElement>
+  rowGroups: () => Array<HTMLElement>
+  rowHeaders: () => Array<HTMLElement>
+  rows: () => Array<HTMLElement>
+  selectedRows: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
-  table: HTMLElement
+  table: () => HTMLElement
   toggleRowExpansion: (TableToggleExpansionOpts) => Promise<void>
   toggleRowSelection: (TableToggleRowOpts) => Promise<void>
   toggleSelectAll: ({
     interactionType?: UserOpts['interactionType']
   toggleSort: (TableToggleSortOpts) => Promise<void>
   triggerColumnHeaderAction: (TableColumnHeaderActionOpts) => Promise<void>
   triggerRowAction: (TableRowActionOpts) => Promise<void>
 }

/@react-spectrum/test-utils:TabsTester

 TabsTester {
-  activeTabpanel: HTMLElement | null
+  activeTabpanel: () => HTMLElement | null
   constructor: (TabsTesterOpts) => void
   findTab: ({
-    tabIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  selectedTab: HTMLElement | null
+  selectedTab: () => HTMLElement | null
   setInteractionType: (UserOpts['interactionType']) => void
-  tablist: HTMLElement
-  tabpanels: Array<HTMLElement>
-  tabs: Array<HTMLElement>
+  tablist: () => HTMLElement
+  tabpanels: () => Array<HTMLElement>
+  tabs: () => Array<HTMLElement>
   triggerTab: (TriggerTabOptions) => Promise<void>
 }

/@react-spectrum/test-utils:TreeTester

 TreeTester {
   cells: ({
     element?: HTMLElement
 }) => Array<HTMLElement>
   constructor: (TreeTesterOpts) => void
   findRow: ({
-    rowIndexOrText: number | string
+    indexOrText: number | string
 }) => HTMLElement
-  rows: Array<HTMLElement>
-  selectedRows: Array<HTMLElement>
+  rows: () => Array<HTMLElement>
+  selectedRows: () => Array<HTMLElement>
   setInteractionType: (UserOpts['interactionType']) => void
   toggleRowExpansion: (TreeToggleExpansionOpts) => Promise<void>
   toggleRowSelection: (TreeToggleRowOpts) => Promise<void>
-  tree: HTMLElement
+  tree: () => HTMLElement
   triggerRowAction: (TreeRowActionOpts) => Promise<void>
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants