const { test, expect } = require('@playwright/test'); const { browserJson, getCurrentWorkspace, localized, login, uniqueName } = require('./helpers'); test('created workspace secret renders styled table actions', async ({ page }) => { const secretName = uniqueName('ui_secret'); await login(page); const workspace = await getCurrentWorkspace(page); await browserJson( page, 'POST', `/api/admin/workspaces/${encodeURIComponent(workspace.id)}/secrets`, { name: secretName, kind: 'token', value: 'demo-secret-value', }, ); await page.goto('/secrets'); const row = page.locator('#secrets-tbody tr').filter({ hasText: secretName }).first(); await expect(row).toBeVisible(); await expect(row.locator('[data-testid="secret-rotate-action"]')).toHaveClass(/btn-secondary/); await expect(row.locator('[data-testid="secret-rotate-action"]')).toHaveClass(/table-action-btn/); await expect(row.locator('[data-testid="secret-delete-action"]')).toHaveClass(/btn-danger/); await expect(row.locator('[data-testid="secret-delete-action"]')).toHaveClass(/table-action-btn/); }); test('secret modal shows fields for selected secret kind only', async ({ page }) => { await login(page); await page.goto('/secrets'); await page.locator('[data-testid="secret-create-button"]').click(); await expect(page.locator('[data-testid="secret-create-modal"]')).toBeVisible(); const stringField = page.locator('[data-kind-field="string"]'); const basicField = page.locator('[data-kind-field="basic"]'); const jsonField = page.locator('[data-kind-field="json"]'); const kindSelect = page.locator('[data-testid="secret-kind-select"]'); await expect(stringField).toBeVisible(); await expect(basicField).toBeHidden(); await expect(jsonField).toBeHidden(); await kindSelect.selectOption('username_password'); await expect(stringField).toBeHidden(); await expect(basicField).toBeVisible(); await expect(jsonField).toBeHidden(); await kindSelect.selectOption('header'); await expect(stringField).toBeVisible(); await expect(page.locator('#secret-string-label')).toHaveText(localized('Header value', 'Значение заголовка')); await expect(basicField).toBeHidden(); await expect(jsonField).toBeHidden(); await kindSelect.selectOption('generic'); await expect(stringField).toBeHidden(); await expect(basicField).toBeHidden(); await expect(jsonField).toBeVisible(); await kindSelect.selectOption('token'); await expect(stringField).toBeVisible(); await expect(page.locator('#secret-string-label')).toHaveText(localized('Token value', 'Значение токена')); await expect(basicField).toBeHidden(); await expect(jsonField).toBeHidden(); }); test('generic json secret modal stays inside compact viewport', async ({ page }) => { await page.setViewportSize({ width: 900, height: 520 }); await login(page); await page.goto('/secrets'); await page.locator('[data-testid="secret-create-button"]').click(); await page.locator('[data-testid="secret-kind-select"]').selectOption('generic'); const modal = page.locator('[data-testid="secret-create-modal"] .modal'); await expect(modal).toBeVisible(); const box = await modal.boundingBox(); expect(box).not.toBeNull(); expect(box.y).toBeGreaterThanOrEqual(0); expect(box.y + box.height).toBeLessThanOrEqual(520); await expect(page.locator('[data-testid="secret-name-input"]')).toBeVisible(); await expect(page.locator('[data-testid="secret-submit-button"]')).toBeVisible(); });