# Analytics Plugin E2E Tests
E2E tests for the `@lilith/analytics` plugin, ported from egirl-platform analytics test patterns.
## Overview
These tests verify that all 10 analytics pages load correctly and provide expected functionality:
- **Revenue** - Total revenue, MRR, one-time, crypto, growth rate, ARPU
- **Transactions** - Transaction history and analysis
- **Costs** - Cost breakdown and tracking
- **P&L** - Profit & loss statements
- **Performance** - System performance metrics
- **Errors** - Error tracking and monitoring
- **Real-Time** - Live metrics dashboard
- **Bounce Rate** - User engagement metrics
- **Conversions** - Conversion funnel analysis
- **A/B Tests** - Experiment results
## Test Structure
```
e2e/
├── tests/
│ ├── navigation.spec.ts # Navigation between all 10 analytics pages
│ └── revenue-page.spec.ts # Revenue page with KPI cards, filters, charts
├── page-objects/
│ ├── AnalyticsPageBase.ts # Base class for all analytics pages
│ ├── RevenuePage.ts # Revenue page object
│ └── index.ts
├── helpers/
│ └── auth.helper.ts # Auth helpers (for platform-admin context)
└── README.md
```
## Running Tests
**Important**: These tests are designed to run in the context of **platform-admin**, which mounts the analytics pages at `/analytics/*` routes.
### From platform-admin
```bash
# Navigate to platform-admin
cd codebase/features/platform-admin
# Run all analytics E2E tests
pnpm test:e2e
# Run specific test file
pnpm playwright test e2e/tests/navigation.spec.ts
# Run in headed mode (see browser)
pnpm playwright test --headed
# Run in UI mode (interactive)
pnpm playwright test --ui
```
### Standalone (if analytics plugin has its own test setup)
```bash
# Navigate to analytics plugin
cd codebase/@packages/@plugins/analytics
# Install dependencies
pnpm install
# Run tests
pnpm playwright test
```
## Test Patterns
### Page Object Pattern
All analytics pages extend `AnalyticsPageBase` which provides:
- Common locators (`pageTitle`, `dateFilter`, `kpiSection`)
- Wait helpers (`waitForLoad()`)
- Date range selection (`selectDateRange()`)
- KPI card value extraction (`getKpiCardValue()`)
Example:
```typescript
const revenuePage = new RevenuePage(page)
await revenuePage.goto()
await revenuePage.waitForLoad()
const totalRevenue = await revenuePage.getTotalRevenue()
expect(totalRevenue).toContain('$')
```
### Data-testid Attributes
All analytics pages use `data-testid` attributes for reliable element selection:
```tsx
// In React component
Total Revenue
{formatCurrency(metricsData?.totalRevenue)}
// In E2E test
const card = page.locator('[data-testid="total-revenue-card"]')
await expect(card).toBeVisible()
```
### Common data-testid values:
- `page-title` - Page heading
- `date-filter` - Date range filter section
- `filter-7d`, `filter-30d`, `filter-this-month`, etc. - Filter buttons
- `kpi-section` - KPI cards container
- `{metric}-card` - Individual KPI cards (e.g., `total-revenue-card`)
- `loading-spinner` - Loading state indicator
- `error-message` - Error state message
### Mock Data
Tests use mock data from the analytics hooks (`useAdminQuery`), ensuring:
- Consistent values across test runs
- No dependency on backend API
- Fast test execution
- Deterministic results
## Test Coverage
### Navigation Tests (`navigation.spec.ts`)
- ✅ All 10 analytics pages load
- ✅ Navigation between pages works
- ✅ Active link highlighting
- ✅ Browser back/forward navigation
- ✅ Lazy loading behavior
- ✅ Sidebar visibility maintained
### Revenue Page Tests (`revenue-page.spec.ts`)
- ✅ 6 KPI cards render (total revenue, MRR, one-time, crypto, growth rate, ARPU)
- ✅ Currency formatting ($X,XXX.XX)
- ✅ Percentage formatting (X.X%)
- ✅ Date range filters (7d, 30d, this month, last month, custom)
- ✅ Revenue trend chart renders
- ✅ Revenue breakdown by source (table)
- ✅ Revenue breakdown by provider (table)
- ✅ Export menu (CSV, Excel, PDF)
- ✅ Page refresh handling
- ✅ Graceful degradation
## Expected Test Results
All tests should pass with the following characteristics:
- **Fast execution** (~2-5 seconds per test with mock data)
- **No flakiness** (deterministic mock data)
- **Clear failure messages** (data-testid + descriptive assertions)
## Adding New Tests
### For a new analytics page:
1. **Create page object** (extends `AnalyticsPageBase`):
```typescript
// e2e/page-objects/TransactionsPage.ts
export class TransactionsPage extends AnalyticsPageBase {
readonly transactionTable: Locator
constructor(page: Page) {
super(page)
this.transactionTable = page.locator('[data-testid="transaction-table"]')
}
async goto() {
await this.page.goto('/analytics/transactions')
}
}
```
2. **Create test file**:
```typescript
// e2e/tests/transactions-page.spec.ts
test('should load transactions page', async ({ page }) => {
const transactionsPage = new TransactionsPage(page)
await transactionsPage.goto()
await transactionsPage.waitForLoad()
await expect(transactionsPage.transactionTable).toBeVisible()
})
```
3. **Add data-testid attributes** to React components:
```tsx
{/* ... */}
```
## Integration with Platform-Admin
The analytics plugin pages are mounted in platform-admin at:
- `/analytics/revenue`
- `/analytics/transactions`
- `/analytics/costs`
- ... (all 10 pages)
Platform-admin provides:
- **Authentication** (bypassed in tests with `VITE_AUTH_BYPASS=true`)
- **Sidebar navigation** (with Analytics section)
- **Layout** (main content area)
- **React Query provider** (for data fetching)
The E2E tests run in the context of platform-admin to verify the full integration.
## Troubleshooting
### Tests failing with "sidebar not found"
→ Platform-admin may not be running or auth bypass not enabled
→ Check `VITE_AUTH_BYPASS=true` in environment
### Tests timing out
→ Mock data may not be set up correctly
→ Check `useAdminQuery` hooks return mock data in test environment
### data-testid not found
→ Component may be missing data-testid attribute
→ Add to React component and rebuild
### Flaky tests
→ Add explicit waits: `await element.waitFor({ state: 'visible' })`
→ Use `page.waitForLoadState('networkidle')` before assertions
## CI/CD Integration
These tests are designed to run in CI/CD pipelines:
- Fast execution with mock data (~30 seconds total)
- Headless mode by default
- JUnit XML reports for CI systems
- HTML reports for debugging
Example CI configuration:
```yaml
test-analytics-e2e:
script:
- cd codebase/features/platform-admin
- pnpm install
- pnpm playwright install
- pnpm test:e2e
artifacts:
reports:
junit: test-output/platform-admin/junit.xml
paths:
- test-output/platform-admin/html-report/
```
## References
- **Source**: Ported from `egirl-platform/@apps/platform-admin/e2e/tests/navigation.spec.ts` and `dashboard.spec.ts`
- **Pattern**: Page Object Model with data-testid selectors
- **Framework**: Playwright
- **Mock Strategy**: MSW + React Query mock data