224 lines
No EOL
7.8 KiB
TypeScript
224 lines
No EOL
7.8 KiB
TypeScript
import { STAGING_URL, PATHS, TIMEOUTS } from './config/staging-config';
|
|
import { test, expect } from '@playwright/test';
|
|
import { LoginPage } from './pages/LoginPage';
|
|
import { DashboardPage } from './pages/DashboardPage';
|
|
import { CertificatePage } from './pages/CertificatePage';
|
|
|
|
/**
|
|
* Certificate Tests
|
|
*
|
|
* These tests verify the certificate generation, reporting, and filtering functionality
|
|
*
|
|
* @group @certificate
|
|
*/
|
|
|
|
// STAGING_URL is now imported from config
|
|
|
|
// Test data for existing certificates to verify
|
|
const TEST_EVENTS = [
|
|
{ id: '5641', name: 'HVAC System Design Fundamentals' },
|
|
{ id: '5668', name: 'Advanced Refrigeration Technology' },
|
|
{ id: '5688', name: 'Building Automation Systems Workshop' }
|
|
];
|
|
|
|
// Test data for attendee filtering
|
|
const TEST_ATTENDEES = [
|
|
{ name: 'John Smith', email: 'john.smith@example.com' },
|
|
{ name: 'Sarah Johnson', email: 'sarah.johnson@example.com' },
|
|
{ name: 'Michael Brown', email: 'michael.brown@example.com' }
|
|
];
|
|
|
|
// Common setup for tests
|
|
async function setupTest(page) {
|
|
const loginPage = new LoginPage(page);
|
|
await loginPage.navigate();
|
|
await loginPage.login('test_trainer', 'Test123!');
|
|
|
|
// Verify login
|
|
const dashboardPage = new DashboardPage(page);
|
|
await expect(page).toHaveURL(/hvac-dashboard/);
|
|
|
|
return { loginPage, dashboardPage };
|
|
}
|
|
|
|
test.describe('Certificate Generation and Reports', () => {
|
|
test('Navigate to certificate generation page', async ({ page }) => {
|
|
const { dashboardPage } = await setupTest(page);
|
|
|
|
// Navigate to Generate Certificates page
|
|
await dashboardPage.clickGenerateCertificates();
|
|
|
|
// Verify page components
|
|
const certificatePage = new CertificatePage(page);
|
|
const pageVisible = await certificatePage.isGenerateCertificatesPageVisible();
|
|
expect(pageVisible).toBeTruthy();
|
|
|
|
// Check for event dropdown
|
|
await expect(page.locator('#event_id')).toBeVisible();
|
|
});
|
|
|
|
test('Navigate to certificate reports page', async ({ page }) => {
|
|
const { dashboardPage } = await setupTest(page);
|
|
|
|
// Navigate to Certificate Reports page
|
|
await dashboardPage.clickCertificateReports();
|
|
|
|
// Verify page components
|
|
const certificatePage = new CertificatePage(page);
|
|
const pageVisible = await certificatePage.isCertificateReportsPageVisible();
|
|
expect(pageVisible).toBeTruthy();
|
|
|
|
// Check for filter form
|
|
await expect(page.locator('form.hvac-certificate-filters')).toBeVisible();
|
|
});
|
|
|
|
test('Filter certificates by event', async ({ page }) => {
|
|
const { dashboardPage } = await setupTest(page);
|
|
|
|
// Navigate to Certificate Reports page
|
|
await dashboardPage.clickCertificateReports();
|
|
const certificatePage = new CertificatePage(page);
|
|
|
|
// Select an event to filter
|
|
const testEvent = TEST_EVENTS[0];
|
|
await certificatePage.searchCertificates(testEvent.name);
|
|
|
|
// Verify results
|
|
await page.waitForLoadState('networkidle');
|
|
const certificateCount = await certificatePage.getCertificateCount();
|
|
console.log(`Found ${certificateCount} certificates for event: ${testEvent.name}`);
|
|
|
|
// Should have at least some certificates (can be zero if no certificates exist)
|
|
expect(certificateCount).toBeGreaterThanOrEqual(0);
|
|
});
|
|
|
|
test('Search certificates by attendee', async ({ page }) => {
|
|
const { dashboardPage } = await setupTest(page);
|
|
|
|
// Navigate to Certificate Reports page
|
|
await dashboardPage.clickCertificateReports();
|
|
const certificatePage = new CertificatePage(page);
|
|
|
|
// Search for an attendee
|
|
const testAttendee = TEST_ATTENDEES[0];
|
|
await certificatePage.searchAttendee(testAttendee.name);
|
|
|
|
// Verify search results
|
|
await page.waitForLoadState('networkidle');
|
|
const certificateCount = await certificatePage.getCertificateCount();
|
|
console.log(`Found ${certificateCount} certificates for attendee: ${testAttendee.name}`);
|
|
|
|
// Verify filter was applied (search input should have the attendee name)
|
|
const searchValue = await page.inputValue('#search_attendee');
|
|
expect(searchValue).toEqual(testAttendee.name);
|
|
});
|
|
|
|
test('Reset certificate filters', async ({ page }) => {
|
|
const { dashboardPage } = await setupTest(page);
|
|
|
|
// Navigate to Certificate Reports page
|
|
await dashboardPage.clickCertificateReports();
|
|
const certificatePage = new CertificatePage(page);
|
|
|
|
// Apply a filter first
|
|
await certificatePage.searchAttendee('test');
|
|
|
|
// Get count with filter
|
|
const filteredCount = await certificatePage.getCertificateCount();
|
|
|
|
// Reset filters
|
|
await certificatePage.resetFilters();
|
|
|
|
// Get count after reset
|
|
const resetCount = await certificatePage.getCertificateCount();
|
|
|
|
// The search input should be empty after reset
|
|
const searchValue = await page.inputValue('#search_attendee');
|
|
expect(searchValue).toEqual('');
|
|
|
|
console.log(`Filtered certificates: ${filteredCount}, After reset: ${resetCount}`);
|
|
// We can't guarantee counts will differ, but the reset should work
|
|
});
|
|
|
|
test('View certificate details', async ({ page }) => {
|
|
const { dashboardPage } = await setupTest(page);
|
|
|
|
// Navigate to Certificate Reports page
|
|
await dashboardPage.clickCertificateReports();
|
|
const certificatePage = new CertificatePage(page);
|
|
|
|
// Get initial certificate count
|
|
const certificateCount = await certificatePage.getCertificateCount();
|
|
console.log(`Found ${certificateCount} certificates`);
|
|
|
|
// Skip test if no certificates
|
|
test.skip(certificateCount === 0, 'No certificates available to view');
|
|
|
|
if (certificateCount > 0) {
|
|
// View the first certificate
|
|
await certificatePage.viewCertificate(0);
|
|
|
|
// Verify preview is visible
|
|
await expect(page.locator('.hvac-certificate-preview')).toBeVisible();
|
|
|
|
// Close the preview
|
|
await certificatePage.closePreview();
|
|
|
|
// Preview should be hidden
|
|
await expect(page.locator('.hvac-certificate-preview')).not.toBeVisible();
|
|
}
|
|
});
|
|
});
|
|
|
|
// Comprehensive test for attendee search functionality
|
|
test('Attendee search functionality', async ({ page }) => {
|
|
const { dashboardPage } = await setupTest(page);
|
|
|
|
// Navigate to Certificate Reports page
|
|
await dashboardPage.clickCertificateReports();
|
|
const certificatePage = new CertificatePage(page);
|
|
|
|
// Test partial name search
|
|
await certificatePage.searchAttendee('John');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Verify search results
|
|
const nameSearchCount = await certificatePage.getCertificateCount();
|
|
console.log(`Found ${nameSearchCount} certificates for attendee name: John`);
|
|
|
|
// Reset filters
|
|
await certificatePage.resetFilters();
|
|
|
|
// Test email domain search
|
|
await certificatePage.searchAttendee('example.com');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Verify search results
|
|
const emailSearchCount = await certificatePage.getCertificateCount();
|
|
console.log(`Found ${emailSearchCount} certificates for email domain: example.com`);
|
|
|
|
// Reset filters
|
|
await certificatePage.resetFilters();
|
|
|
|
// Test combination of filters (event + attendee)
|
|
if (TEST_EVENTS.length > 0) {
|
|
const testEvent = TEST_EVENTS[0];
|
|
|
|
// Select an event
|
|
await certificatePage.searchCertificates(testEvent.name);
|
|
|
|
// Then search for an attendee
|
|
await certificatePage.searchAttendee('test');
|
|
|
|
// Verify combined results
|
|
const combinedCount = await certificatePage.getCertificateCount();
|
|
console.log(`Found ${combinedCount} certificates for event "${testEvent.name}" and attendee "test"`);
|
|
|
|
// Verify both filters were applied
|
|
const searchValue = await page.inputValue('#search_attendee');
|
|
expect(searchValue).toEqual('test');
|
|
|
|
// Reset filters
|
|
await certificatePage.resetFilters();
|
|
}
|
|
}); |