E2E-1.1 Create customer with full details
E2E-1.2 Submit without email shows validation
E2E-1.3 Cancel returns to customer list
E2E-1.4 Detail page has expected tabs
E2E-1.5 Edit customer and save
E2E-2.1 New Quote shows type selector
E2E-2.2 Select customer in wizard
E2E-2.3 Configure duration and currency
E2E-2.4 Add product item
E2E-2.5 Save Draft button state
E2E-2.6 Save & Generate creates quote and redirects
E2E-2.7 Navigate to a quote detail page
E2E-2.8 Mark as Sent and verify persistence
E2E-2.9 Reject and verify persistence
E2E-2.10 Duplicate from dropdown
E2E-3.1 Empty wizard shows validation messages
E2E-3.2 Save Draft disabled without customer
E2E-4.1 Select and bulk delete quotes
E2E-5.1 Add protected domain
E2E-5.2 Search filters to created domain
E2E-5.3 Delete domain with confirmation
E2E-6.1 View invoices for a customer
E2E-7.1 Invalid coupon shows error
E2E-8.1 Navigate to Pending Charges page
E2E-8.2 Empty state without customer selection
E2E-8.3 Select customer and view charges
E2E-8.4 Data grid columns are present
E2E-8.5 Select charges via checkboxes
E2E-8.6 Create Invoice button shows confirmation modal
E2E-8.7 Export CSV button works with selection
E2E-8.8 Clear selection button works
E2E-8.9 Row action dropdown has Create Invoice option
E2E-9.1 Quote detail page shows Convert dropdown for sent/accepted quotes
E2E-9.2 Convert dropdown shows both options
E2E-9.3 Convert & Invoice shows confirmation dialog
E2E-9.4 Convert is not shown for draft/closed quotes
E2E-10.1 Invoices page renders and loads data with customer
E2E-10.2 Licenses page renders and loads data with customer
E2E-10.3 Quotes page renders and loads data with customer
E2E-10.4 Pending Charges page renders correctly
E2E-10.5 Selected customer persists across page reload
E2E-10.6 Customer selection persists when navigating between pages
E2E-11.1 Create customer for lifecycle test
E2E-11.2 Enter Quote Wizard, add product, Save & Generate
E2E-11.3 Mark as Sent and verify status persists
E2E-11.4 Quote detail shows line items and customer info
E2E-11.5 Duplicate quote creates new draft
E2E-12.1 Navigate and select customer with pending charges
E2E-12.2 Select charge, confirm Create Invoice modal
E2E-12.3 Verify invoice appears in Invoices list
E2E-13.1 Create customer, navigate away, come back, still exists
E2E-13.2 Create quote for customer, verify it appears on customer detail
E2E-13.3 Edit customer company name, reload, verify persistence
E2E-13.4 Customer filter persists across pages
E2E-14.1 Coupons list page loads with data grid
E2E-14.2 Search filter works
E2E-14.3 Status filter works
E2E-14.4 Click coupon row navigates to edit page
E2E-15.1 Validation: empty form rejected
E2E-15.2 Conference Promo (Individuals Only)
E2E-15.3 Spring Deal (Private Users Only)
E2E-15.4 Paged Out! Magazine Promo (public code)
E2E-15.5 IDA Free Upgrade Incentive (new individual only)
E2E-15.6 Corporate Upgrade Push (companies only, non-academic)
E2E-15.7 Academic Classroom Promo (academics only)
E2E-15.8 Reseller Partner Internal Discount (resellers only)
E2E-15b.1 Apply On "Each Specified Item" shows item selector
E2E-15b.2 Can switch Plans to "Specific" and see plan checkboxes
E2E-15b.3 Addons section shows correctly
E2E-16.1 Edit page loads with fields disabled
Running Tests
# Start the dev server first
npm run dev
# Run the full E2E test suite (Jest + Playwright)
npm run test:e2e
# Run a specific test file
npx jest --config tests/jest.e2e.config.cjs tests/e2e/customers.test.cjs
# Run standalone scenario scripts
node tests/run-all-scenarios.cjs
node tests/deep-dive-scenarios.cjs
node tests/e2e-crud.cjs
node tests/e2e-csv-exports.cjs
Test Files
tests/e2e/customers.test.cjs Customer CRUD operations
tests/e2e/quotes.test.cjs Quote lifecycle, wizard validation, detail actions
tests/e2e/bulk-delete.test.cjs Quote bulk delete flow
tests/e2e/protected-leads.test.cjs Protected leads CRUD
tests/e2e/invoices-coupons.test.cjs Invoice actions and coupon validation
tests/e2e/pending-charges.test.cjs Pending charges page interactions
tests/e2e/pending-charges-crud.test.cjs Create invoice from pending charges
tests/e2e/quote-convert.test.cjs Quote convert actions
tests/e2e/list-pages.test.cjs List pages with customer selection and persistence
tests/e2e/quote-lifecycle.test.cjs Full quote lifecycle end-to-end
tests/e2e/data-persistence.test.cjs Data persistence across navigation
tests/e2e/coupons.test.cjs Coupon list, create campaigns, item targeting, edit
Authentication Bypass
const { chromium } = require('playwright');
const { createAuthenticatedPage } = require('./scripts/playwright-helpers.cjs');
const { browser, page } = await createAuthenticatedPage(chromium, {
email: 'admin@hex-rays.com',
baseUrl: 'http://localhost:3000',
});
// Take a full-page screenshot
await page.screenshot({ path: '/tmp/screenshot.png', fullPage: true });
await browser.close();
Configuration
# Jest config: tests/jest.e2e.config.cjs
# Playwright helpers: scripts/playwright-helpers.cjs
# Screenshots saved to: /tmp/ea-screenshots/
# Bug reports saved to: /tmp/ea-bugs-*.json