181 lines
6.0 KiB
TypeScript
181 lines
6.0 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { waitForApiCall, acceptCookieConsent } from '../helpers/utils';
|
|
|
|
test.describe('Purchase Order Management', () => {
|
|
// Use authenticated state
|
|
test.use({ storageState: 'tests/.auth/user.json' });
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
// Accept cookie consent if present
|
|
await acceptCookieConsent(page);
|
|
});
|
|
|
|
test('should display action queue with pending purchase orders', async ({ page }) => {
|
|
await page.goto('/app/dashboard');
|
|
await acceptCookieConsent(page);
|
|
|
|
// Wait for page to load
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Look for action queue section
|
|
const actionQueue = page.locator('[data-testid="action-queue"], :has-text("Action Queue"), :has-text("Cola de Acciones")').first();
|
|
|
|
// Action queue should exist (even if empty)
|
|
if (await actionQueue.isVisible().catch(() => false)) {
|
|
await expect(actionQueue).toBeVisible();
|
|
}
|
|
});
|
|
|
|
test('should approve a pending purchase order', async ({ page }) => {
|
|
await page.goto('/app/dashboard');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Look for pending POs
|
|
const pendingPO = page.locator('[data-testid="pending-po"], [data-testid*="purchase-order"]').first();
|
|
|
|
if (await pendingPO.isVisible().catch(() => false)) {
|
|
// Get the PO details before approval
|
|
const poText = await pendingPO.textContent();
|
|
|
|
// Find and click Approve button
|
|
const approveButton = pendingPO.getByRole('button', { name: /approve|aprobar/i });
|
|
|
|
if (await approveButton.isVisible().catch(() => false)) {
|
|
await approveButton.click();
|
|
|
|
// Should show success message
|
|
await expect(page.locator('body')).toContainText(/approved|aprobado|success|éxito/i, {
|
|
timeout: 5000,
|
|
});
|
|
|
|
// PO should be removed from queue or marked as approved
|
|
await page.waitForTimeout(1000);
|
|
}
|
|
}
|
|
});
|
|
|
|
test('should reject a pending purchase order', async ({ page }) => {
|
|
await page.goto('/app/dashboard');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Look for pending POs
|
|
const pendingPO = page.locator('[data-testid="pending-po"], [data-testid*="purchase-order"]').first();
|
|
|
|
if (await pendingPO.isVisible().catch(() => false)) {
|
|
// Find and click Reject button
|
|
const rejectButton = pendingPO.getByRole('button', { name: /reject|rechazar|decline/i });
|
|
|
|
if (await rejectButton.isVisible().catch(() => false)) {
|
|
await rejectButton.click();
|
|
|
|
// Might show confirmation dialog
|
|
const confirmButton = page.getByRole('button', { name: /confirm|confirmar|yes|sí/i });
|
|
|
|
if (await confirmButton.isVisible({ timeout: 2000 }).catch(() => false)) {
|
|
await confirmButton.click();
|
|
}
|
|
|
|
// Should show success message
|
|
await expect(page.locator('body')).toContainText(/rejected|rechazado|declined/i, {
|
|
timeout: 5000,
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
test('should view purchase order details', async ({ page }) => {
|
|
await page.goto('/app/dashboard');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Look for pending POs
|
|
const pendingPO = page.locator('[data-testid="pending-po"], [data-testid*="purchase-order"]').first();
|
|
|
|
if (await pendingPO.isVisible().catch(() => false)) {
|
|
// Click on PO to view details
|
|
await pendingPO.click();
|
|
|
|
// Should show PO details (modal or new page)
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Look for detail view indicators
|
|
const detailsVisible = await page.locator('body').textContent();
|
|
expect(detailsVisible).toMatch(/details|detalles|items|productos|supplier|proveedor/i);
|
|
}
|
|
});
|
|
|
|
test('should create new purchase order from Add button', async ({ page }) => {
|
|
await page.goto('/app/dashboard');
|
|
|
|
// Click unified Add button
|
|
const addButton = page.getByRole('button', { name: /^add$|^añadir$|^\+$/i }).first();
|
|
|
|
if (await addButton.isVisible().catch(() => false)) {
|
|
await addButton.click();
|
|
|
|
// Wait for wizard/modal
|
|
await page.waitForTimeout(500);
|
|
|
|
// Look for purchase order option
|
|
const poOption = page.getByRole('button', { name: /purchase.*order|orden.*compra/i });
|
|
|
|
if (await poOption.isVisible().catch(() => false)) {
|
|
await poOption.click();
|
|
|
|
// Should show PO creation form
|
|
await expect(page.locator('body')).toContainText(/supplier|proveedor|product|producto/i);
|
|
}
|
|
}
|
|
});
|
|
|
|
test('should filter purchase orders by status', async ({ page }) => {
|
|
await page.goto('/app/operations/procurement');
|
|
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Look for filter options
|
|
const filterDropdown = page.locator('select, [role="combobox"]').filter({ hasText: /status|estado|filter/i }).first();
|
|
|
|
if (await filterDropdown.isVisible().catch(() => false)) {
|
|
// Select "Pending" filter
|
|
await filterDropdown.click();
|
|
|
|
const pendingOption = page.getByRole('option', { name: /pending|pendiente/i });
|
|
|
|
if (await pendingOption.isVisible().catch(() => false)) {
|
|
await pendingOption.click();
|
|
|
|
// Wait for filtered results
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Verify only pending POs are shown
|
|
const poItems = page.locator('[data-testid*="purchase-order"]');
|
|
const count = await poItems.count();
|
|
|
|
// Should have at least filtered the list
|
|
expect(count).toBeGreaterThanOrEqual(0);
|
|
}
|
|
}
|
|
});
|
|
|
|
test('should search for purchase orders', async ({ page }) => {
|
|
await page.goto('/app/operations/procurement');
|
|
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Look for search input
|
|
const searchInput = page.getByPlaceholder(/search|buscar/i);
|
|
|
|
if (await searchInput.isVisible().catch(() => false)) {
|
|
// Enter search term
|
|
await searchInput.fill('supplier');
|
|
|
|
// Wait for search results
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Should show filtered results
|
|
const bodyText = await page.locator('body').textContent();
|
|
expect(bodyText).toBeTruthy();
|
|
}
|
|
});
|
|
});
|