import { test, expect } from '@playwright/test'; // Test configuration const BASE_URL = process.env.BASE_URL || 'https://upskill-staging.measurequick.com'; // Updated URLs for new structure const URLS = { LOGIN: '/training-login/', TRAINER_DASHBOARD: '/trainer/dashboard/', MASTER_DASHBOARD: '/master-trainer/dashboard/', // Legacy URLs for redirect testing OLD_LOGIN: '/community-login/', OLD_TRAINER_DASHBOARD: '/hvac-dashboard/', OLD_MASTER_DASHBOARD: '/master-dashboard/', }; // Test credentials const TEST_TRAINER = { username: 'test_trainer', password: 'Test123!' }; const ADMIN_TRAINER = { username: 'admin_trainer', password: 'Admin123!' }; test.describe('Dashboard Navigation Tests', () => { test('Regular trainer should see Master Dashboard button if they have master permissions', async ({ page }) => { console.log('Testing regular trainer dashboard navigation...'); // Navigate to login page await page.goto(`${BASE_URL}${URLS.LOGIN}`); await page.waitForLoadState('networkidle'); // Take screenshot of login page await page.screenshot({ path: 'test-results/01-login-page.png', fullPage: true }); // Login as test trainer await page.fill('input[name="log"]', TEST_TRAINER.username); await page.fill('input[name="pwd"]', TEST_TRAINER.password); // Click the login submit button await page.click('.hvac-login-submit'); // Wait for redirect to dashboard await page.waitForLoadState('networkidle'); // Take screenshot after login await page.screenshot({ path: 'test-results/02-trainer-dashboard-after-login.png', fullPage: true }); // Verify we're on the trainer dashboard expect(page.url()).toContain('/trainer/dashboard/'); // Check if the page title contains "Trainer Dashboard" const title = await page.locator('h1.entry-title').textContent(); expect(title).toContain('Trainer Dashboard'); // Check navigation buttons const navButtons = await page.locator('.hvac-dashboard-nav a').allTextContents(); console.log('Navigation buttons found:', navButtons); // Look for Master Dashboard button (should only appear if user has master permissions) const hasMasterButton = navButtons.some(text => text.includes('Master Dashboard')); console.log('Has Master Dashboard button:', hasMasterButton); // Take final screenshot await page.screenshot({ path: 'test-results/03-trainer-navigation-buttons.png', fullPage: true }); }); test('Admin trainer should have access to Master Dashboard', async ({ page }) => { console.log('Testing admin trainer master dashboard access...'); // Navigate to login page await page.goto(`${BASE_URL}${URLS.LOGIN}`); await page.waitForLoadState('networkidle'); // Login as admin trainer await page.fill('input[name="log"]', ADMIN_TRAINER.username); await page.fill('input[name="pwd"]', ADMIN_TRAINER.password); // Click the login submit button await page.click('.hvac-login-submit'); // Wait for redirect await page.waitForLoadState('networkidle'); // Take screenshot after admin login await page.screenshot({ path: 'test-results/04-admin-dashboard-after-login.png', fullPage: true }); console.log('Current URL after admin login:', page.url()); // Check if redirected to master dashboard or regular dashboard const isOnMasterDashboard = page.url().includes('/master-dashboard/'); const isOnRegularDashboard = page.url().includes('/hvac-dashboard/'); console.log('Is on Master Dashboard:', isOnMasterDashboard); console.log('Is on Regular Dashboard:', isOnRegularDashboard); if (isOnRegularDashboard) { // Check if Master Dashboard button is present const navButtons = await page.locator('.hvac-dashboard-nav a').allTextContents(); console.log('Admin navigation buttons:', navButtons); const hasMasterButton = navButtons.some(text => text.includes('Master Dashboard')); console.log('Admin has Master Dashboard button:', hasMasterButton); if (hasMasterButton) { // Click Master Dashboard button await page.click('a:has-text("Master Dashboard")'); await page.waitForLoadState('networkidle'); // Take screenshot of master dashboard await page.screenshot({ path: 'test-results/05-master-dashboard-view.png', fullPage: true }); // Verify we're on master dashboard expect(page.url()).toContain('/master-trainer/dashboard/'); // Check for "Trainer Dashboard" button on master dashboard const masterNavButtons = await page.locator('.hvac-dashboard-nav a').allTextContents(); console.log('Master dashboard navigation buttons:', masterNavButtons); const hasTrainerButton = masterNavButtons.some(text => text.includes('Trainer Dashboard')); console.log('Master dashboard has Trainer Dashboard button:', hasTrainerButton); // Take final screenshot await page.screenshot({ path: 'test-results/06-master-dashboard-navigation.png', fullPage: true }); } } }); test('Test navigation flow between dashboards', async ({ page }) => { console.log('Testing complete navigation flow...'); // Login as admin to test navigation await page.goto(`${BASE_URL}/community-login/`); await page.waitForLoadState('networkidle'); await page.fill('input[name="log"]', ADMIN_TRAINER.username); await page.fill('input[name="pwd"]', ADMIN_TRAINER.password); await page.click('.hvac-login-submit'); await page.waitForLoadState('networkidle'); // Try to navigate directly to master dashboard await page.goto(`${BASE_URL}/master-dashboard/`); await page.waitForLoadState('networkidle'); await page.screenshot({ path: 'test-results/07-direct-master-dashboard-access.png', fullPage: true }); console.log('Direct master dashboard URL:', page.url()); // Check if access is granted or denied const accessDenied = await page.locator('text=Access Denied').count() > 0; const masterDashboardTitle = await page.locator('h1:has-text("Master Dashboard")').count() > 0; console.log('Access denied:', accessDenied); console.log('Master dashboard title present:', masterDashboardTitle); if (!accessDenied && masterDashboardTitle) { // Test switching to trainer dashboard const trainerButton = await page.locator('a:has-text("Trainer Dashboard")').count(); console.log('Trainer Dashboard button found:', trainerButton > 0); if (trainerButton > 0) { await page.click('a:has-text("Trainer Dashboard")'); await page.waitForLoadState('networkidle'); await page.screenshot({ path: 'test-results/08-switched-to-trainer-dashboard.png', fullPage: true }); // Verify we're back on trainer dashboard expect(page.url()).toContain('/trainer/dashboard/'); console.log('Successfully navigated back to trainer dashboard'); } } }); test('Verify login redirection logic', async ({ page }) => { console.log('Testing login redirection logic...'); // First test: regular trainer login await page.goto(`${BASE_URL}/community-login/`); await page.waitForLoadState('networkidle'); await page.fill('input[name="log"]', TEST_TRAINER.username); await page.fill('input[name="pwd"]', TEST_TRAINER.password); await page.click('input[type="submit"]'); await page.waitForLoadState('networkidle'); const trainerRedirectUrl = page.url(); console.log('Regular trainer redirected to:', trainerRedirectUrl); await page.screenshot({ path: 'test-results/09-trainer-redirect-result.png', fullPage: true }); // Logout await page.click('a:has-text("Logout")'); await page.waitForLoadState('networkidle'); // Second test: admin trainer login await page.goto(`${BASE_URL}/community-login/`); await page.waitForLoadState('networkidle'); await page.fill('input[name="log"]', ADMIN_TRAINER.username); await page.fill('input[name="pwd"]', ADMIN_TRAINER.password); await page.click('.hvac-login-submit'); await page.waitForLoadState('networkidle'); const adminRedirectUrl = page.url(); console.log('Admin trainer redirected to:', adminRedirectUrl); await page.screenshot({ path: 'test-results/10-admin-redirect-result.png', fullPage: true }); // Log findings console.log('=== Redirection Analysis ==='); console.log('Regular trainer lands on:', trainerRedirectUrl.includes('trainer/dashboard') ? 'Regular Dashboard' : 'Other'); console.log('Admin trainer lands on:', adminRedirectUrl.includes('master-trainer/dashboard') ? 'Master Dashboard' : adminRedirectUrl.includes('trainer/dashboard') ? 'Regular Dashboard' : 'Other'); }); test('Verify backward compatibility redirects', async ({ page }) => { console.log('Testing backward compatibility redirects...'); // Test old login URL redirects await page.goto(`${BASE_URL}${URLS.OLD_LOGIN}`); await page.waitForLoadState('networkidle'); const loginRedirectUrl = page.url(); console.log('Old login URL redirected to:', loginRedirectUrl); await page.screenshot({ path: 'test-results/11-old-login-redirect.png', fullPage: true }); // Should redirect to new login URL expect(loginRedirectUrl).toContain('/training-login/'); // Test old dashboard URL redirects (need to be logged in first) await page.goto(`${BASE_URL}${URLS.LOGIN}`); await page.waitForLoadState('networkidle'); await page.fill('input[name="log"]', TEST_TRAINER.username); await page.fill('input[name="pwd"]', TEST_TRAINER.password); await page.click('.hvac-login-submit'); await page.waitForLoadState('networkidle'); // Now test old dashboard redirect await page.goto(`${BASE_URL}${URLS.OLD_TRAINER_DASHBOARD}`); await page.waitForLoadState('networkidle'); const dashboardRedirectUrl = page.url(); console.log('Old dashboard URL redirected to:', dashboardRedirectUrl); await page.screenshot({ path: 'test-results/12-old-dashboard-redirect.png', fullPage: true }); // Should redirect to new dashboard URL expect(dashboardRedirectUrl).toContain('/trainer/dashboard/'); console.log('=== Redirect Test Results ==='); console.log('Old login URL properly redirects:', loginRedirectUrl.includes('/training-login/')); console.log('Old dashboard URL properly redirects:', dashboardRedirectUrl.includes('/trainer/dashboard/')); }); });