mirror of
https://github.com/saltbo/zpan.git
synced 2026-08-29 00:01:42 +08:00
6c1d7dc062
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>
94 lines
3.5 KiB
TypeScript
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)
|
|
})
|
|
})
|