Initial commit
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
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();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user