From 87d3e98aeca556c5335ed95d2f24b93ab582a52b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 25 Mar 2026 15:52:34 +0000
Subject: [PATCH 1/2] Initial plan
From 7fe4f871908804716e3ad2e0a177c9950461f4ac Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 25 Mar 2026 15:59:52 +0000
Subject: [PATCH 2/2] Add unit tests for displayInViewport prop forwarding in
SelectPanel
Co-authored-by: francinelucca <40550942+francinelucca@users.noreply.github.com>
Agent-Logs-Url: https://github.com/primer/react/sessions/8e495c09-d922-474d-819d-0d5e0d410e0b
---
.../src/SelectPanel/SelectPanel.test.tsx | 69 +++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/packages/react/src/SelectPanel/SelectPanel.test.tsx b/packages/react/src/SelectPanel/SelectPanel.test.tsx
index fae621080c7..de52939b1ac 100644
--- a/packages/react/src/SelectPanel/SelectPanel.test.tsx
+++ b/packages/react/src/SelectPanel/SelectPanel.test.tsx
@@ -10,6 +10,29 @@ import {IconButton} from '../Button'
import {ArrowLeftIcon} from '@primer/octicons-react'
import classes from './SelectPanel.test.module.css'
import {implementsClassName} from '../utils/testing'
+import {getAnchoredPosition} from '@primer/behaviors'
+import type {AnchorPosition} from '@primer/behaviors'
+
+// Mock getAnchoredPosition to verify displayInViewport is forwarded
+vi.mock('@primer/behaviors', async () => {
+ const actual = await vi.importActual('@primer/behaviors')
+ return {
+ ...actual,
+ getAnchoredPosition: vi.fn(
+ (
+ _floatingElement: Element,
+ _anchorElement: Element | DOMRect,
+ _settings?: Partial<{displayInViewport?: boolean}>,
+ ) =>
+ ({
+ top: 100,
+ left: 100,
+ anchorSide: 'outside-bottom',
+ anchorAlign: 'start',
+ }) as AnchorPosition,
+ ),
+ }
+})
// Instead of importing from live-region/__tests__/test-helpers.ts, we define our own getLiveRegion function
export function getLiveRegion(): LiveRegionElement {
@@ -1734,3 +1757,49 @@ for (const usingRemoveActiveDescendant of [false, true]) {
})
})
}
+
+describe('SelectPanel displayInViewport prop', () => {
+ const mockGetAnchoredPosition = vi.mocked(getAnchoredPosition)
+
+ beforeEach(() => {
+ mockGetAnchoredPosition.mockClear()
+ })
+
+ it('should forward displayInViewport={true} to getAnchoredPosition', async () => {
+ const user = userEvent.setup()
+ render()
+
+ await user.click(screen.getByRole('button', {name: 'Select items'}))
+
+ await waitFor(() => {
+ expect(screen.getByRole('listbox')).toBeInTheDocument()
+ })
+
+ await waitFor(() => {
+ expect(mockGetAnchoredPosition).toHaveBeenCalled()
+ })
+
+ const calls = mockGetAnchoredPosition.mock.calls
+ const lastCall = calls[calls.length - 1]
+ expect(lastCall[2]?.displayInViewport).toBe(true)
+ })
+
+ it('should not set displayInViewport when prop is not provided', async () => {
+ const user = userEvent.setup()
+ render()
+
+ await user.click(screen.getByRole('button', {name: 'Select items'}))
+
+ await waitFor(() => {
+ expect(screen.getByRole('listbox')).toBeInTheDocument()
+ })
+
+ await waitFor(() => {
+ expect(mockGetAnchoredPosition).toHaveBeenCalled()
+ })
+
+ const calls = mockGetAnchoredPosition.mock.calls
+ const lastCall = calls[calls.length - 1]
+ expect(lastCall[2]?.displayInViewport).not.toBe(true)
+ })
+})