- Add profile edit form template - Implement profile update handler with validation - Add profile update shortcode registration - Create E2E test for profile editing - Support updating personal & business info, location info and training preferences - Add password change functionality with validation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			162 lines
		
	
	
		
			No EOL
		
	
	
		
			7.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			No EOL
		
	
	
		
			7.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @fileoverview E2E Tests for trainer profile editing functionality.
 | |
|  * This test suite verifies that trainers can view, edit, and update their profiles.
 | |
|  */
 | |
| 
 | |
| 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'
 | |
| };
 | |
| 
 | |
| const UPDATED_INFO = {
 | |
|     firstName: 'Updated',
 | |
|     lastName: 'Trainer',
 | |
|     displayName: 'Updated Trainer Profile',
 | |
|     bio: 'This is an updated bio from the automated test.',
 | |
|     businessName: 'Updated Training Co.',
 | |
|     businessPhone: '555-123-4567',
 | |
|     businessEmail: 'updated@example.com',
 | |
|     businessDesc: 'This is an updated business description from the automated test.'
 | |
| };
 | |
| 
 | |
| test.describe('Trainer Profile Editing @trainer-profile', () => {
 | |
|     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 to edit profile page', async ({ page }) => {
 | |
|         // Navigate to trainer profile page first
 | |
|         await page.goto('/trainer-profile/');
 | |
|         await expect(page).toHaveURL(/.*trainer-profile.*/);
 | |
|         await expect(page.locator('h1')).toContainText('Trainer Profile');
 | |
|         
 | |
|         // Click the edit profile button
 | |
|         await page.click('text=Edit Profile');
 | |
|         
 | |
|         // Verify we're on the edit profile page
 | |
|         await expect(page).toHaveURL(/.*edit-profile.*/);
 | |
|         await expect(page.locator('h1')).toContainText('Edit Trainer Profile');
 | |
|         
 | |
|         // Verify form is loaded with user's current info
 | |
|         await expect(page.locator('#first_name')).toBeVisible();
 | |
|         await expect(page.locator('#last_name')).toBeVisible();
 | |
|         await expect(page.locator('#display_name')).toBeVisible();
 | |
|     });
 | |
| 
 | |
|     test('should update basic profile information', async ({ page }) => {
 | |
|         // Go directly to edit profile page
 | |
|         await page.goto('/edit-profile/');
 | |
|         
 | |
|         // Clear and update form fields
 | |
|         await page.locator('#first_name').fill(UPDATED_INFO.firstName);
 | |
|         await page.locator('#last_name').fill(UPDATED_INFO.lastName);
 | |
|         await page.locator('#display_name').fill(UPDATED_INFO.displayName);
 | |
|         await page.locator('#description').fill(UPDATED_INFO.bio);
 | |
|         
 | |
|         // Submit the form
 | |
|         await page.click('button[name="hvac_update_profile"]');
 | |
|         
 | |
|         // Verify success message
 | |
|         await expect(page.locator('.hvac-message-success')).toBeVisible();
 | |
|         await expect(page.locator('.hvac-message-success')).toContainText('Your profile has been updated successfully');
 | |
|         
 | |
|         // Navigate to profile page to verify changes
 | |
|         await page.goto('/trainer-profile/');
 | |
|         
 | |
|         // Verify updated information is displayed
 | |
|         await expect(page.locator('.trainer-name')).toContainText(UPDATED_INFO.displayName);
 | |
|         await expect(page.locator('.trainer-bio')).toContainText(UPDATED_INFO.bio);
 | |
|     });
 | |
| 
 | |
|     test('should update business information', async ({ page }) => {
 | |
|         // Go to edit profile page
 | |
|         await page.goto('/edit-profile/');
 | |
|         
 | |
|         // Update business information
 | |
|         await page.locator('#business_name').fill(UPDATED_INFO.businessName);
 | |
|         await page.locator('#business_phone').fill(UPDATED_INFO.businessPhone);
 | |
|         await page.locator('#business_email').fill(UPDATED_INFO.businessEmail);
 | |
|         await page.locator('#business_description').fill(UPDATED_INFO.businessDesc);
 | |
|         
 | |
|         // Submit the form
 | |
|         await page.click('button[name="hvac_update_profile"]');
 | |
|         
 | |
|         // Verify success message
 | |
|         await expect(page.locator('.hvac-message-success')).toBeVisible();
 | |
|         
 | |
|         // Navigate to profile page to verify changes
 | |
|         await page.goto('/trainer-profile/');
 | |
|         
 | |
|         // Verify updated business information is displayed
 | |
|         await expect(page.locator('.business-name')).toContainText(UPDATED_INFO.businessName);
 | |
|         await expect(page.locator('.business-info')).toContainText(UPDATED_INFO.businessPhone);
 | |
|         await expect(page.locator('.business-info')).toContainText(UPDATED_INFO.businessEmail);
 | |
|         await expect(page.locator('.business-description')).toContainText(UPDATED_INFO.businessDesc);
 | |
|     });
 | |
| 
 | |
|     test('should display appropriate validation errors', async ({ page }) => {
 | |
|         // Go to edit profile page
 | |
|         await page.goto('/edit-profile/');
 | |
|         
 | |
|         // Clear required fields
 | |
|         await page.locator('#first_name').fill('');
 | |
|         await page.locator('#last_name').fill('');
 | |
|         await page.locator('#user_email').fill('');
 | |
|         
 | |
|         // Submit the form
 | |
|         await page.click('button[name="hvac_update_profile"]');
 | |
|         
 | |
|         // Verify validation errors
 | |
|         await expect(page.locator('#first_name_error')).toBeVisible();
 | |
|         await expect(page.locator('#last_name_error')).toBeVisible();
 | |
|         await expect(page.locator('#user_email_error')).toBeVisible();
 | |
|         
 | |
|         // Invalid email format
 | |
|         await page.locator('#user_email').fill('not-an-email');
 | |
|         await page.click('button[name="hvac_update_profile"]');
 | |
|         await expect(page.locator('#user_email_error')).toBeVisible();
 | |
|         await expect(page.locator('#user_email_error')).toContainText('valid email');
 | |
|     });
 | |
| 
 | |
|     test('should validate password change fields', async ({ page }) => {
 | |
|         // Go to edit profile page
 | |
|         await page.goto('/edit-profile/');
 | |
|         
 | |
|         // Enter incorrect current password
 | |
|         await page.locator('#current_password').fill('wrong-password');
 | |
|         await page.locator('#new_password').fill('NewPassword123');
 | |
|         await page.locator('#confirm_new_password').fill('NewPassword123');
 | |
|         
 | |
|         // Submit the form
 | |
|         await page.click('button[name="hvac_update_profile"]');
 | |
|         
 | |
|         // Verify error message for incorrect current password
 | |
|         await expect(page.locator('#current_password_error')).toBeVisible();
 | |
|         await expect(page.locator('#current_password_error')).toContainText('incorrect');
 | |
|         
 | |
|         // Test password mismatch
 | |
|         await page.locator('#current_password').fill(TEST_USER.password);
 | |
|         await page.locator('#new_password').fill('NewPassword123');
 | |
|         await page.locator('#confirm_new_password').fill('DifferentPassword123');
 | |
|         
 | |
|         // Submit the form
 | |
|         await page.click('button[name="hvac_update_profile"]');
 | |
|         
 | |
|         // Verify error message for password mismatch
 | |
|         await expect(page.locator('#confirm_new_password_error')).toBeVisible();
 | |
|         await expect(page.locator('#confirm_new_password_error')).toContainText('do not match');
 | |
|     });
 | |
| }); |