Files
2026-08-31 14:10:20 -03:00

169 lines
6.3 KiB
JavaScript

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('[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 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();
}
});
});
});