diff --git a/packages/app/e2e/browser/settings-navigation.spec.ts b/packages/app/e2e/browser/settings-navigation.spec.ts index bc8e1eedec..74c9bad13d 100644 --- a/packages/app/e2e/browser/settings-navigation.spec.ts +++ b/packages/app/e2e/browser/settings-navigation.spec.ts @@ -40,6 +40,8 @@ import { expectSettingsHostPickerLabel, openSettingsHostSection, removeCurrentHostFromSettings, + scrollSettingsSidebarToEnd, + expectSettingsSidebarScrollOffset, } from "../support/helpers/settings"; import { getServerId } from "../support/helpers/server-id"; import { expectAppRoute } from "../support/helpers/route-assertions"; @@ -77,6 +79,23 @@ test.describe("Settings sidebar navigation", () => { await expect(page).not.toHaveURL(/\/settings(\/|$)/); }); + test.describe("in a short window", () => { + test.use({ viewport: { width: 1280, height: 480 } }); + + test("selecting a section keeps the sidebar scroll position", async ({ page }) => { + const serverId = getServerId(); + await gotoAppShell(page); + await openSettings(page); + const offset = await scrollSettingsSidebarToEnd(page); + + await openSettingsHostSection(page, serverId, "plugins"); + await expectSettingsSidebarScrollOffset(page, offset); + + await openSettingsHostSection(page, serverId, "terminals"); + await expectSettingsSidebarScrollOffset(page, offset); + }); + }); + test("/h/[serverId]/settings redirects to the host connections section", async ({ page }) => { await gotoAppShell(page); await verifyLegacyHostSettingsRedirect(page); diff --git a/packages/app/e2e/support/helpers/settings.ts b/packages/app/e2e/support/helpers/settings.ts index 1702f7fe44..33b03225c8 100644 --- a/packages/app/e2e/support/helpers/settings.ts +++ b/packages/app/e2e/support/helpers/settings.ts @@ -453,3 +453,21 @@ export async function expectHostOnlineWithoutError(page: Page): Promise { await expect(page.getByTestId("host-page-identity")).toContainText("Online"); await expect(page.getByTestId("host-connection-error")).toHaveCount(0); } + +export async function scrollSettingsSidebarToEnd(page: Page): Promise { + const scrollBody = page.getByTestId("settings-sidebar-scroll-body"); + await expect(scrollBody).toBeVisible(); + await scrollBody.hover(); + await page.mouse.wheel(0, 10_000); + const readOffset = () => scrollBody.evaluate((node) => node.scrollTop); + await expect + .poll(readOffset, { message: "settings sidebar must overflow for this check" }) + .toBeGreaterThan(0); + await expect.poll(async () => (await readOffset()) - (await readOffset())).toBe(0); + return readOffset(); +} + +export async function expectSettingsSidebarScrollOffset(page: Page, offset: number): Promise { + const scrollBody = page.getByTestId("settings-sidebar-scroll-body"); + await expect.poll(() => scrollBody.evaluate((node) => node.scrollTop)).toBe(offset); +}