Files
zpan/e2e/responsive-dialogs.spec.ts
T
saltbo 6c1d7dc062 refactor(e2e): replace test.skip with grep tags for device filtering
Use @desktop/@tablet/@mobile/@all tags in test titles and project-level
grep patterns instead of runtime test.skip(). This eliminates ~90
spurious skipped tests — each project now only loads tests tagged for
its device.

Before: 144 total (43 pass, 101 skip)
After:  55 total (43 pass, 12 skip — admin-only skips)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:44:21 -04:00

94 lines
3.5 KiB
TypeScript

import { expect, test } from '@playwright/test'
import { createFolder, signUpAndGoToFiles } from './helpers'
// ---------------------------------------------------------------------------
// Dialogs responsive behavior
// ---------------------------------------------------------------------------
test.describe('File dialogs responsive', () => {
test('mobile: new folder dialog is usable @mobile', async ({ page }) => {
await signUpAndGoToFiles(page)
// Open new folder dialog
await page.getByRole('button', { name: /new folder|folder/i }).click()
const dialog = page.getByRole('dialog')
await expect(dialog).toBeVisible()
// Input should be visible and fillable
const input = dialog.getByRole('textbox')
await expect(input).toBeVisible()
await input.fill('test-mobile-folder')
// Buttons should be visible
await expect(dialog.getByRole('button', { name: /create/i })).toBeVisible()
await expect(dialog.getByRole('button', { name: /cancel/i })).toBeVisible()
// Dialog should not overflow viewport
const overflows = await dialog.evaluate((el) => {
const rect = el.getBoundingClientRect()
return rect.right > window.innerWidth || rect.left < 0
})
expect(overflows).toBe(false)
})
test('tablet: new folder dialog is usable @tablet', async ({ page }) => {
await signUpAndGoToFiles(page)
await page.getByRole('button', { name: /new folder|folder/i }).click()
const dialog = page.getByRole('dialog')
await expect(dialog).toBeVisible()
await expect(dialog.getByRole('textbox')).toBeVisible()
await expect(dialog.getByRole('button', { name: /create/i })).toBeVisible()
})
test('mobile: rename dialog is usable @mobile', async ({ page }) => {
await signUpAndGoToFiles(page)
await createFolder(page, 'rename-me')
// Open row actions dropdown via the last button in the row
const row = page.getByRole('row', { name: /rename-me/i })
await expect(row).toBeVisible({ timeout: 5000 })
await row.getByRole('button').last().click()
await page.getByRole('menuitem', { name: /rename/i }).click()
// Rename dialog should be visible and usable
const dialog = page.getByRole('dialog')
await expect(dialog).toBeVisible()
await expect(dialog.getByRole('textbox')).toBeVisible()
await expect(dialog.getByRole('button', { name: /rename/i })).toBeVisible()
await expect(dialog.getByRole('button', { name: /cancel/i })).toBeVisible()
// Dialog should not overflow
const overflows = await dialog.evaluate((el) => {
const rect = el.getBoundingClientRect()
return rect.right > window.innerWidth || rect.left < 0
})
expect(overflows).toBe(false)
})
test('mobile: move dialog is usable @mobile', async ({ page }) => {
await signUpAndGoToFiles(page)
await createFolder(page, 'move-me')
// Open row actions dropdown via the last button in the row
const row = page.getByRole('row', { name: /move-me/i })
await expect(row).toBeVisible({ timeout: 5000 })
await row.getByRole('button').last().click()
await page.getByRole('menuitem', { name: 'Move to', exact: true }).click()
// Move dialog should be visible
const dialog = page.getByRole('dialog')
await expect(dialog).toBeVisible()
await expect(dialog.getByRole('button', { name: /cancel/i })).toBeVisible()
// Dialog should not overflow
const overflows = await dialog.evaluate((el) => {
const rect = el.getBoundingClientRect()
return rect.right > window.innerWidth || rect.left < 0
})
expect(overflows).toBe(false)
})
})