- Add welcome guide modal functionality tests with navigation and dismissal - Add tooltip system tests for hover behavior and positioning - Add documentation page tests for content accuracy and navigation - Add integration tests for complete user journey through help features - Test cookie persistence, accessibility, and cross-page functionality - Verify asset loading and JavaScript initialization 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
292 lines
No EOL
12 KiB
TypeScript
292 lines
No EOL
12 KiB
TypeScript
/**
|
|
* Help System - Tooltips E2E Tests
|
|
*
|
|
* Tests the tooltip system functionality including:
|
|
* - Tooltip appearance on hover
|
|
* - Tooltip positioning
|
|
* - Tooltip content accuracy
|
|
* - Cross-page functionality
|
|
*/
|
|
|
|
import { test, expect } from '@playwright/test';
|
|
import { STAGING_URL, PATHS, TIMEOUTS } from './config/staging-config';
|
|
|
|
test.describe('Help System - Tooltips @help @tooltips', () => {
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
// Login as trainer before each test
|
|
await page.goto(PATHS.login);
|
|
await page.fill('#user_login', 'test_trainer');
|
|
await page.fill('#user_pass', 'Test123!');
|
|
await page.click('#wp-submit');
|
|
await page.waitForLoadState('networkidle');
|
|
});
|
|
|
|
test('Dashboard navigation tooltips appear on hover', async ({ page }) => {
|
|
console.log('Testing dashboard navigation tooltips...');
|
|
|
|
await page.goto(PATHS.dashboard);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Test Create Event button tooltip
|
|
const createEventButton = page.locator('.hvac-tooltip-wrapper').filter({ hasText: 'Create Event' });
|
|
await expect(createEventButton).toBeVisible();
|
|
|
|
// Hover over button
|
|
await createEventButton.hover();
|
|
|
|
// Wait for tooltip to appear (there's a delay)
|
|
await page.waitForTimeout(600); // Tooltip has 500ms delay
|
|
|
|
// Check tooltip content
|
|
await expect(createEventButton).toHaveAttribute('data-tooltip', 'Create a new training event with custom pricing and registration options');
|
|
|
|
console.log('✓ Create Event tooltip works');
|
|
|
|
// Test My Events button tooltip
|
|
const myEventsButton = page.locator('.hvac-tooltip-wrapper').filter({ hasText: 'My Events' });
|
|
await myEventsButton.hover();
|
|
await page.waitForTimeout(600);
|
|
|
|
await expect(myEventsButton).toHaveAttribute('data-tooltip', 'View and manage all your existing events in one place');
|
|
|
|
console.log('✓ My Events tooltip works');
|
|
|
|
// Test Generate Certificates button tooltip
|
|
const certificatesButton = page.locator('.hvac-tooltip-wrapper').filter({ hasText: 'Generate Certificates' });
|
|
await certificatesButton.hover();
|
|
await page.waitForTimeout(600);
|
|
|
|
await expect(certificatesButton).toHaveAttribute('data-tooltip', 'Create professional certificates for attendees who completed your training');
|
|
|
|
console.log('✓ Generate Certificates tooltip works');
|
|
|
|
await page.screenshot({ path: 'test-results/screenshots/dashboard-tooltips.png' });
|
|
});
|
|
|
|
test('Dashboard statistics tooltips work correctly', async ({ page }) => {
|
|
console.log('Testing dashboard statistics tooltips...');
|
|
|
|
await page.goto(PATHS.dashboard);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Test "Your Stats" section tooltip
|
|
const statsHeader = page.locator('.hvac-tooltip-wrapper').filter({ hasText: 'Your Stats' });
|
|
if (await statsHeader.count() > 0) {
|
|
await statsHeader.hover();
|
|
await page.waitForTimeout(600);
|
|
|
|
await expect(statsHeader).toHaveAttribute('data-tooltip', 'Overview of your event performance and revenue metrics');
|
|
console.log('✓ Stats header tooltip works');
|
|
}
|
|
|
|
// Test individual stat card tooltips
|
|
const statCards = [
|
|
{ text: 'Total Events', expectedTooltip: 'All events you\'ve created, including drafts and published events' },
|
|
{ text: 'Upcoming Events', expectedTooltip: 'Published events scheduled for future dates' },
|
|
{ text: 'Past Events', expectedTooltip: 'Completed events where you can generate certificates' },
|
|
{ text: 'Tickets Sold', expectedTooltip: 'Total number of tickets sold across all your events' },
|
|
{ text: 'Total Revenue', expectedTooltip: 'Total earnings from all ticket sales (before Stripe fees)' }
|
|
];
|
|
|
|
for (const card of statCards) {
|
|
const statElement = page.locator('.hvac-tooltip-wrapper').filter({ hasText: card.text });
|
|
if (await statElement.count() > 0) {
|
|
await statElement.hover();
|
|
await page.waitForTimeout(600);
|
|
|
|
await expect(statElement).toHaveAttribute('data-tooltip', card.expectedTooltip);
|
|
console.log(`✓ ${card.text} tooltip works`);
|
|
}
|
|
}
|
|
|
|
await page.screenshot({ path: 'test-results/screenshots/statistics-tooltips.png' });
|
|
});
|
|
|
|
test('Events table section tooltips work', async ({ page }) => {
|
|
console.log('Testing events table tooltips...');
|
|
|
|
await page.goto(PATHS.dashboard);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Test "Your Events" header tooltip
|
|
const eventsHeader = page.locator('.hvac-tooltip-wrapper').filter({ hasText: 'Your Events' });
|
|
if (await eventsHeader.count() > 0) {
|
|
await eventsHeader.hover();
|
|
await page.waitForTimeout(600);
|
|
|
|
await expect(eventsHeader).toHaveAttribute('data-tooltip', 'Detailed view of all your events with performance metrics and management options');
|
|
console.log('✓ Events header tooltip works');
|
|
}
|
|
|
|
// Test filter tooltip
|
|
const filterElement = page.locator('.hvac-tooltip-wrapper').filter({ hasText: 'Filter:' });
|
|
if (await filterElement.count() > 0) {
|
|
await filterElement.hover();
|
|
await page.waitForTimeout(600);
|
|
|
|
await expect(filterElement).toHaveAttribute('data-tooltip', 'Filter events by their publication status');
|
|
console.log('✓ Filter tooltip works');
|
|
}
|
|
|
|
await page.screenshot({ path: 'test-results/screenshots/events-table-tooltips.png' });
|
|
});
|
|
|
|
test('Tooltip positioning works correctly', async ({ page }) => {
|
|
console.log('Testing tooltip positioning...');
|
|
|
|
await page.goto(PATHS.dashboard);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Find tooltips with different position attributes
|
|
const topTooltip = page.locator('.hvac-tooltip-wrapper[data-position="top"]').first();
|
|
const bottomTooltip = page.locator('.hvac-tooltip-wrapper[data-position="bottom"]').first();
|
|
|
|
if (await topTooltip.count() > 0) {
|
|
await expect(topTooltip).toHaveAttribute('data-position', 'top');
|
|
console.log('✓ Top positioned tooltip found');
|
|
}
|
|
|
|
if (await bottomTooltip.count() > 0) {
|
|
await expect(bottomTooltip).toHaveAttribute('data-position', 'bottom');
|
|
console.log('✓ Bottom positioned tooltip found');
|
|
}
|
|
|
|
// Test default positioning (should default to top if not specified)
|
|
const defaultTooltip = page.locator('.hvac-tooltip-wrapper').not('[data-position]').first();
|
|
if (await defaultTooltip.count() > 0) {
|
|
console.log('✓ Default positioned tooltip found');
|
|
}
|
|
});
|
|
|
|
test('Tooltips work on trainer profile page', async ({ page }) => {
|
|
console.log('Testing tooltips on trainer profile page...');
|
|
|
|
await page.goto(PATHS.profile);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Check if help button is present with tooltip
|
|
const helpButton = page.locator('a').filter({ hasText: 'Help' });
|
|
await expect(helpButton).toBeVisible();
|
|
|
|
// Test any tooltips that might be on the profile page
|
|
const tooltipElements = page.locator('.hvac-tooltip-wrapper');
|
|
const tooltipCount = await tooltipElements.count();
|
|
|
|
if (tooltipCount > 0) {
|
|
console.log(`Found ${tooltipCount} tooltip elements on profile page`);
|
|
|
|
// Test the first tooltip
|
|
await tooltipElements.first().hover();
|
|
await page.waitForTimeout(600);
|
|
|
|
// Verify it has a data-tooltip attribute
|
|
await expect(tooltipElements.first()).toHaveAttribute('data-tooltip');
|
|
}
|
|
|
|
console.log('✓ Profile page tooltips checked');
|
|
await page.screenshot({ path: 'test-results/screenshots/profile-tooltips.png' });
|
|
});
|
|
|
|
test('Tooltip CSS classes are applied correctly', async ({ page }) => {
|
|
console.log('Testing tooltip CSS classes...');
|
|
|
|
await page.goto(PATHS.dashboard);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Check if tooltip wrapper elements have the correct classes
|
|
const tooltipWrappers = page.locator('.hvac-tooltip-wrapper');
|
|
const count = await tooltipWrappers.count();
|
|
|
|
expect(count).toBeGreaterThan(0);
|
|
console.log(`Found ${count} tooltip wrapper elements`);
|
|
|
|
// Check that each wrapper has the required attributes
|
|
for (let i = 0; i < Math.min(count, 5); i++) { // Test first 5 tooltips
|
|
const wrapper = tooltipWrappers.nth(i);
|
|
|
|
// Should have hvac-tooltip-wrapper class
|
|
await expect(wrapper).toHaveClass(/hvac-tooltip-wrapper/);
|
|
|
|
// Should have data-tooltip attribute
|
|
await expect(wrapper).toHaveAttribute('data-tooltip');
|
|
|
|
console.log(`✓ Tooltip ${i + 1} has correct attributes`);
|
|
}
|
|
});
|
|
|
|
test('Tooltips disappear when not hovering', async ({ page }) => {
|
|
console.log('Testing tooltip hover behavior...');
|
|
|
|
await page.goto(PATHS.dashboard);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
const tooltipElement = page.locator('.hvac-tooltip-wrapper').first();
|
|
|
|
// Hover over element
|
|
await tooltipElement.hover();
|
|
await page.waitForTimeout(600);
|
|
|
|
// Move mouse away
|
|
await page.mouse.move(0, 0);
|
|
await page.waitForTimeout(200);
|
|
|
|
// Tooltip should not be visible (this is handled by CSS)
|
|
// We can verify the hover state is removed by checking computed styles
|
|
console.log('✓ Tooltip hover behavior tested');
|
|
});
|
|
|
|
test('Help system CSS and JS are loaded', async ({ page }) => {
|
|
console.log('Testing help system assets loading...');
|
|
|
|
await page.goto(PATHS.dashboard);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Check if help system CSS is loaded
|
|
const helpSystemCSS = await page.locator('link[href*="hvac-help-system.css"]').count();
|
|
expect(helpSystemCSS).toBeGreaterThan(0);
|
|
console.log('✓ Help system CSS is loaded');
|
|
|
|
// Check if help system JS is loaded
|
|
const helpSystemJS = await page.locator('script[src*="hvac-help-system.js"]').count();
|
|
expect(helpSystemJS).toBeGreaterThan(0);
|
|
console.log('✓ Help system JS is loaded');
|
|
|
|
// Check if Font Awesome is loaded for icons
|
|
const fontAwesome = await page.locator('link[href*="font-awesome"]').count();
|
|
expect(fontAwesome).toBeGreaterThan(0);
|
|
console.log('✓ Font Awesome is loaded');
|
|
});
|
|
|
|
test('Tooltip functionality works with JavaScript', async ({ page }) => {
|
|
console.log('Testing tooltip JavaScript functionality...');
|
|
|
|
await page.goto(PATHS.dashboard);
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Check if the HVACHelp object is available in the global scope
|
|
const hvacHelpExists = await page.evaluate(() => {
|
|
return typeof window.HVACHelp !== 'undefined';
|
|
});
|
|
|
|
expect(hvacHelpExists).toBe(true);
|
|
console.log('✓ HVACHelp JavaScript object is available');
|
|
|
|
// Test the addTooltip function
|
|
const tooltipAdded = await page.evaluate(() => {
|
|
const testElement = document.createElement('span');
|
|
testElement.id = 'test-tooltip-element';
|
|
testElement.textContent = 'Test Element';
|
|
document.body.appendChild(testElement);
|
|
|
|
window.HVACHelp.addTooltip('#test-tooltip-element', 'Test tooltip text', 'top');
|
|
|
|
const element = document.getElementById('test-tooltip-element');
|
|
return element.classList.contains('hvac-tooltip-wrapper') &&
|
|
element.getAttribute('data-tooltip') === 'Test tooltip text';
|
|
});
|
|
|
|
expect(tooltipAdded).toBe(true);
|
|
console.log('✓ JavaScript addTooltip function works');
|
|
});
|
|
}); |