- Enhanced Order Summary template with detailed information display - Added comprehensive order details including events, tickets, and notes - Improved Order Summary Data class with additional functionality - Added access control to ensure only authorized users can view orders - Created links from Event Summary page to Order Summary page - Added E2E test for the Order Summary feature - Created helper script for Order Summary page creation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			148 lines
		
	
	
		
			No EOL
		
	
	
		
			6.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			No EOL
		
	
	
		
			6.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @fileoverview E2E Tests for Order Summary page.
 | |
|  * This test suite verifies that trainers can view order details for their events.
 | |
|  */
 | |
| 
 | |
| import { test, expect } from '@playwright/test';
 | |
| import { LoginPage } from './pages/LoginPage';
 | |
| import { DashboardPage } from './pages/DashboardPage';
 | |
| 
 | |
| // Test data
 | |
| const TEST_USER = {
 | |
|     username: process.env.TEST_TRAINER_USERNAME || 'test_trainer',
 | |
|     password: process.env.TEST_TRAINER_PASSWORD || 'Test_password123'
 | |
| };
 | |
| 
 | |
| test.describe('Order Summary Page @order-summary', () => {
 | |
|     test.beforeEach(async ({ page }) => {
 | |
|         // Login before each test
 | |
|         const loginPage = new LoginPage(page);
 | |
|         await loginPage.goto();
 | |
|         await loginPage.login(TEST_USER.username, TEST_USER.password);
 | |
|         
 | |
|         // Verify we're logged in by checking if we're on the dashboard
 | |
|         const dashboardPage = new DashboardPage(page);
 | |
|         await expect(page).toHaveURL(/.*hvac-dashboard.*/);
 | |
|         await expect(dashboardPage.welcomeMessage).toBeVisible();
 | |
|     });
 | |
| 
 | |
|     test('should navigate from dashboard to event summary to order summary', async ({ page }) => {
 | |
|         // Navigate to dashboard
 | |
|         await page.goto('/hvac-dashboard/');
 | |
|         await expect(page).toHaveURL(/.*hvac-dashboard.*/);
 | |
|         
 | |
|         // Find an event with tickets and navigate to its event summary
 | |
|         // This depends on having test events with ticket sales
 | |
|         const eventLinks = await page.$$('a[href*="event-summary"]');
 | |
|         if (eventLinks.length === 0) {
 | |
|             test.skip('No events with ticket sales found');
 | |
|         }
 | |
|         
 | |
|         // Click the first event link
 | |
|         await eventLinks[0].click();
 | |
|         await expect(page).toHaveURL(/.*event-summary.*/);
 | |
|         await expect(page.locator('h1')).toContainText('Summary');
 | |
|         
 | |
|         // Look for order links in the transactions table
 | |
|         const orderLinks = await page.$$('a[href*="order-summary"]');
 | |
|         if (orderLinks.length === 0) {
 | |
|             test.skip('No orders found for this event');
 | |
|         }
 | |
|         
 | |
|         // Click the first order link
 | |
|         await orderLinks[0].click();
 | |
|         await expect(page).toHaveURL(/.*order-summary.*/);
 | |
|         await expect(page.locator('h1')).toContainText('Order Summary');
 | |
|     });
 | |
| 
 | |
|     test('should display correct order information', async ({ page }) => {
 | |
|         // Navigate directly to an order summary page
 | |
|         // This depends on having an order ID for testing
 | |
|         // For this test, we'll need to get an order ID from an event first
 | |
|         await page.goto('/hvac-dashboard/');
 | |
|         
 | |
|         // Find an event and navigate to its summary
 | |
|         const eventLinks = await page.$$('a[href*="event-summary"]');
 | |
|         if (eventLinks.length === 0) {
 | |
|             test.skip('No events with ticket sales found');
 | |
|         }
 | |
|         
 | |
|         await eventLinks[0].click();
 | |
|         await expect(page).toHaveURL(/.*event-summary.*/);
 | |
|         
 | |
|         // Look for order links and get the first order's ID
 | |
|         const orderLink = await page.$('a[href*="order-summary"]');
 | |
|         if (!orderLink) {
 | |
|             test.skip('No orders found for this event');
 | |
|         }
 | |
|         
 | |
|         const href = await orderLink.getAttribute('href');
 | |
|         const orderId = href.match(/order_id=(\d+)/)[1];
 | |
|         
 | |
|         // Navigate to order summary page directly
 | |
|         await page.goto(`/order-summary/?order_id=${orderId}`);
 | |
|         await expect(page).toHaveURL(/.*order-summary.*/);
 | |
|         
 | |
|         // Check that order details are displayed correctly
 | |
|         await expect(page.locator('h1')).toContainText('Order Summary');
 | |
|         await expect(page.locator('.hvac-details-table')).toBeVisible();
 | |
|         
 | |
|         // Check for order number
 | |
|         const orderNumberCell = await page.locator('.hvac-details-table tr', { has: page.locator('th', { hasText: 'Order Number' }) }).locator('td');
 | |
|         await expect(orderNumberCell).toBeVisible();
 | |
|         
 | |
|         // Check for tickets table
 | |
|         await expect(page.locator('.hvac-tickets-table')).toBeVisible();
 | |
|         await expect(page.locator('.hvac-tickets-table th', { hasText: 'Attendee' })).toBeVisible();
 | |
|         await expect(page.locator('.hvac-tickets-table th', { hasText: 'Email' })).toBeVisible();
 | |
|         await expect(page.locator('.hvac-tickets-table th', { hasText: 'Ticket Type' })).toBeVisible();
 | |
|         await expect(page.locator('.hvac-tickets-table th', { hasText: 'Event' })).toBeVisible();
 | |
|     });
 | |
| 
 | |
|     test('should redirect to login page when not logged in', async ({ page }) => {
 | |
|         // Logout first
 | |
|         await page.goto('/wp-login.php?action=logout');
 | |
|         await page.click('text=log out');
 | |
|         
 | |
|         // Attempt to access order summary page directly
 | |
|         await page.goto('/order-summary/?order_id=1');
 | |
|         
 | |
|         // Should redirect to login page
 | |
|         await expect(page.locator('text=Authentication Required')).toBeVisible();
 | |
|         await expect(page.locator('text=Please log in to view the order summary')).toBeVisible();
 | |
|         await expect(page.locator('a', { hasText: 'Log In' })).toBeVisible();
 | |
|     });
 | |
| 
 | |
|     test('should provide navigation back to event summary', async ({ page }) => {
 | |
|         // Find an event and navigate to its summary
 | |
|         await page.goto('/hvac-dashboard/');
 | |
|         const eventLinks = await page.$$('a[href*="event-summary"]');
 | |
|         if (eventLinks.length === 0) {
 | |
|             test.skip('No events with ticket sales found');
 | |
|         }
 | |
|         
 | |
|         await eventLinks[0].click();
 | |
|         await expect(page).toHaveURL(/.*event-summary.*/);
 | |
|         
 | |
|         // Get the event ID from the URL
 | |
|         const url = page.url();
 | |
|         const eventId = url.match(/event_id=(\d+)/)[1];
 | |
|         
 | |
|         // Look for order links and navigate to an order
 | |
|         const orderLink = await page.$('a[href*="order-summary"]');
 | |
|         if (!orderLink) {
 | |
|             test.skip('No orders found for this event');
 | |
|         }
 | |
|         
 | |
|         await orderLink.click();
 | |
|         await expect(page).toHaveURL(/.*order-summary.*/);
 | |
|         
 | |
|         // Check for "Back to Event Summary" link
 | |
|         const backLink = page.locator('a', { hasText: 'Back to Event Summary' });
 | |
|         await expect(backLink).toBeVisible();
 | |
|         
 | |
|         // Click the link and verify it goes back to the event summary
 | |
|         await backLink.click();
 | |
|         await expect(page).toHaveURL(new RegExp(`.*event-summary.*event_id=${eventId}`));
 | |
|     });
 | |
| }); |