128 lines
		
	
	
		
			No EOL
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			No EOL
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { STAGING_URL, PATHS, TIMEOUTS } from './config/staging-config';
 | |
| import { test, expect } from '@playwright/test';
 | |
| 
 | |
| /**
 | |
|  * Certificate Generation End-to-End Test
 | |
|  * 
 | |
|  * This test verifies the certificate generation functionality:
 | |
|  * - Login as a trainer
 | |
|  * - Navigate to an event summary page
 | |
|  * - Generate certificates for attendees
 | |
|  * - View certificate
 | |
|  * - Email certificate to a test email
 | |
|  * - Revoke certificate
 | |
|  */
 | |
| 
 | |
| test.describe('Certificate Generation Tests', () => {
 | |
|   const stagingUrl = 'https://upskill-staging.measurequick.com/';
 | |
|   const loginUrl = `${stagingUrl}community-login/`;
 | |
|   const dashboardUrl = `${stagingUrl}hvac-dashboard/`;
 | |
|   const testEmail = 'ben@tealmaker.com';
 | |
|   
 | |
|   test.beforeEach(async ({ page }) => {
 | |
|     // Login as trainer
 | |
|     await page.goto(loginUrl);
 | |
|     await page.fill('input[name="log"]', 'test_trainer');
 | |
|     await page.fill('input[name="pwd"]', 'Test123!');
 | |
|     await page.click('input[type="submit"]');
 | |
|     
 | |
|     // Verify login was successful by checking for dashboard
 | |
|     await expect(page).toHaveURL(dashboardUrl);
 | |
|   });
 | |
|   
 | |
|   test('Generate and manage certificates for an event', async ({ page }) => {
 | |
|     // Navigate to the dashboard to find an event
 | |
|     await page.goto(dashboardUrl);
 | |
|     
 | |
|     // Click on the first event summary link
 | |
|     await page.click('.hvac-event-title a');
 | |
|     
 | |
|     // Wait for the event summary page to load
 | |
|     await expect(page.locator('h1')).toContainText('Summary');
 | |
|     
 | |
|     // Check if we have attendees
 | |
|     const hasAttendees = await page.locator('.hvac-transactions-table').isVisible();
 | |
|     
 | |
|     if (hasAttendees) {
 | |
|       // Check if any attendee doesn't have a certificate yet
 | |
|       const generateButtonExists = await page.locator('.hvac-cert-action:text("Generate")').isVisible();
 | |
|       
 | |
|       if (generateButtonExists) {
 | |
|         // Generate a certificate for an attendee
 | |
|         await page.click('.hvac-cert-action:text("Generate")');
 | |
|         
 | |
|         // Navigate to the generate certificates page
 | |
|         await expect(page.locator('h1')).toContainText('Generate Certificates');
 | |
|         
 | |
|         // Check the 'checked_in_only' checkbox
 | |
|         await page.check('#checked-in-only-checkbox');
 | |
|         
 | |
|         // Generate certificates
 | |
|         await page.click('button[type="submit"]');
 | |
|         
 | |
|         // Wait for success message
 | |
|         await expect(page.locator('.hvac-success-message')).toBeVisible();
 | |
|         
 | |
|         // Go back to the event summary
 | |
|         await page.click('a:text("Back to Event Summary")');
 | |
|       }
 | |
|       
 | |
|       // Check if there are any generated certificates
 | |
|       const viewButtonExists = await page.locator('.hvac-cert-action:text("View")').isVisible();
 | |
|       
 | |
|       if (viewButtonExists) {
 | |
|         // View a certificate
 | |
|         await page.click('.hvac-cert-action:text("View")', { force: true });
 | |
|         
 | |
|         // Wait for the certificate modal to appear
 | |
|         await expect(page.locator('#hvac-certificate-modal')).toBeVisible();
 | |
|         
 | |
|         // Wait for the certificate iframe to load
 | |
|         await page.waitForSelector('#hvac-certificate-preview[src^="http"]');
 | |
|         
 | |
|         // Close the modal
 | |
|         await page.click('.hvac-modal-close');
 | |
|         
 | |
|         // Email a certificate
 | |
|         await page.click('.hvac-cert-action:text("Email")', { force: true });
 | |
|         
 | |
|         // Confirm the email dialog
 | |
|         await page.once('dialog', dialog => dialog.accept());
 | |
|         
 | |
|         // Wait for success message
 | |
|         await page.waitForTimeout(2000); // Wait for alert to appear and dismiss
 | |
|         
 | |
|         // Revoke a certificate
 | |
|         await page.click('.hvac-cert-action:text("Revoke")', { force: true });
 | |
|         
 | |
|         // Enter reason in the prompt
 | |
|         await page.once('dialog', dialog => dialog.accept('Revocation test'));
 | |
|         
 | |
|         // Wait for status to update to Revoked
 | |
|         await expect(page.locator('td:has-text("Revoked")')).toBeVisible();
 | |
|       } else {
 | |
|         console.log('No generated certificates available to test with');
 | |
|       }
 | |
|     } else {
 | |
|       console.log('No attendees found for the event');
 | |
|     }
 | |
|   });
 | |
|   
 | |
|   test('Navigate to Certificate Reports page', async ({ page }) => {
 | |
|     // Navigate to certificate reports page
 | |
|     await page.goto(`${stagingUrl}certificate-reports/`);
 | |
|     
 | |
|     // Verify the page loaded successfully
 | |
|     await expect(page.locator('h1')).toContainText('Certificate Reports');
 | |
|     
 | |
|     // Try filtering certificates
 | |
|     await page.selectOption('select[name="filter_status"]', 'all');
 | |
|     await page.click('button[type="submit"]');
 | |
|     
 | |
|     // Check for certificate data or empty message
 | |
|     const hasReports = await page.locator('.hvac-certificate-table').isVisible();
 | |
|     if (!hasReports) {
 | |
|       await expect(page.locator('.hvac-no-certificates')).toBeVisible();
 | |
|     }
 | |
|   });
 | |
| }); |