import path from 'node:path'; import { expect, test } from '@playwright/test'; test('viewer2d loads DWG, DXF, and an uploaded file', async ({ page }) => { await page.goto('/'); await page.getByRole('button', { name: 'Sample DWG' }).click(); await expect(page.locator('#status')).toContainText('✓ BasicSample.dwg · 7309 entities'); await page.getByRole('button', { name: 'Layers' }).click(); await expect(page.locator('#layerList label').first()).toBeVisible(); await page.getByRole('button', { name: 'Sample DXF' }).click(); await expect(page.locator('#status')).toContainText('✓ simple.dxf · 6 entities'); await page.locator('#file').setInputFiles( path.resolve('apps/viewer-2d-sample/public/samples/simple.dxf'), ); await expect(page.locator('#status')).toContainText('✓ simple.dxf · 6 entities'); }); test('viewer2d rejects cross-origin and oversized CAD input', async ({ page }) => { await page.goto('/?model=https://attacker.example/oversized.dxf'); await expect(page.locator('#status')).toContainText('같은 origin'); await page.goto('/'); await page.evaluate(() => { const file = new File([new Uint8Array(50 * 1024 * 1024 + 1)], 'oversized.dxf'); const transfer = new DataTransfer(); transfer.items.add(file); window.dispatchEvent(new DragEvent('drop', { dataTransfer: transfer })); }); await expect(page.locator('#status')).toContainText('50 MiB'); });