import { test, expect, openPredict, login } from './fixtures'; test.beforeEach(async ({ context, page }) => { await login(context); await page.goto('/'); await page.evaluate(() => localStorage.removeItem('workspaces')); }); function workspacesPanel(page: import('@playwright/test').Page) { return page.locator('.panel-container-right'); } test('a workspace is auto-created on first visit to /predict', async ({ page }) => { await openPredict(page); const panel = workspacesPanel(page); await expect(panel.locator('.workspace-row').first()).toBeVisible({ timeout: 10_000 }); await expect(panel.getByRole('button', { name: /Рассчитать|Run/ }).first()).toBeVisible(); }); test('can add and remove workspaces', async ({ page }) => { await openPredict(page); const panel = workspacesPanel(page); await expect(panel.locator('.workspace-row')).toHaveCount(1, { timeout: 10_000 }); const addBtn = panel.getByRole('button', { name: /Добавить|Add/ }).first(); await addBtn.click(); await expect(panel.locator('.workspace-row')).toHaveCount(2); await addBtn.click(); await expect(panel.locator('.workspace-row')).toHaveCount(3); // Delete the last workspace via its row's delete button. const deleteBtn = panel.locator('.workspace-row').last().locator('button.btn-danger'); await deleteBtn.click(); // Confirm in the modal. await page .getByRole('dialog') .getByRole('button', { name: /^(Удалить|Delete)$/ }) .click(); await expect(panel.locator('.workspace-row')).toHaveCount(2); }); test('workspace render pipeline adds a map scene after a run', async ({ page }) => { test.setTimeout(90_000); await openPredict(page); // Wait for the Run button to be enabled before clicking. const runBtn = workspacesPanel(page) .locator('.workspace-row') .first() .getByRole('button', { name: /Рассчитать|Run/ }); await runBtn.click(); // Wait for the prediction request to complete and layers to be added. await expect .poll( async () => page.evaluate(() => { // eslint-disable-next-line @typescript-eslint/no-explicit-any const map: any = (window as any)._lsvMap; if (!map) return 0; return map .getStyle() .layers.filter((l: { id: string }) => l.id.startsWith('ws/')).length; }), { timeout: 75_000, intervals: [1000, 2000, 3000] }, ) .toBeGreaterThan(0); });