diff --git a/packages/bruno-api-docs/e2e/components/layout/env-switcher.component.ts b/packages/bruno-api-docs/e2e/components/layout/env-switcher.component.ts index 355d160e..70cfe96e 100644 --- a/packages/bruno-api-docs/e2e/components/layout/env-switcher.component.ts +++ b/packages/bruno-api-docs/e2e/components/layout/env-switcher.component.ts @@ -14,6 +14,7 @@ export class EnvSwitcherComponent extends BaseComponent { readonly showVarsToggle = this.page.getByTestId('show-vars-toggle'); readonly trigger: Locator; readonly menu: Locator; + readonly surface: Locator; readonly emptyOption: Locator; constructor( @@ -23,6 +24,7 @@ export class EnvSwitcherComponent extends BaseComponent { super(page, page.getByTestId(`${base}-root`)); this.trigger = this.root.getByTestId(base); this.menu = this.page.getByTestId(`${base}-dropdown`); + this.surface = this.menu.locator('xpath=ancestor::div[@data-tippy-root]'); this.emptyOption = this.option('no-environments'); } diff --git a/packages/bruno-api-docs/e2e/tests/environments/env-switcher-menu-width.spec.ts b/packages/bruno-api-docs/e2e/tests/environments/env-switcher-menu-width.spec.ts new file mode 100644 index 00000000..31e23c92 --- /dev/null +++ b/packages/bruno-api-docs/e2e/tests/environments/env-switcher-menu-width.spec.ts @@ -0,0 +1,32 @@ +import { test, expect } from '../../playwright'; + +/** + * The environment switcher passes `matchTriggerWidth` to its MenuDropdown, so + * the menu is floored at the trigger's width and never renders narrower than the + * button that opened it. The env names here are short, so the menu's natural + * content sits at the dropdown's 10rem floor; we widen the trigger past that + * floor to prove the popover grows to match a wider trigger. + */ + +const DESKTOP = { width: 1280, height: 900 }; + +test.describe('env switcher menu width', () => { + test.use({ viewport: DESKTOP }); + + test('the menu is never narrower than the trigger that opened it', async ({ overviewPage, envSwitcher }) => { + await overviewPage.goto('/'); + + await envSwitcher.trigger.evaluate((el) => { + (el as HTMLElement).style.minWidth = '300px'; + }); + + await envSwitcher.open(); + await expect(envSwitcher.menu).toBeVisible(); + + const trigger = await envSwitcher.trigger.boundingBox(); + const surface = await envSwitcher.surface.boundingBox(); + if (trigger === null || surface === null) throw new Error('env switcher has no bounding box'); + + expect(surface.width).toBeGreaterThanOrEqual(trigger.width - 1); + }); +}); diff --git a/packages/bruno-api-docs/src/components/EnvSwitcher/EnvSwitcher.tsx b/packages/bruno-api-docs/src/components/EnvSwitcher/EnvSwitcher.tsx index d2971c8f..49200c48 100644 --- a/packages/bruno-api-docs/src/components/EnvSwitcher/EnvSwitcher.tsx +++ b/packages/bruno-api-docs/src/components/EnvSwitcher/EnvSwitcher.tsx @@ -64,6 +64,7 @@ const EnvSwitcher: React.FC = ({ testId = 'env-switcher' }) => selectedItemId={hasEnvironments ? activeEnv?.name : undefined} showTickMark={false} placement="bottom-end" + matchTriggerWidth testId={testId} >