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) + }) +})