Files
course-plat/tests/e2e/admin/categories.spec.js
T
2026-08-31 14:10:20 -03:00

164 lines
6.4 KiB
JavaScript

import { test, expect } from '@playwright/test';
test.describe('Admin - Categorias', () => {
// TODO: Fazer login como admin
// test.beforeEach(async ({ page }) => {
// await page.goto('/auth/login');
// await page.getByLabel(/email/i).fill('[email protected]');
// await page.getByLabel(/senha/i).fill('123456');
// await page.getByRole('button', { name: /entrar/i }).click();
// await page.waitForURL(/\/admin\/dashboard/);
// });
test.describe('Lista de Categorias', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/admin/dashboard/categories');
});
test('deve mostrar lista de categorias', async ({ page }) => {
await expect(page.getByText(/categorias|categories/i)).toBeVisible();
});
test('deve mostrar cor de cada categoria', async ({ page }) => {
const categoryCard = page.locator('[data-testid="category-card"], .card').first();
if (await categoryCard.isVisible()) {
// Deve ter badge/cor visual
const colorBadge = categoryCard.locator('[class*="bg-"]').first();
await expect(colorBadge).toBeVisible();
}
});
test('deve ter botão de adicionar nova categoria', async ({ page }) => {
await expect(page.getByRole('link', { name: /adicionar|nova|criar/i })).toBeVisible();
});
});
test.describe('Criar Nova Categoria', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/admin/dashboard/categories/add');
});
test('deve mostrar formulário de criação', async ({ page }) => {
await expect(page.getByLabel(/nome|name/i)).toBeVisible();
await expect(page.getByText(/cor|color/i)).toBeVisible();
await expect(page.getByRole('button', { name: /salvar|criar/i })).toBeVisible();
});
test('deve ter opções de cor para selecionar', async ({ page }) => {
// Deve ter seletor de cores ou botões de cor
const colorSelector = page.getByRole('combobox', { name: /cor|color/i });
const colorButtons = page.locator('[class*="bg-emerald-"], [class*="bg-blue-"], [class*="bg-red-"]');
const hasColorOption = await colorSelector.isVisible() || (await colorButtons.count()) > 0;
expect(hasColorOption).toBe(true);
});
test('deve criar categoria com dados válidos', async ({ page }) => {
const timestamp = Date.now();
await page.getByLabel(/nome|name/i).fill(`Categoria ${timestamp}`);
// Selecionar cor
const colorSelector = page.getByRole('combobox', { name: /cor|color/i });
if (await colorSelector.isVisible()) {
await colorSelector.selectOption({ index: 0 });
}
await page.getByRole('button', { name: /salvar|criar/i }).click();
// Deve redirecionar para lista ou mostrar sucesso
await expect(page).toHaveURL(/\/admin\/dashboard\/categories/, { timeout: 10000 });
});
test('deve validar nome obrigatório', async ({ page }) => {
await page.getByRole('button', { name: /salvar|criar/i }).click();
await expect(page.getByText(/nome.*obrigatório|required/i)).toBeVisible();
});
});
test.describe('Editar Categoria', () => {
test('deve carregar dados da categoria', async ({ page }) => {
// TODO: Usar ID de categoria de teste
await page.goto('/admin/dashboard/categories/edit/category-id');
await expect(page.getByLabel(/nome|name/i)).not.toBeEmpty();
});
test('deve permitir modificar nome e cor', async ({ page }) => {
await page.goto('/admin/dashboard/categories/edit/category-id');
await page.getByLabel(/nome|name/i).fill('Categoria Editada');
const colorSelector = page.getByRole('combobox', { name: /cor|color/i });
if (await colorSelector.isVisible()) {
await colorSelector.selectOption({ index: 1 });
}
await page.getByRole('button', { name: /salvar|atualizar/i }).click();
await expect(page).toHaveURL(/\/admin\/dashboard\/categories/, { timeout: 10000 });
});
});
test.describe('Excluir Categoria', () => {
test('deve confirmar antes de excluir', async ({ page }) => {
await page.goto('/admin/dashboard/categories');
const deleteButton = page.getByRole('button', { name: /excluir|delete/i }).first();
if (await deleteButton.isVisible()) {
await deleteButton.click();
await expect(page.getByText(/tem certeza|deseja excluir/i)).toBeVisible();
await expect(page.getByRole('button', { name: /confirmar|sim/i })).toBeVisible();
await expect(page.getByRole('button', { name: /cancelar|não/i })).toBeVisible();
}
});
test('deve excluir categoria sem arquivos vinculados', async ({ page }) => {
// TODO: Criar categoria sem arquivos e excluir
// await page.goto('/admin/dashboard/categories');
// await page.getByRole('button', { name: /excluir/i }).first().click();
// await page.getByRole('button', { name: /confirmar/i }).click();
// await expect(page.getByText(/categoria excluída|sucesso/i)).toBeVisible();
});
test('não deve excluir categoria com arquivos vinculados', async ({ page }) => {
// TODO: Tentar excluir categoria em uso
// await page.goto('/admin/dashboard/categories/edit/used-category');
// await page.getByRole('button', { name: /excluir/i }).click();
// await page.getByRole('button', { name: /confirmar/i }).click();
// await expect(page.getByText(/possui arquivos|em uso|vinculada/i)).toBeVisible();
});
});
test.describe('Cores de Categoria', () => {
test('deve ter múltiplas opções de cor', async ({ page }) => {
await page.goto('/admin/dashboard/categories/add');
const colorSelector = page.getByRole('combobox', { name: /cor|color/i });
if (await colorSelector.isVisible()) {
const options = await colorSelector.locator('option').count();
expect(options).toBeGreaterThan(1);
}
});
test('deve mostrar preview da cor selecionada', async ({ page }) => {
await page.goto('/admin/dashboard/categories/add');
const colorSelector = page.getByRole('combobox', { name: /cor|color/i });
if (await colorSelector.isVisible()) {
await colorSelector.selectOption({ index: 0 });
// Pode haver um preview visual
const colorPreview = page.locator('[class*="rounded-full"][class*="bg-"]').first();
if (await colorPreview.isVisible()) {
await expect(colorPreview).toBeVisible();
}
}
});
});
});