7.1 KiB
7.1 KiB
E2E Test Suite - Playwright
Comprehensive end-to-end tests for aInventory using Playwright, covering all major user workflows.
Directory Structure
frontend/e2e/
├── workflows/ # Test scenarios (5 modular workflows)
│ ├── 1-login.spec.ts # LDAP + local authentication
│ ├── 2-scan-adjust.spec.ts # Barcode scanning & stock adjustment
│ ├── 3-ai-extraction.spec.ts # AI-powered item onboarding
│ ├── 4-admin-settings.spec.ts # Admin dashboard configuration
│ └── 5-offline-sync.spec.ts # Offline queue & sync recovery
├── fixtures/ # Shared test infrastructure
│ ├── test-data.ts # Seed data, users, items
│ ├── db.ts # SQLite database setup/cleanup
│ ├── ldap.ts # OpenLDAP container management
│ └── auth.ts # Authentication helpers
├── utils/ # Utility functions
│ ├── assertions.ts # Custom Playwright matchers
│ ├── docker.ts # Container orchestration
│ └── helpers.ts # Navigation & DOM helpers
├── docker-compose.e2e.yml # Docker services template
├── playwright.config.ts # Playwright configuration
└── README.md # This file
Setup
Prerequisites
- Node.js 20+
- Docker & Docker Compose
- Playwright installed:
npm install
Installation
cd frontend
# Install Playwright
npm install
# Verify installation
npx playwright --version
Configuration
Edit playwright.config.ts to adjust:
baseURL: Application URL (default:http://localhost)timeout: Test timeout (default: 30s)retries: Retry on failure (default: 0 in dev, 2 in CI)workers: Parallel test workers (default: 5)
Environment Variables:
BASE_URL=http://localhost:3000
SKIP_LDAP=false # Skip LDAP tests if not configured
CI=false # Set to true for CI environment
Running Tests
All Tests
npx playwright test
Specific Workflow
npx playwright test 1-login.spec.ts
npx playwright test 2-scan-adjust.spec.ts
npx playwright test 3-ai-extraction.spec.ts
npx playwright test 4-admin-settings.spec.ts
npx playwright test 5-offline-sync.spec.ts
With Browser UI
npx playwright test --ui
Debug Mode
npx playwright test --debug
Generate Report
npx playwright test
npx playwright show-report
Test Workflows
1. Login (1-login.spec.ts)
- LDAP authentication
- Local user login
- Session persistence
- Logout functionality
- User identity display
Duration: ~30s | Tests: 14
2. Scan & Adjust (2-scan-adjust.spec.ts)
- Scanner interface initialization
- Barcode scanning
- Item matching
- Stock adjustment (check-in/check-out)
- Quantity validation
- Multiple consecutive scans
Duration: ~45s | Tests: 18
3. AI Extraction (3-ai-extraction.spec.ts)
- AI onboarding wizard
- Image capture
- AI-powered extraction (Gemini/Claude)
- Result validation
- Manual field editing
- Multi-item extraction
Duration: ~60s | Tests: 16
4. Admin Settings (4-admin-settings.spec.ts)
- Admin dashboard access
- User management (CRUD)
- Database configuration
- LDAP settings
- AI provider selection
- Category management
Duration: ~90s | Tests: 22
5. Offline Sync (5-offline-sync.spec.ts)
- Offline mode detection
- Operation queueing
- Sync on reconnection
- Duplicate prevention (UUID tracking)
- Queue persistence (IndexedDB)
- Sync history
Duration: ~120s | Tests: 14
Total: ~345s (~5.75 min) | Tests: 84
Docker Compose
E2E tests can run against Docker Compose services:
# Start services
docker-compose -f frontend/e2e/docker-compose.e2e.yml up -d
# Run tests
npx playwright test
# Stop services
docker-compose -f frontend/e2e/docker-compose.e2e.yml down
Test Data
Predefined users for testing:
- LDAP:
testuser1/Password123! - Local (Admin):
admin/AdminPassword123! - Local (User):
testuser2/UserPassword123!
Test items available in fixtures:
- Widget A (barcode: 123456789)
- Widget B (barcode: 987654321)
- Capacitor Pack (barcode: 555666777)
- Resistor Assortment (barcode: 111222333)
CI/CD Integration
For continuous integration:
# Run tests in CI mode
CI=true npx playwright test
# Generate JUnit report
npx playwright test --reporter=junit > test-results.xml
Troubleshooting
Tests Timing Out
- Increase timeout in
playwright.config.ts - Check backend service health:
http://localhost:8906/health - Verify Docker containers are running
LDAP Tests Failing
- Set
SKIP_LDAP=trueif LDAP unavailable - Check OpenLDAP container:
docker ps | grep ldap - Verify LDAP server is healthy
Network Issues
- Ensure Docker network bridge is active
- Check firewall rules
- Verify port availability (3000, 8906, 389)
Screenshot/Video Artifacts
- Check
test-results/directory - Videos saved on test failure
- Screenshots in failure mode
Development Tips
Writing New Tests
test('should do something', async ({ page }) => {
// 1. Setup: navigate and authenticate
await page.goto(BASE_URL);
await auth.loginWithLocalUser(page, credentials, BASE_URL);
// 2. Execute: perform user action
await page.click('[data-testid="button"]');
// 3. Assert: verify expected outcome
await assertions.assertSuccessMessage(page);
});
Using Fixtures
import * as auth from '../fixtures/auth';
import * as db from '../fixtures/db';
import { TEST_ITEMS } from '../fixtures/test-data';
Custom Assertions
import * as assertions from '../utils/assertions';
await assertions.assertUserAuthenticated(page);
await assertions.assertStockAdjustmentVisible(page, itemName);
Helpers
import * as helpers from '../utils/helpers';
await helpers.fillField(page, selector, value);
await helpers.clickAndWait(page, selector, 'navigation');
const text = await helpers.getText(page, selector);
Performance Targets
- Single workflow: <2 min
- All workflows: <6 min
- Parallel (5 workers): <2 min (CI mode)
Known Limitations
- jsdom Constraints: Video/canvas elements in jsdom don't fully simulate browser APIs
- AI Mocking: AI extraction tests use mocked responses for consistency
- LDAP Optional: LDAP tests skipped if service unavailable
- Offline Testing: NetworkError emulation may behave differently in real networks
Contributing
When adding new tests:
- Follow AAA pattern (Arrange, Act, Assert)
- Use
[data-testid]for element selection - Add test data to
fixtures/test-data.ts - Document new test scenarios in this README
- Keep tests modular and independent
References
Last Updated: 2026-04-19 Playwright Version: ^1.40.0 Maintainer: aInventory Development Team