diff --git a/playwright/e2e/context-navigation.spec.ts b/playwright/e2e/context-navigation.spec.ts index fcada0d98c..6b6f498ebf 100644 --- a/playwright/e2e/context-navigation.spec.ts +++ b/playwright/e2e/context-navigation.spec.ts @@ -4,12 +4,23 @@ */ import { test, expect } from '../support/fixtures' +import type { Page } from '@playwright/test' import { createContext, ensureNavigationOpen } from '../support/commands' -function appMenuEntry(page: import('@playwright/test').Page, contextTitle: string) { - return page - .locator('nav[aria-label="Applications menu"]') - .locator(`[title="${contextTitle}"]`) +// Returns the locator for an app menu entry, opening the NC34 waffle popover first if needed. +async function getAppMenuEntry(page: Page, contextTitle: string) { + const waffleBtn = page.locator('button.app-menu__waffle') + if (await waffleBtn.isVisible().catch(() => false)) { + // NC34+: app entries live inside a popover opened by the waffle button + const isExpanded = await waffleBtn.getAttribute('aria-expanded').catch(() => null) + if (isExpanded !== 'true') { + await waffleBtn.click() + await page.waitForTimeout(300) + } + return page.locator(`.app-menu__grid .app-item[title="${contextTitle}"]`) + } + // NC33: entries are always visible inline in the header nav + return page.locator('nav[aria-label="Applications menu"]').locator(`[title="${contextTitle}"]`) } test.describe('Test context navigation', () => { @@ -21,7 +32,7 @@ test.describe('Test context navigation', () => { await createContext(page, contextTitle, false) await page.reload({ waitUntil: 'domcontentloaded' }) await ensureNavigationOpen(page) - await expect(appMenuEntry(page, contextTitle)).toBeHidden() + await expect(await getAppMenuEntry(page, contextTitle)).toBeHidden() const contextButton = page .locator('[data-cy="navigationContextItem"]') @@ -49,6 +60,6 @@ test.describe('Test context navigation', () => { page.locator('[data-cy="navigationContextShowInNavSwitch"] input'), ).toBeChecked() - await expect(appMenuEntry(page, contextTitle)).toBeVisible() + await expect(await getAppMenuEntry(page, contextTitle)).toBeVisible() }) }) diff --git a/playwright/e2e/tables-sharing-link.spec.ts b/playwright/e2e/tables-sharing-link.spec.ts index ae831bb38a..25aa814ad9 100644 --- a/playwright/e2e/tables-sharing-link.spec.ts +++ b/playwright/e2e/tables-sharing-link.spec.ts @@ -4,7 +4,7 @@ */ import { test, expect } from '../support/fixtures' -import type { Page } from '@playwright/test' +import type { Page, Response } from '@playwright/test' import { loadTable } from '../support/commands' async function setupPublicShareTable(page: Page, title: string) { @@ -55,6 +55,9 @@ async function createPublicLinkShare(page: Page, options: { password?: string, p return shareToken as string } +const isPermissionsPut = (r: Response) => + r.url().includes('/share/') && r.url().includes('/permissions') && r.request().method() === 'PUT' + async function setSharePermissions(page: Page, permissions: { read?: boolean, create?: boolean, update?: boolean, delete?: boolean }) { const isCanEdit = permissions.read && permissions.create && permissions.update && permissions.delete const isViewOnly = permissions.read && !permissions.create && !permissions.update && !permissions.delete @@ -62,9 +65,14 @@ async function setSharePermissions(page: Page, permissions: { read?: boolean, cr await page.locator('.share-permission-select .action-item__menutoggle').click() if (isCanEdit) { + // Register listener before click to avoid missing the response on fast servers + const permResponse = page.waitForResponse(isPermissionsPut) await page.locator('button[role="menuitemradio"]').filter({ hasText: 'Can edit' }).click() + await permResponse } else if (isViewOnly) { + const permResponse = page.waitForResponse(isPermissionsPut) await page.locator('button[role="menuitemradio"]').filter({ hasText: 'View only' }).click() + await permResponse } else { await page.locator('button[role="menuitemradio"]').filter({ hasText: 'Custom permissions' }).click() for (const [key, value] of Object.entries(permissions)) { @@ -72,15 +80,13 @@ async function setSharePermissions(page: Page, permissions: { read?: boolean, cr const checkbox = page.locator(`[data-cy="sharePermission${key.charAt(0).toUpperCase() + key.slice(1)}"] input[type="checkbox"]`) const isChecked = await checkbox.isChecked() if (isChecked !== value) { + const permResponse = page.waitForResponse(isPermissionsPut) await checkbox.click({ force: true }) - await page.waitForResponse(r => r.url().includes('/share/') && r.url().includes('/permissions') && r.request().method() === 'PUT') + await permResponse await page.waitForResponse(r => r.url().includes('/apps/tables/share/') && r.request().method() === 'GET') } } - return } - - await page.waitForResponse(r => r.url().includes('/share/') && r.url().includes('/permissions') && r.request().method() === 'PUT') } test.describe('Public link sharing', () => {