openpencil/tests/e2e/export/basic.spec.ts
2026-06-06 11:31:24 +03:00

96 lines
2.9 KiB
TypeScript

import { test, expect, type Page } from '@playwright/test'
import { expectInViewport } from '#tests/e2e/fixtures'
import { CanvasHelper } from '#tests/helpers/canvas'
let page: Page
let canvas: CanvasHelper
test.describe.configure({ mode: 'serial' })
test.beforeAll(async ({ browser }) => {
page = await browser.newPage()
await page.goto('/')
canvas = new CanvasHelper(page)
await canvas.waitForInit()
await canvas.clearCanvas()
await canvas.drawRect(200, 200, 100, 100)
})
test.afterAll(async () => {
await page.close()
})
function exportItems() {
return page.getByTestId('export-item')
}
test('add export row increases row count', async () => {
const before = await exportItems().count()
await page.getByTestId('export-section-add').click()
await canvas.waitForRender()
const after = await exportItems().count()
expect(after).toBe(before + 1)
canvas.assertNoErrors()
})
test('remove export row decreases row count', async () => {
await page.getByTestId('export-section-add').click()
await canvas.waitForRender()
const before = await exportItems().count()
await exportItems().first().locator('button').last().click()
await canvas.waitForRender()
const after = await exportItems().count()
expect(after).toBe(before - 1)
canvas.assertNoErrors()
})
test('format selector changes to JPG', async () => {
const formatTrigger = exportItems().first().getByTestId('app-select-trigger').last()
await formatTrigger.hover()
await expect(page.locator('[role=tooltip]').filter({ hasText: 'Export format' })).toBeVisible()
await formatTrigger.click()
await expect(page.locator('[role=tooltip]').filter({ hasText: 'Export format' })).toHaveCount(0)
const jpgOption = page.locator('[role="option"]').filter({ hasText: 'JPG' })
await expect(jpgOption).toBeVisible()
await expectInViewport(page, jpgOption)
await jpgOption.click()
await canvas.waitForRender()
await expect(formatTrigger).toHaveText('JPG')
canvas.assertNoErrors()
})
test('SVG format hides scale selector', async () => {
const formatTrigger = exportItems().first().getByTestId('app-select-trigger').last()
await formatTrigger.click()
await page.locator('[role="option"]').filter({ hasText: 'SVG' }).click()
await canvas.waitForRender()
const selects = exportItems().first().getByTestId('app-select-trigger')
await expect(selects).toHaveCount(1)
canvas.assertNoErrors()
})
test('preview toggle shows image with blob src', async () => {
const formatTrigger = exportItems().first().getByTestId('app-select-trigger').last()
await formatTrigger.click()
await page.locator('[role="option"]').filter({ hasText: 'PNG' }).click()
await canvas.waitForRender()
await page.getByTestId('export-preview-toggle').click()
const img = page.getByTestId('export-section').locator('img')
await expect(img).toBeVisible({ timeout: 10000 })
const src = await img.getAttribute('src')
expect(src).toMatch(/^blob:/)
canvas.assertNoErrors()
})