diff --git a/tests/e2e/goals/goals.spec.ts b/tests/e2e/goals/goals.spec.ts new file mode 100644 index 0000000..e781f64 --- /dev/null +++ b/tests/e2e/goals/goals.spec.ts @@ -0,0 +1,262 @@ +import { test, expect } from '@playwright/test'; +import { test as authTest } from '../fixtures/auth.fixture'; +import { waitForPageLoad } from '../utils/helpers'; + +test.describe('Goals Dashboard', () => { + authTest('should display goals dashboard', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals'); + await waitForPageLoad(page); + + // Should show goals dashboard + await expect(page.locator('[data-testid="goals-dashboard"], .goals-dashboard, h1:has-text("Goals")')).toBeVisible(); + }); + + authTest('should show goals overview metrics', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals'); + await waitForPageLoad(page); + + // Should show key metrics (active goals, completed, progress) + const metricsContainer = page.locator('[data-testid="goals-metrics"], .goals-metrics, .stats-grid'); + if (await metricsContainer.isVisible()) { + const metricCards = page.locator('[data-testid="metric-card"], .metric-card, .stat-card'); + expect(await metricCards.count()).toBeGreaterThan(0); + } + }); + + authTest('should have navigation to definitions', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals'); + + const definitionsLink = page.locator('a[href*="definitions"]'); + if (await definitionsLink.isVisible()) { + await definitionsLink.click(); + await expect(page).toHaveURL(/\/goals\/definitions/); + } + }); + + authTest('should have navigation to my goals', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals'); + + const myGoalsLink = page.locator('a[href*="my-goals"]'); + if (await myGoalsLink.isVisible()) { + await myGoalsLink.click(); + await expect(page).toHaveURL(/\/goals\/my-goals/); + } + }); + + authTest('should have navigation to reports', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals'); + + const reportsLink = page.locator('a[href*="reports"]'); + if (await reportsLink.isVisible()) { + await reportsLink.click(); + await expect(page).toHaveURL(/\/goals\/reports/); + } + }); +}); + +test.describe('Goal Definitions', () => { + authTest('should display goal definitions list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/definitions'); + await waitForPageLoad(page); + + // Should show definitions page + await expect(page.locator('h1:has-text("Definitions"), h1:has-text("Goal"), [data-testid="definitions-page"]')).toBeVisible(); + }); + + authTest('should show definitions table or list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/definitions'); + await waitForPageLoad(page); + + // Should show table or list + const table = page.locator('table, [data-testid="definitions-table"], [data-testid="definitions-list"]'); + await expect(table).toBeVisible(); + }); + + authTest('should have create definition button for admin', async ({ adminPage: page }) => { + await page.goto('/dashboard/goals/definitions'); + + // Admin should see create button + const createButton = page.locator('button:has-text("New Goal"), button:has-text("Create"), [data-testid="create-definition"]'); + if (await createButton.isVisible()) { + await expect(createButton).toBeVisible(); + } + }); + + authTest('should open create definition modal/form', async ({ adminPage: page }) => { + await page.goto('/dashboard/goals/definitions'); + + const createButton = page.locator('button:has-text("New Goal"), button:has-text("Create"), [data-testid="create-definition"]'); + if (await createButton.isVisible()) { + await createButton.click(); + + // Should show form/modal + const form = page.locator('form, [data-testid="definition-form"], [role="dialog"]'); + await expect(form).toBeVisible(); + } + }); + + authTest('should show definition detail on row click', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/definitions'); + await waitForPageLoad(page); + + // Click first row if table has data + const firstRow = page.locator('table tbody tr, [data-testid="definition-row"]').first(); + if (await firstRow.isVisible()) { + await firstRow.click(); + // Should navigate to detail page + await expect(page).toHaveURL(/\/goals\/definitions\/.+/); + } + }); + + authTest('should filter definitions by status', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/definitions'); + await waitForPageLoad(page); + + // Look for status filter + const statusFilter = page.locator('[data-testid="status-filter"], select[name="status"]'); + if (await statusFilter.isVisible()) { + await statusFilter.click(); + } + }); +}); + +test.describe('My Goals', () => { + authTest('should display my goals page', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/my-goals'); + await waitForPageLoad(page); + + // Should show my goals page + await expect(page.locator('h1:has-text("My Goals"), [data-testid="my-goals-page"]')).toBeVisible(); + }); + + authTest('should show assigned goals list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/my-goals'); + await waitForPageLoad(page); + + // Should show goals list or cards + const goalsList = page.locator('table, [data-testid="my-goals-list"], .goals-list, .goals-grid'); + await expect(goalsList).toBeVisible(); + }); + + authTest('should show progress indicators', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/my-goals'); + await waitForPageLoad(page); + + // Look for progress bars or indicators + const progressIndicators = page.locator('[data-testid="goal-progress"], .progress-bar, .progress-indicator'); + if (await progressIndicators.count() > 0) { + await expect(progressIndicators.first()).toBeVisible(); + } + }); + + authTest('should filter by goal status', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/my-goals'); + await waitForPageLoad(page); + + // Look for status tabs or filter + const statusFilter = page.locator('[data-testid="status-tabs"], [data-testid="status-filter"], .status-tabs'); + if (await statusFilter.isVisible()) { + await statusFilter.click(); + } + }); + + authTest('should navigate to assignment detail', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/my-goals'); + await waitForPageLoad(page); + + // Click on a goal + const goalCard = page.locator('[data-testid="goal-card"], .goal-card, table tbody tr').first(); + if (await goalCard.isVisible()) { + await goalCard.click(); + // Should navigate to assignment detail + await expect(page).toHaveURL(/\/goals\/assignments\/.+/); + } + }); + + authTest('should update goal progress', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/my-goals'); + await waitForPageLoad(page); + + // Look for update progress button + const updateButton = page.locator('button:has-text("Update"), button:has-text("Log Progress"), [data-testid="update-progress"]').first(); + if (await updateButton.isVisible()) { + await updateButton.click(); + + // Should show progress form/modal + const progressForm = page.locator('[data-testid="progress-form"], [role="dialog"], form'); + await expect(progressForm).toBeVisible(); + } + }); +}); + +test.describe('Goal Reports', () => { + authTest('should display reports page', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/reports'); + await waitForPageLoad(page); + + // Should show reports page + await expect(page.locator('h1:has-text("Reports"), [data-testid="goal-reports-page"]')).toBeVisible(); + }); + + authTest('should show report filters', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/reports'); + await waitForPageLoad(page); + + // Should show date range or period filters + const filters = page.locator('[data-testid="report-filters"], .report-filters, input[type="date"]'); + await expect(filters).toBeVisible(); + }); + + authTest('should show report charts or tables', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/reports'); + await waitForPageLoad(page); + + // Should show charts or data tables + const reportContent = page.locator('[data-testid="report-content"], .report-chart, .report-table, table, canvas'); + await expect(reportContent).toBeVisible(); + }); + + authTest('should export report', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/goals/reports'); + await waitForPageLoad(page); + + // Look for export button + const exportButton = page.locator('button:has-text("Export"), button:has-text("Download"), [data-testid="export-report"]'); + if (await exportButton.isVisible()) { + await expect(exportButton).toBeVisible(); + } + }); + + authTest('should filter by team or user', async ({ adminPage: page }) => { + await page.goto('/dashboard/goals/reports'); + await waitForPageLoad(page); + + // Admin may have team/user filter + const teamFilter = page.locator('[data-testid="team-filter"], select[name="team"], [data-testid="user-filter"]'); + if (await teamFilter.isVisible()) { + await teamFilter.click(); + } + }); +}); + +test.describe('Goals - Unauthenticated', () => { + test('should redirect to login if not authenticated', async ({ page }) => { + await page.goto('/dashboard/goals'); + await expect(page).toHaveURL(/\/auth\/login/); + }); + + test('should redirect definitions page to login', async ({ page }) => { + await page.goto('/dashboard/goals/definitions'); + await expect(page).toHaveURL(/\/auth\/login/); + }); + + test('should redirect my-goals page to login', async ({ page }) => { + await page.goto('/dashboard/goals/my-goals'); + await expect(page).toHaveURL(/\/auth\/login/); + }); + + test('should redirect reports page to login', async ({ page }) => { + await page.goto('/dashboard/goals/reports'); + await expect(page).toHaveURL(/\/auth\/login/); + }); +}); diff --git a/tests/e2e/mlm/mlm.spec.ts b/tests/e2e/mlm/mlm.spec.ts new file mode 100644 index 0000000..36acb74 --- /dev/null +++ b/tests/e2e/mlm/mlm.spec.ts @@ -0,0 +1,232 @@ +import { test, expect } from '@playwright/test'; +import { test as authTest } from '../fixtures/auth.fixture'; +import { waitForPageLoad } from '../utils/helpers'; + +test.describe('MLM Dashboard', () => { + authTest('should display MLM dashboard', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm'); + await waitForPageLoad(page); + + // Should show MLM dashboard + await expect(page.locator('[data-testid="mlm-dashboard"], .mlm-dashboard, h1:has-text("MLM")')).toBeVisible(); + }); + + authTest('should show MLM overview metrics', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm'); + await waitForPageLoad(page); + + // Should show key metrics (network size, earnings, rank) + const metricsContainer = page.locator('[data-testid="mlm-metrics"], .mlm-metrics, .stats-grid'); + if (await metricsContainer.isVisible()) { + const metricCards = page.locator('[data-testid="metric-card"], .metric-card, .stat-card'); + expect(await metricCards.count()).toBeGreaterThan(0); + } + }); + + authTest('should have navigation to structures', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm'); + + const structuresLink = page.locator('a[href*="structures"]'); + if (await structuresLink.isVisible()) { + await structuresLink.click(); + await expect(page).toHaveURL(/\/mlm\/structures/); + } + }); + + authTest('should have navigation to my network', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm'); + + const networkLink = page.locator('a[href*="my-network"]'); + if (await networkLink.isVisible()) { + await networkLink.click(); + await expect(page).toHaveURL(/\/mlm\/my-network/); + } + }); + + authTest('should have navigation to earnings', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm'); + + const earningsLink = page.locator('a[href*="my-earnings"]'); + if (await earningsLink.isVisible()) { + await earningsLink.click(); + await expect(page).toHaveURL(/\/mlm\/my-earnings/); + } + }); +}); + +test.describe('MLM Structures', () => { + authTest('should display structures list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/structures'); + await waitForPageLoad(page); + + // Should show structures page + await expect(page.locator('h1:has-text("Structures"), [data-testid="structures-page"]')).toBeVisible(); + }); + + authTest('should show structures table', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/structures'); + await waitForPageLoad(page); + + // Should show table or list + const table = page.locator('table, [data-testid="structures-table"], [data-testid="structures-list"]'); + await expect(table).toBeVisible(); + }); + + authTest('should have create structure button for admin', async ({ adminPage: page }) => { + await page.goto('/dashboard/mlm/structures'); + + // Admin should see create button + const createButton = page.locator('button:has-text("New Structure"), button:has-text("Create"), [data-testid="create-structure"]'); + // May or may not be visible depending on role + if (await createButton.isVisible()) { + await expect(createButton).toBeVisible(); + } + }); + + authTest('should show structure detail on row click', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/structures'); + await waitForPageLoad(page); + + // Click first row if table has data + const firstRow = page.locator('table tbody tr, [data-testid="structure-row"]').first(); + if (await firstRow.isVisible()) { + await firstRow.click(); + // Should navigate to detail page + await expect(page).toHaveURL(/\/mlm\/structures\/.+/); + } + }); +}); + +test.describe('MLM Ranks', () => { + authTest('should display ranks list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/ranks'); + await waitForPageLoad(page); + + // Should show ranks page + await expect(page.locator('h1:has-text("Ranks"), [data-testid="ranks-page"]')).toBeVisible(); + }); + + authTest('should show ranks table or cards', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/ranks'); + await waitForPageLoad(page); + + // Should show ranks + const ranksView = page.locator('table, [data-testid="ranks-table"], [data-testid="ranks-grid"], .ranks-grid'); + await expect(ranksView).toBeVisible(); + }); + + authTest('should show rank progression', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/ranks'); + await waitForPageLoad(page); + + // Look for progression indicator + const progressIndicator = page.locator('[data-testid="rank-progress"], .rank-progress, .progress-bar'); + if (await progressIndicator.isVisible()) { + await expect(progressIndicator).toBeVisible(); + } + }); +}); + +test.describe('MLM My Network', () => { + authTest('should display my network page', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/my-network'); + await waitForPageLoad(page); + + // Should show network page + await expect(page.locator('h1:has-text("Network"), [data-testid="my-network-page"]')).toBeVisible(); + }); + + authTest('should show network tree or list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/my-network'); + await waitForPageLoad(page); + + // Should show tree visualization or list + const networkView = page.locator('[data-testid="network-tree"], [data-testid="network-list"], .network-tree, table'); + await expect(networkView).toBeVisible(); + }); + + authTest('should show network statistics', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/my-network'); + await waitForPageLoad(page); + + // Should show stats (total downline, active members, etc.) + const stats = page.locator('[data-testid="network-stats"], .network-stats'); + if (await stats.isVisible()) { + await expect(stats).toBeVisible(); + } + }); + + authTest('should navigate to node detail on click', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/my-network'); + await waitForPageLoad(page); + + // Click on a node if available + const node = page.locator('[data-testid="network-node"], .network-node, table tbody tr').first(); + if (await node.isVisible()) { + await node.click(); + // May navigate to node detail or show info + await page.waitForTimeout(500); + } + }); +}); + +test.describe('MLM My Earnings', () => { + authTest('should display earnings page', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/my-earnings'); + await waitForPageLoad(page); + + // Should show earnings page + await expect(page.locator('h1:has-text("Earnings"), [data-testid="my-earnings-page"]')).toBeVisible(); + }); + + authTest('should show earnings summary', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/my-earnings'); + await waitForPageLoad(page); + + // Should show earnings summary + const summary = page.locator('[data-testid="earnings-summary"], .earnings-summary, .stats-grid'); + await expect(summary).toBeVisible(); + }); + + authTest('should show earnings history', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/my-earnings'); + await waitForPageLoad(page); + + // Should show history table or list + const history = page.locator('table, [data-testid="earnings-history"], .earnings-history'); + await expect(history).toBeVisible(); + }); + + authTest('should filter earnings by period', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/mlm/my-earnings'); + await waitForPageLoad(page); + + // Look for period filter + const periodFilter = page.locator('[data-testid="period-filter"], select[name="period"], input[type="date"]'); + if (await periodFilter.isVisible()) { + await periodFilter.click(); + } + }); +}); + +test.describe('MLM - Unauthenticated', () => { + test('should redirect to login if not authenticated', async ({ page }) => { + await page.goto('/dashboard/mlm'); + await expect(page).toHaveURL(/\/auth\/login/); + }); + + test('should redirect structures page to login', async ({ page }) => { + await page.goto('/dashboard/mlm/structures'); + await expect(page).toHaveURL(/\/auth\/login/); + }); + + test('should redirect my-network page to login', async ({ page }) => { + await page.goto('/dashboard/mlm/my-network'); + await expect(page).toHaveURL(/\/auth\/login/); + }); + + test('should redirect my-earnings page to login', async ({ page }) => { + await page.goto('/dashboard/mlm/my-earnings'); + await expect(page).toHaveURL(/\/auth\/login/); + }); +}); diff --git a/tests/e2e/sales/sales.spec.ts b/tests/e2e/sales/sales.spec.ts new file mode 100644 index 0000000..d7722ff --- /dev/null +++ b/tests/e2e/sales/sales.spec.ts @@ -0,0 +1,212 @@ +import { test, expect } from '@playwright/test'; +import { test as authTest } from '../fixtures/auth.fixture'; +import { waitForPageLoad, fillForm, expectToast, getTableRowCount } from '../utils/helpers'; + +test.describe('Sales Dashboard', () => { + authTest('should display sales dashboard', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales'); + await waitForPageLoad(page); + + // Should show sales dashboard + await expect(page.locator('[data-testid="sales-dashboard"], .sales-dashboard, h1:has-text("Sales")')).toBeVisible(); + }); + + authTest('should show sales metrics cards', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales'); + await waitForPageLoad(page); + + // Should show key metrics + const metricsContainer = page.locator('[data-testid="sales-metrics"], .sales-metrics, .stats-grid'); + if (await metricsContainer.isVisible()) { + // Check for metric cards + const metricCards = page.locator('[data-testid="metric-card"], .metric-card, .stat-card'); + expect(await metricCards.count()).toBeGreaterThan(0); + } + }); + + authTest('should have navigation to leads', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales'); + + // Click on leads link + await page.click('a[href*="leads"]'); + await expect(page).toHaveURL(/\/sales\/leads/); + }); + + authTest('should have navigation to opportunities', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales'); + + // Click on opportunities link + await page.click('a[href*="opportunities"]'); + await expect(page).toHaveURL(/\/sales\/opportunities/); + }); +}); + +test.describe('Sales Leads', () => { + authTest('should display leads list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/leads'); + await waitForPageLoad(page); + + // Should show leads page + await expect(page.locator('h1:has-text("Leads"), [data-testid="leads-page"]')).toBeVisible(); + }); + + authTest('should show leads table or list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/leads'); + await waitForPageLoad(page); + + // Should show table or list + const table = page.locator('table, [data-testid="leads-table"], [data-testid="leads-list"]'); + await expect(table).toBeVisible(); + }); + + authTest('should have create lead button', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/leads'); + + // Should show create button + const createButton = page.locator('button:has-text("New Lead"), button:has-text("Create"), [data-testid="create-lead"]'); + await expect(createButton).toBeVisible(); + }); + + authTest('should open create lead modal/form', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/leads'); + + // Click create button + await page.click('button:has-text("New Lead"), button:has-text("Create"), [data-testid="create-lead"]'); + + // Should show form/modal + const form = page.locator('form, [data-testid="lead-form"], [role="dialog"]'); + await expect(form).toBeVisible(); + }); + + authTest('should filter leads by status', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/leads'); + await waitForPageLoad(page); + + // Look for status filter + const statusFilter = page.locator('[data-testid="status-filter"], select[name="status"], [data-testid="filter-dropdown"]'); + if (await statusFilter.isVisible()) { + await statusFilter.click(); + // Select a status option + await page.click('[data-testid="status-new"], [data-value="new"], option:has-text("New")'); + } + }); + + authTest('should search leads', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/leads'); + await waitForPageLoad(page); + + // Look for search input + const searchInput = page.locator('input[type="search"], input[placeholder*="search" i], [data-testid="search-input"]'); + if (await searchInput.isVisible()) { + await searchInput.fill('test'); + // Wait for results to update + await page.waitForTimeout(500); + } + }); + + authTest('should show lead detail on row click', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/leads'); + await waitForPageLoad(page); + + // Click first row if table has data + const firstRow = page.locator('table tbody tr, [data-testid="lead-row"]').first(); + if (await firstRow.isVisible()) { + await firstRow.click(); + // Should navigate to detail page + await expect(page).toHaveURL(/\/sales\/leads\/.+/); + } + }); +}); + +test.describe('Sales Opportunities', () => { + authTest('should display opportunities list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/opportunities'); + await waitForPageLoad(page); + + // Should show opportunities page + await expect(page.locator('h1:has-text("Opportunities"), [data-testid="opportunities-page"]')).toBeVisible(); + }); + + authTest('should show opportunities table or kanban', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/opportunities'); + await waitForPageLoad(page); + + // Should show table or kanban board + const view = page.locator('table, [data-testid="opportunities-table"], [data-testid="kanban-board"], .kanban'); + await expect(view).toBeVisible(); + }); + + authTest('should have create opportunity button', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/opportunities'); + + // Should show create button + const createButton = page.locator('button:has-text("New Opportunity"), button:has-text("Create"), [data-testid="create-opportunity"]'); + await expect(createButton).toBeVisible(); + }); + + authTest('should filter opportunities by stage', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/opportunities'); + await waitForPageLoad(page); + + // Look for stage filter + const stageFilter = page.locator('[data-testid="stage-filter"], select[name="stage"]'); + if (await stageFilter.isVisible()) { + await stageFilter.click(); + } + }); +}); + +test.describe('Sales Activities', () => { + authTest('should display activities list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/activities'); + await waitForPageLoad(page); + + // Should show activities page + await expect(page.locator('h1:has-text("Activities"), [data-testid="activities-page"]')).toBeVisible(); + }); + + authTest('should show activities calendar or list', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/activities'); + await waitForPageLoad(page); + + // Should show calendar or list view + const view = page.locator('table, [data-testid="activities-list"], [data-testid="activities-calendar"], .calendar'); + await expect(view).toBeVisible(); + }); + + authTest('should have create activity button', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/activities'); + + // Should show create button + const createButton = page.locator('button:has-text("New Activity"), button:has-text("Schedule"), [data-testid="create-activity"]'); + await expect(createButton).toBeVisible(); + }); + + authTest('should filter activities by type', async ({ authenticatedPage: page }) => { + await page.goto('/dashboard/sales/activities'); + await waitForPageLoad(page); + + // Look for type filter + const typeFilter = page.locator('[data-testid="type-filter"], select[name="type"]'); + if (await typeFilter.isVisible()) { + await typeFilter.click(); + } + }); +}); + +test.describe('Sales - Unauthenticated', () => { + test('should redirect to login if not authenticated', async ({ page }) => { + await page.goto('/dashboard/sales'); + await expect(page).toHaveURL(/\/auth\/login/); + }); + + test('should redirect leads page to login', async ({ page }) => { + await page.goto('/dashboard/sales/leads'); + await expect(page).toHaveURL(/\/auth\/login/); + }); + + test('should redirect opportunities page to login', async ({ page }) => { + await page.goto('/dashboard/sales/opportunities'); + await expect(page).toHaveURL(/\/auth\/login/); + }); +});