From c4db5e75509e65e9ab1391f69eade9feec3bdbf4 Mon Sep 17 00:00:00 2001 From: consultoria-as Date: Wed, 29 Apr 2026 06:30:46 +0000 Subject: [PATCH] test(e2e): setup Playwright with login smoke test - Installed @playwright/test + Chromium - playwright.config.js: baseURL localhost:5001, Desktop Chrome - tests/e2e/login.spec.js: validates login form loads and invalid credentials show error --- package.json | 23 +++++++++++++++++++++++ playwright.config.js | 21 +++++++++++++++++++++ tests/e2e/login.spec.js | 25 +++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 package.json create mode 100644 playwright.config.js create mode 100644 tests/e2e/login.spec.js diff --git a/package.json b/package.json new file mode 100644 index 0000000..32ba934 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "autopartes", + "version": "1.0.0", + "description": "**POS + Catalogo de autopartes para refaccionarias mexicanas.**", + "main": "index.js", + "directories": { + "doc": "docs" + }, + "scripts": { + "test": "playwright test" + }, + "repository": { + "type": "git", + "url": "https://consultoria-as:b708144ceef22fef31217f1259a695005d67477b@git.consultoria-as.com/consultoria-as/Autoparts-DB.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "devDependencies": { + "@playwright/test": "^1.59.1" + } +} diff --git a/playwright.config.js b/playwright.config.js new file mode 100644 index 0000000..918b657 --- /dev/null +++ b/playwright.config.js @@ -0,0 +1,21 @@ +const { defineConfig, devices } = require('@playwright/test'); + +module.exports = defineConfig({ + testDir: './tests/e2e', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'list', + use: { + baseURL: 'http://localhost:5001', + trace: 'on-first-retry', + screenshot: 'only-on-failure', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}); diff --git a/tests/e2e/login.spec.js b/tests/e2e/login.spec.js new file mode 100644 index 0000000..5ee5b63 --- /dev/null +++ b/tests/e2e/login.spec.js @@ -0,0 +1,25 @@ +const { test, expect } = require('@playwright/test'); + +test.describe('Nexus POS — Login', () => { + test('login page loads with form', async ({ page }) => { + await page.goto('/pos/login'); + await expect(page).toHaveTitle(/Nexus|Login/i); + await expect(page.locator('input[name="username"], input[name="email"], #username, #email')).toBeVisible(); + await expect(page.locator('input[type="password"], #password')).toBeVisible(); + await expect(page.locator('button[type="submit"], .btn--primary')).toBeVisible(); + }); + + test('invalid credentials show error', async ({ page }) => { + await page.goto('/pos/login'); + const userInput = page.locator('input[name="username"], input[name="email"], #username, #email').first(); + const passInput = page.locator('input[type="password"], #password').first(); + const submitBtn = page.locator('button[type="submit"], .btn--primary').first(); + + await userInput.fill('invalid_user'); + await passInput.fill('wrong_password'); + await submitBtn.click(); + + // Expect error toast or message + await expect(page.locator('.toast, .alert, .error, [role="alert"]')).toBeVisible({ timeout: 5000 }); + }); +});