import { test, expect } from '@playwright/test'; test.describe('Admin - Pagamentos', () => { // TODO: Fazer login como admin antes de cada teste // test.beforeEach(async ({ page }) => { // await page.goto('/auth/login'); // await page.getByLabel(/email/i).fill('admin@teste.com'); // await page.getByLabel(/senha/i).fill('123456'); // await page.getByRole('button', { name: /entrar/i }).click(); // await page.waitForURL(/\/admin\/dashboard/); // }); test.describe('Lista de Pagamentos', () => { test.beforeEach(async ({ page }) => { await page.goto('/admin/dashboard/payments'); }); test('deve mostrar lista de pagamentos', async ({ page }) => { await expect(page.getByText(/pagamentos|payments/i)).toBeVisible(); }); test('deve ter link para visualização por turma', async ({ page }) => { await expect(page.getByRole('link', { name: /por turma|by class/i })).toBeVisible(); }); test('deve mostrar colunas principais', async ({ page }) => { await expect(page.getByText(/aluno/i)).toBeVisible(); await expect(page.getByText(/valor|amount/i)).toBeVisible(); await expect(page.getByText(/status/i)).toBeVisible(); await expect(page.getByText(/vencimento|due date/i)).toBeVisible(); }); }); test.describe('Pagamentos por Turma', () => { test.beforeEach(async ({ page }) => { await page.goto('/admin/dashboard/payments/by-class'); }); test('deve mostrar cards de turmas', async ({ page }) => { await expect(page.getByText(/turmas|classes/i)).toBeVisible(); }); test('deve expandir turma ao clicar', async ({ page }) => { const firstClassCard = page.locator('.bg-white, .dark\\:bg-neutral-800').first(); await firstClassCard.click(); // Deve mostrar tabela de pagamentos dentro await expect(page.locator('table')).toBeVisible(); }); test('deve mostrar filtros de status', async ({ page }) => { const statusFilter = page.getByRole('combobox'); if (await statusFilter.isVisible()) { await statusFilter.selectOption('pending'); await page.waitForTimeout(500); // Verificar se filtrou } }); test('deve ter botões expandir/recolher todos', async ({ page }) => { await expect(page.getByRole('button', { name: /expandir/i })).toBeVisible(); await expect(page.getByRole('button', { name: /recolher/i })).toBeVisible(); }); test('deve mostrar estatísticas', async ({ page }) => { await expect(page.getByText(/pendentes/i)).toBeVisible(); await expect(page.getByText(/aguardando verificação/i)).toBeVisible(); await expect(page.getByText(/pagos/i)).toBeVisible(); }); }); test.describe('Aprovação de Pagamento', () => { test('deve mostrar botões de aprovar/rejeitar para pagamentos pendentes', async ({ page }) => { await page.goto('/admin/dashboard/payments/by-class'); // Expandir primeira turma const firstClassCard = page.locator('.bg-white, .dark\\:bg-neutral-800').first(); await firstClassCard.click(); // Procurar botões de ação const approveButton = page.getByRole('button').filter({ hasText: /aprovar|check/i }).first(); const rejectButton = page.getByRole('button').filter({ hasText: /rejeitar|x/i }).first(); // Podem não existir pagamentos pendentes // if (await approveButton.isVisible()) { // await expect(rejectButton).toBeVisible(); // } }); test('deve abrir modal de rejeição ao clicar em rejeitar', async ({ page }) => { await page.goto('/admin/dashboard/payments/by-class'); // Expandir e procurar pagamento para rejeitar const firstClassCard = page.locator('.bg-white, .dark\\:bg-neutral-800').first(); await firstClassCard.click(); const rejectButton = page.getByRole('button').filter({ hasText: /rejeitar|x/i }).first(); if (await rejectButton.isVisible()) { await rejectButton.click(); // Deve abrir modal await expect(page.getByText(/motivo da rejeição/i)).toBeVisible(); await expect(page.getByRole('button', { name: /confirmar/i })).toBeVisible(); await expect(page.getByRole('button', { name: /cancelar/i })).toBeVisible(); } }); test('deve ver comprovante', async ({ page }) => { await page.goto('/admin/dashboard/payments/by-class'); // Procurar botão de ver comprovante const viewReceiptButton = page.getByRole('button').filter({ hasText: /ver|olho/i }).first(); if (await viewReceiptButton.isVisible()) { await viewReceiptButton.click(); // Deve abrir modal await expect(page.locator('.fixed.inset-0')).toBeVisible(); await expect(page.getByRole('button', { name: /fechar|✕/i })).toBeVisible(); } }); }); test.describe('Labels/Badges de Status', () => { test('deve mostrar badge correto para cada status', async ({ page }) => { await page.goto('/admin/dashboard/payments/by-class'); // Status possíveis: pending_verification, verified, rejected, pending const statuses = [/aguardando/i, /pago|verificado/i, /rejeitado/i, /pendente/i]; for (const status of statuses) { const badge = page.getByText(status).first(); if (await badge.isVisible()) { // Badge deve ter classes de cor await expect(badge).toBeVisible(); } } }); }); test.describe('Hover Cards', () => { test('deve ter hover suave nos cards de turma', async ({ page }) => { await page.goto('/admin/dashboard/payments/by-class'); const firstClassCard = page.locator('.bg-white, .dark\\:bg-neutral-800').first(); // Hover não deve mudar drasticamente await firstClassCard.hover(); await page.waitForTimeout(100); // Verificar se card ainda visível e funcional await expect(firstClassCard).toBeVisible(); }); test('deve ter hover suave nas linhas da tabela', async ({ page }) => { await page.goto('/admin/dashboard/payments/by-class'); const firstClassCard = page.locator('.bg-white, .dark\\:bg-neutral-800').first(); await firstClassCard.click(); const tableRow = page.locator('tr').nth(1); // Pular header if (await tableRow.isVisible()) { await tableRow.hover(); await page.waitForTimeout(100); await expect(tableRow).toBeVisible(); } }); }); });