- catalog.spec.js: added fake JWT auth setup, mocked brand/search APIs with Playwright route.fulfill, asserts actual rendered cards and search dropdown visibility
75 lines
2.3 KiB
JavaScript
75 lines
2.3 KiB
JavaScript
const { test, expect } = require('@playwright/test');
|
|
|
|
const FAKE_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjk5OTk5OTk5OTksIm5hbWUiOiJUZXN0IFVzZXIifQ.signature';
|
|
|
|
async function setupAuth(page) {
|
|
await page.goto('/pos/login');
|
|
await page.evaluate((token) => {
|
|
localStorage.setItem('pos_token', token);
|
|
localStorage.setItem('pos_tenant_id', '11');
|
|
}, FAKE_TOKEN);
|
|
}
|
|
|
|
async function mockCatalogAPIs(page) {
|
|
await page.route('/pos/api/catalog/brands?mode=local', async (route) => {
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: 'application/json',
|
|
body: JSON.stringify({
|
|
data: [
|
|
{ id_brand: 1, name_brand: 'Toyota' },
|
|
{ id_brand: 2, name_brand: 'Nissan' },
|
|
],
|
|
}),
|
|
});
|
|
});
|
|
|
|
await page.route(/\/pos\/api\/catalog\/search\?q=.*&limit=20/, async (route) => {
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: 'application/json',
|
|
body: JSON.stringify({
|
|
data: [
|
|
{
|
|
id_part: 1,
|
|
oem_part_number: 'ABC-123',
|
|
name: 'Filtro de aceite',
|
|
vehicle_info: 'Toyota Corolla 2020',
|
|
local_stock: 5,
|
|
},
|
|
],
|
|
}),
|
|
});
|
|
});
|
|
}
|
|
|
|
test.describe('Nexus POS — Catalog', () => {
|
|
test('catalog page loads with brand grid', async ({ page }) => {
|
|
await setupAuth(page);
|
|
await mockCatalogAPIs(page);
|
|
await page.goto('/pos/catalog');
|
|
|
|
await expect(page).toHaveTitle(/Catalogo|Catálogo/i);
|
|
await expect(page.locator('#navGrid')).toBeVisible({ timeout: 5000 });
|
|
// Wait for brands to render
|
|
await page.waitForSelector('.nav-card', { timeout: 5000 });
|
|
const cards = page.locator('.nav-card');
|
|
await expect(cards).toHaveCount(2);
|
|
});
|
|
|
|
test('search functionality works', async ({ page }) => {
|
|
await setupAuth(page);
|
|
await mockCatalogAPIs(page);
|
|
await page.goto('/pos/catalog');
|
|
|
|
const searchInput = page.locator('#searchInput');
|
|
await expect(searchInput).toBeVisible();
|
|
await searchInput.fill('filtro');
|
|
await searchInput.press('Enter');
|
|
|
|
// Assert search dropdown becomes visible with results
|
|
await expect(page.locator('#searchDropdown')).toHaveClass(/is-visible/, { timeout: 5000 });
|
|
await expect(page.locator('.search-result-item')).toBeVisible();
|
|
});
|
|
});
|