|
| 1 | +import { expect, test } from '@playwright/test' |
| 2 | +import path from 'path' |
| 3 | +import { fileURLToPath } from 'url' |
| 4 | + |
| 5 | +import type { PayloadTestSDK } from '../../../__helpers/shared/sdk/index.js' |
| 6 | +import type { Config } from '../../payload-types.js' |
| 7 | + |
| 8 | +import { ensureCompilationIsDone } from '../../../__helpers/e2e/helpers.js' |
| 9 | +import { AdminUrlUtil } from '../../../__helpers/shared/adminUrlUtil.js' |
| 10 | +import { initPayloadE2ENoConfig } from '../../../__helpers/shared/initPayloadE2ENoConfig.js' |
| 11 | +import { TEST_TIMEOUT_LONG } from '../../../playwright.config.js' |
| 12 | +import { lexicalSlugFieldNameCollisionSlug } from '../../slugs.js' |
| 13 | +import { LexicalHelpers } from '../utils.js' |
| 14 | + |
| 15 | +const filename = fileURLToPath(import.meta.url) |
| 16 | +const currentFolder = path.dirname(filename) |
| 17 | +const dirname = path.resolve(currentFolder, '../../') |
| 18 | + |
| 19 | +let payload: PayloadTestSDK<Config> |
| 20 | +let serverURL: string |
| 21 | + |
| 22 | +const { beforeAll, beforeEach, describe } = test |
| 23 | + |
| 24 | +// Repro: dropping an image mounts two bulk upload drawers for the same slug, |
| 25 | +// one blank, when a top-level rich text field name equals the collection slug. |
| 26 | +describe('Lexical: collection slug equals top-level field name', () => { |
| 27 | + let lexical: LexicalHelpers |
| 28 | + |
| 29 | + beforeAll(async ({ browser }, testInfo) => { |
| 30 | + testInfo.setTimeout(TEST_TIMEOUT_LONG) |
| 31 | + process.env.SEED_IN_CONFIG_ONINIT = 'false' |
| 32 | + ;({ payload, serverURL } = await initPayloadE2ENoConfig<Config>({ dirname })) |
| 33 | + |
| 34 | + const page = await browser.newPage() |
| 35 | + await ensureCompilationIsDone({ page, serverURL }) |
| 36 | + await page.close() |
| 37 | + }) |
| 38 | + |
| 39 | + beforeEach(async ({ page }) => { |
| 40 | + const url = new AdminUrlUtil(serverURL, lexicalSlugFieldNameCollisionSlug) |
| 41 | + lexical = new LexicalHelpers(page) |
| 42 | + await page.goto(url.create) |
| 43 | + await lexical.editor.first().focus() |
| 44 | + }) |
| 45 | + |
| 46 | + test('drag/drop image opens exactly one bulk upload drawer when a field name matches the collection slug', async ({ |
| 47 | + page, |
| 48 | + }) => { |
| 49 | + const filePath = path.resolve(dirname, './collections/Upload/payload.jpg') |
| 50 | + |
| 51 | + await lexical.dropFile({ filePath }) |
| 52 | + |
| 53 | + await expect(page.locator('.bulk-upload--actions-bar')).toBeVisible() |
| 54 | + |
| 55 | + // Two providers compute the same drawer slug and both mount a drawer; the |
| 56 | + // empty one is what the user sees as the blank drawer. Should be exactly 1. |
| 57 | + const bulkDrawers = page.locator( |
| 58 | + 'dialog[aria-label*="bulk-upload-drawer-slug"][open], dialog[id*="bulk-upload-drawer-slug"][open]', |
| 59 | + ) |
| 60 | + await expect(bulkDrawers).toHaveCount(1) |
| 61 | + }) |
| 62 | +}) |
0 commit comments