docs: update Memory Bank and implementation plan with development environment progress
- Update activeContext.md with current focus and status - Add development environment decisions to decisionLog.md - Update progress.md with completed tasks - Add development patterns to systemPatterns.md - Update productContext.md with environment details - Add Development Environment Setup section to implementation plan"
This commit is contained in:
		
							parent
							
								
									1d7fe2e071
								
							
						
					
					
						commit
						44b8d62722
					
				
					 13 changed files with 700 additions and 33 deletions
				
			
		
							
								
								
									
										229
									
								
								docs/design_guidance.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								docs/design_guidance.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,229 @@ | ||||||
|  | # Design Guidance for HVAC Community Events | ||||||
|  | 
 | ||||||
|  | This document provides design guidance for implementing the HVAC Community Events Management System based on the design references and WordPress theme integration requirements. | ||||||
|  | 
 | ||||||
|  | ## Design Reference Analysis | ||||||
|  | 
 | ||||||
|  | The design references in the `design_references/` directory provide valuable insights into the desired user interface and experience. These references should be used as guides for implementing the various pages of the plugin. | ||||||
|  | 
 | ||||||
|  | ## Core UI Elements and Patterns | ||||||
|  | 
 | ||||||
|  | ### 1. Navigation and Header Elements | ||||||
|  | 
 | ||||||
|  | - **Global Header**: The site uses the standard Upskill HVAC header with main navigation | ||||||
|  | - **Sub-navigation**: Pages have contextual navigation with clear action buttons | ||||||
|  | - **Breadcrumbs**: Event Summary page includes breadcrumb navigation (Trainer Home > Event Summary) | ||||||
|  | - **Action Buttons**: Consistently styled blue buttons with icons for primary actions | ||||||
|  | 
 | ||||||
|  | ### 2. Layout Patterns | ||||||
|  | 
 | ||||||
|  | - **Card-based Layout**: Information is organized in clean card sections with white backgrounds | ||||||
|  | - **Section Headers**: Clear typographic hierarchy with section titles | ||||||
|  | - **Grid Structure**: Responsive grid layout for statistics cards and information sections | ||||||
|  | - **Table Layout**: Clean tables with clear headers and alternating row colors | ||||||
|  | - **Form Layout**: Well-structured forms with logical grouping and clear labels | ||||||
|  | 
 | ||||||
|  | ### 3. Visual Elements | ||||||
|  | 
 | ||||||
|  | - **Color Scheme**: Light blue page backgrounds with white cards and blue accents | ||||||
|  | - **Typography**: Consistent heading hierarchy and paragraph styling | ||||||
|  | - **Icons**: Used to enhance recognition of statistics and action buttons | ||||||
|  | - **Spacing**: Consistent padding and margin patterns throughout | ||||||
|  | 
 | ||||||
|  | ## WordPress Theme Integration | ||||||
|  | 
 | ||||||
|  | ### 1. Leveraging Astra Theme | ||||||
|  | 
 | ||||||
|  | The Upskill HVAC site uses a child theme of Astra (4.9.0). To ensure consistency: | ||||||
|  | 
 | ||||||
|  | - Use Astra's hook system: | ||||||
|  |   - `astra_header_before`/`astra_header_after` for header content | ||||||
|  |   - `astra_primary_content_top`/`astra_primary_content_bottom` for main content area | ||||||
|  |   - `astra_entry_content_before`/`astra_entry_content_after` for content containers | ||||||
|  |    | ||||||
|  | - Use Astra's styling classes: | ||||||
|  |   - `.ast-container` for main content containers | ||||||
|  |   - `.ast-row` for grid layouts | ||||||
|  |   - `.ast-col-*` for column structures | ||||||
|  |   - `.ast-button` and variants for button styling | ||||||
|  | 
 | ||||||
|  | ### 2. Essential Blocks and Spectra Pro Integration | ||||||
|  | 
 | ||||||
|  | - **Content Blocks**: Use Essential Blocks for advanced content structures when appropriate | ||||||
|  | - **Layout Elements**: Leverage Spectra Pro's advanced layout options for complex page sections | ||||||
|  | - **Component Styling**: Apply Spectra's pre-styled components rather than custom CSS when possible | ||||||
|  | 
 | ||||||
|  | ### 3. Custom Templates | ||||||
|  | 
 | ||||||
|  | When creating custom templates, follow these guidelines: | ||||||
|  | 
 | ||||||
|  | 1. Start by extending default theme templates: | ||||||
|  |    ```php | ||||||
|  |    // Example template hierarchy | ||||||
|  |    get_header(); | ||||||
|  |    ?> | ||||||
|  |    <div id="primary" class="ast-container"> | ||||||
|  |        <main id="main" class="site-main"> | ||||||
|  |            <!-- Your custom content here --> | ||||||
|  |        </main> | ||||||
|  |    </div> | ||||||
|  |    <?php | ||||||
|  |    get_footer(); | ||||||
|  |    ``` | ||||||
|  | 
 | ||||||
|  | 2. Use Astra's content wrappers: | ||||||
|  |    ```php | ||||||
|  |    <div class="ast-container"> | ||||||
|  |        <div class="ast-row"> | ||||||
|  |            <div class="ast-col-lg-8"> | ||||||
|  |                <!-- Main content --> | ||||||
|  |            </div> | ||||||
|  |            <div class="ast-col-lg-4"> | ||||||
|  |                <!-- Sidebar content --> | ||||||
|  |            </div> | ||||||
|  |        </div> | ||||||
|  |    </div> | ||||||
|  |    ``` | ||||||
|  | 
 | ||||||
|  | ## Page-Specific Implementation Guidelines | ||||||
|  | 
 | ||||||
|  | ### 1. Trainer Dashboard | ||||||
|  | 
 | ||||||
|  | Based on `upskillhvac.com_hce-dashboard_ (4).png`: | ||||||
|  | 
 | ||||||
|  | - **Page Structure**: | ||||||
|  |   - Top navigation bar with action buttons | ||||||
|  |   - "Your Stats" section with 5 stat cards in a responsive grid | ||||||
|  |   - "Your Events" section with tabbed filtering and table display | ||||||
|  | 
 | ||||||
|  | - **Theme Integration**: | ||||||
|  |   ```php | ||||||
|  |   // Stat cards implementation example | ||||||
|  |   echo '<div class="ast-row">'; | ||||||
|  |   foreach ($stats as $stat) { | ||||||
|  |       echo '<div class="ast-col-md-6 ast-col-lg-3">'; | ||||||
|  |       echo '<div class="hvac-stat-card">'; | ||||||
|  |       // Card content | ||||||
|  |       echo '</div>'; | ||||||
|  |       echo '</div>'; | ||||||
|  |   } | ||||||
|  |   echo '</div>'; | ||||||
|  |   ``` | ||||||
|  | 
 | ||||||
|  | - **Responsive Behavior**: | ||||||
|  |   - Statistics cards stack on mobile (1 column) | ||||||
|  |   - Table becomes scrollable on smaller screens | ||||||
|  |   - Action buttons adapt to mobile layout | ||||||
|  | 
 | ||||||
|  | ### 2. Event Summary Page | ||||||
|  | 
 | ||||||
|  | Based on `upskillhvac.com_hce-event-summary__event_id=1662 (1).png`: | ||||||
|  | 
 | ||||||
|  | - **Page Structure**: | ||||||
|  |   - Breadcrumb navigation | ||||||
|  |   - Event title with action buttons | ||||||
|  |   - Event details section with 4 info cards | ||||||
|  |   - Event description with formatted sections | ||||||
|  |   - Transactions table | ||||||
|  | 
 | ||||||
|  | - **Theme Integration**: | ||||||
|  |   ```php | ||||||
|  |   // Event details cards implementation example | ||||||
|  |   echo '<div class="ast-row">'; | ||||||
|  |   echo '<div class="ast-col-md-6 ast-col-lg-3">'; | ||||||
|  |   echo '<div class="hvac-event-detail-card">'; | ||||||
|  |   echo '<h4>Date & Time</h4>'; | ||||||
|  |   // Card content | ||||||
|  |   echo '</div>'; | ||||||
|  |   echo '</div>'; | ||||||
|  |   // Repeat for other cards | ||||||
|  |   echo '</div>'; | ||||||
|  |   ``` | ||||||
|  | 
 | ||||||
|  | - **Typography**: | ||||||
|  |   - Use theme's heading hierarchy: `<h1>` for event title, `<h2>` for main sections, `<h3>` for subsections | ||||||
|  |   - Follow theme's paragraph styling for descriptions | ||||||
|  | 
 | ||||||
|  | ### 3. Login Page | ||||||
|  | 
 | ||||||
|  | Based on `upskillhvac.com_hce-login_.png`: | ||||||
|  | 
 | ||||||
|  | - **Form Styling**: | ||||||
|  |   - Center-aligned form on a card background | ||||||
|  |   - Standard form field spacing | ||||||
|  |   - Consistent button styling | ||||||
|  | 
 | ||||||
|  | - **Theme Integration**: | ||||||
|  |   - Use Astra's form styling classes | ||||||
|  |   - Maintain consistent padding and margin with theme | ||||||
|  | 
 | ||||||
|  | ### 4. Modify Event Page | ||||||
|  | 
 | ||||||
|  | Based on `upskillhvac.com_hce-modify-event__event_id=1662.png`: | ||||||
|  | 
 | ||||||
|  | - **Form Structure**: | ||||||
|  |   - Clearly labeled sections | ||||||
|  |   - Logical grouping of related fields | ||||||
|  |   - Consistent form element styling | ||||||
|  | 
 | ||||||
|  | - **Theme Integration**: | ||||||
|  |   - Use theme's form element styling | ||||||
|  |   - Follow theme's spacing patterns | ||||||
|  | 
 | ||||||
|  | ## Responsive Design Guidelines | ||||||
|  | 
 | ||||||
|  | 1. **Breakpoints**: Use Astra theme's breakpoints: | ||||||
|  |    - Mobile: < 544px | ||||||
|  |    - Tablet: 544px - 921px | ||||||
|  |    - Desktop: > 921px | ||||||
|  | 
 | ||||||
|  | 2. **Mobile Adaptations**: | ||||||
|  |    - Cards stack vertically | ||||||
|  |    - Tables become scrollable | ||||||
|  |    - Form fields expand to full width | ||||||
|  |    - Navigation adapts to mobile patterns | ||||||
|  | 
 | ||||||
|  | 3. **Testing across Devices**: | ||||||
|  |    - Test on multiple screen sizes | ||||||
|  |    - Verify theme's responsive behavior is maintained | ||||||
|  |    - Ensure tap targets are appropriately sized on mobile | ||||||
|  | 
 | ||||||
|  | ## Theme Compatibility Testing | ||||||
|  | 
 | ||||||
|  | 1. **Visual Regression Testing**: | ||||||
|  |    - Test across different screen sizes | ||||||
|  |    - Compare against design references | ||||||
|  |    - Verify consistent spacing and alignment | ||||||
|  | 
 | ||||||
|  | 2. **Plugin Compatibility**: | ||||||
|  |    - Test with all active plugins: | ||||||
|  |      - The Events Calendar suite | ||||||
|  |      - Spectra Pro | ||||||
|  |      - Essential Blocks | ||||||
|  |      - Premium Starter Templates | ||||||
|  | 
 | ||||||
|  | 3. **Performance Testing**: | ||||||
|  |    - Check load times with theme integration | ||||||
|  |    - Monitor CSS specificity conflicts | ||||||
|  |    - Test JavaScript interactions | ||||||
|  | 
 | ||||||
|  | ## Best Practices | ||||||
|  | 
 | ||||||
|  | 1. **CSS Approach**: | ||||||
|  |    - Use theme's CSS variables when available | ||||||
|  |    - Avoid overriding theme styles with `!important` | ||||||
|  |    - Use the WordPress CSS specificity cascade appropriately | ||||||
|  |    - Keep custom CSS minimal and targeted | ||||||
|  | 
 | ||||||
|  | 2. **JavaScript Integration**: | ||||||
|  |    - Follow theme's JavaScript patterns and dependencies | ||||||
|  |    - Initialize components after DOM is ready | ||||||
|  |    - Use event delegation for dynamically loaded content | ||||||
|  |    - Namespace custom JavaScript functions | ||||||
|  | 
 | ||||||
|  | 3. **Template Organization**: | ||||||
|  |    - Keep templates modular and reusable | ||||||
|  |    - Use get_template_part() for component reuse | ||||||
|  |    - Follow Astra's naming conventions for consistency | ||||||
|  | 
 | ||||||
|  | By following these guidelines, the implementation will maintain consistency with the existing WordPress theme while achieving the design goals shown in the reference screenshots. | ||||||
|  | @ -1,28 +1,15 @@ | ||||||
| FROM php:7.4-fpm | FROM wordpress:6.7.2-php8.1-fpm | ||||||
| WORKDIR /var/www/html |  | ||||||
| 
 | 
 | ||||||
| # Install system dependencies | # Install dependencies | ||||||
| RUN apt-get update && \ | RUN apt-get update && apt-get install -y \ | ||||||
|     apt-get install -y \ |     vim \ | ||||||
|     git \ |  | ||||||
|     unzip \ |  | ||||||
|     libpng-dev \ |  | ||||||
|     libjpeg-dev \ |  | ||||||
|     libpq-dev \ |  | ||||||
|     libzip-dev \ |     libzip-dev \ | ||||||
|     mariadb-client \ |     procps \ | ||||||
|     && docker-php-ext-configure gd --with-jpeg \ |     net-tools \ | ||||||
|     && docker-php-ext-install -j$(nproc) gd mysqli pdo_mysql zip |     && rm -rf /var/lib/apt/lists/* | ||||||
| 
 | 
 | ||||||
| # Install Composer | # Install PHP extensions | ||||||
| RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer | RUN docker-php-ext-install mysqli pdo pdo_mysql zip | ||||||
| 
 | 
 | ||||||
| # Copy composer files first to cache dependencies | # Verify PDO MySQL installation | ||||||
| COPY composer.json composer.lock ./ | RUN php -r "if (!extension_loaded('pdo_mysql')) { exit(1); }" | ||||||
| RUN composer install --no-dev --no-scripts --no-autoloader |  | ||||||
| 
 |  | ||||||
| # Copy remaining files |  | ||||||
| COPY . . |  | ||||||
| 
 |  | ||||||
| # Finish composer setup |  | ||||||
| RUN composer dump-autoload --optimize |  | ||||||
|  | @ -1,12 +1,13 @@ | ||||||
| #!/bin/bash | #!/bin/bash | ||||||
| 
 | 
 | ||||||
| # Load environment variables | # Load environment variables | ||||||
| if [ ! -f ../.env ]; then | if [ ! -f ./.env ]; then | ||||||
|     echo "Error: .env file not found!" |     echo "Error: .env file not found!" | ||||||
|     exit 1 |     exit 1 | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| source ../.env | echo "Sourcing .env file from: $(pwd)/.env" | ||||||
|  | source ./.env | ||||||
| 
 | 
 | ||||||
| # Colors for output | # Colors for output | ||||||
| GREEN='\033[0;32m' | GREEN='\033[0;32m' | ||||||
|  | @ -19,6 +20,7 @@ RUN_UNIT=false | ||||||
| RUN_INTEGRATION=false | RUN_INTEGRATION=false | ||||||
| RUN_E2E=false | RUN_E2E=false | ||||||
| DEBUG=false | DEBUG=false | ||||||
|  | TEST_SUITE="" | ||||||
| 
 | 
 | ||||||
| # Parse arguments | # Parse arguments | ||||||
| while [[ $# -gt 0 ]]; do | while [[ $# -gt 0 ]]; do | ||||||
|  | @ -35,6 +37,11 @@ while [[ $# -gt 0 ]]; do | ||||||
|             RUN_E2E=true |             RUN_E2E=true | ||||||
|             shift |             shift | ||||||
|             ;; |             ;; | ||||||
|  |         --login) | ||||||
|  |             RUN_E2E=true | ||||||
|  |             TEST_SUITE="login" | ||||||
|  |             shift | ||||||
|  |             ;; | ||||||
|         --debug) |         --debug) | ||||||
|             DEBUG=true |             DEBUG=true | ||||||
|             shift |             shift | ||||||
|  | @ -87,5 +94,9 @@ fi | ||||||
| 
 | 
 | ||||||
| # Run E2E tests | # Run E2E tests | ||||||
| if $RUN_E2E; then | if $RUN_E2E; then | ||||||
|     run_tests "E2E" "npx playwright test --config=tests/e2e/playwright.config.ts" |     if [ -n "$TEST_SUITE" ]; then | ||||||
|  |         run_tests "E2E" "npx playwright test --config=tests/e2e/playwright.config.ts --grep @$TEST_SUITE" | ||||||
|  |     else | ||||||
|  |         run_tests "E2E" "npx playwright test --config=tests/e2e/playwright.config.ts" | ||||||
|  |     fi | ||||||
| fi | fi | ||||||
|  | @ -31,11 +31,6 @@ services: | ||||||
|       - WORDPRESS_DB_NAME=${DEV_DB_NAME} |       - WORDPRESS_DB_NAME=${DEV_DB_NAME} | ||||||
|       - WORDPRESS_DEBUG=1 |       - WORDPRESS_DEBUG=1 | ||||||
|       - O=${O:-} |       - O=${O:-} | ||||||
|       - WORDPRESS_CONFIG_EXTRA=| |  | ||||||
|         define('WP_DEBUG_LOG', true); |  | ||||||
|         define('WP_DEBUG_DISPLAY', false); |  | ||||||
|         define('SCRIPT_DEBUG', true); |  | ||||||
|         define('FORCE_SSL_ADMIN', true); |  | ||||||
| 
 | 
 | ||||||
|   nginx: |   nginx: | ||||||
|     depends_on: |     depends_on: | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								wordpress-dev/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								wordpress-dev/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | { | ||||||
|  |   "name": "wordpress-dev", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "lockfileVersion": 3, | ||||||
|  |   "requires": true, | ||||||
|  |   "packages": { | ||||||
|  |     "": { | ||||||
|  |       "name": "wordpress-dev", | ||||||
|  |       "version": "1.0.0", | ||||||
|  |       "license": "ISC", | ||||||
|  |       "devDependencies": { | ||||||
|  |         "typescript": "^5.8.2" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/typescript": { | ||||||
|  |       "version": "5.8.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", | ||||||
|  |       "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", | ||||||
|  |       "dev": true, | ||||||
|  |       "license": "Apache-2.0", | ||||||
|  |       "bin": { | ||||||
|  |         "tsc": "bin/tsc", | ||||||
|  |         "tsserver": "bin/tsserver" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=14.17" | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								wordpress-dev/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								wordpress-dev/package.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | { | ||||||
|  |   "name": "wordpress-dev", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "**Status**: Active/Authoritative **Last Updated**: March 12, 2025 **Scope**: Development environment setup and configuration", | ||||||
|  |   "main": "index.js", | ||||||
|  |   "directories": { | ||||||
|  |     "test": "tests" | ||||||
|  |   }, | ||||||
|  |   "scripts": { | ||||||
|  |     "test": "echo \"Error: no test specified\" && exit 1" | ||||||
|  |   }, | ||||||
|  |   "keywords": [], | ||||||
|  |   "author": "", | ||||||
|  |   "license": "ISC", | ||||||
|  |   "devDependencies": { | ||||||
|  |     "typescript": "^5.8.2" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								wordpress-dev/php-fpm.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								wordpress-dev/php-fpm.conf
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | [www] | ||||||
|  | user = www-data | ||||||
|  | group = www-data | ||||||
|  | listen = 0.0.0.0:9000 | ||||||
|  | pm = dynamic | ||||||
|  | pm.max_children = 5 | ||||||
|  | pm.start_servers = 2 | ||||||
|  | pm.min_spare_servers = 1 | ||||||
|  | pm.max_spare_servers = 3 | ||||||
|  | 
 | ||||||
|  | php_admin_value[error_log] = /proc/self/fd/2 | ||||||
|  | php_admin_flag[log_errors] = on | ||||||
|  | php_admin_value[post_max_size] = 64M | ||||||
|  | php_admin_value[upload_max_filesize] = 64M | ||||||
							
								
								
									
										4
									
								
								wordpress-dev/php.ini/custom.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								wordpress-dev/php.ini/custom.ini
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | ||||||
|  | memory_limit = 256M | ||||||
|  | post_max_size = 64M | ||||||
|  | upload_max_filesize = 64M | ||||||
|  | max_execution_time = 300 | ||||||
							
								
								
									
										71
									
								
								wordpress-dev/playwright-report/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								wordpress-dev/playwright-report/index.html
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										30
									
								
								wordpress-dev/tests/e2e/playwright.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								wordpress-dev/tests/e2e/playwright.config.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | import type { PlaywrightTestConfig } from '@playwright/test'; | ||||||
|  | 
 | ||||||
|  | const config: PlaywrightTestConfig = { | ||||||
|  |   testDir: './tests', | ||||||
|  |   timeout: 30000, | ||||||
|  |   forbidOnly: !!process.env.CI, | ||||||
|  |   retries: process.env.CI ? 2 : 0, | ||||||
|  |   workers: process.env.CI ? 1 : undefined, | ||||||
|  |   reporter: [ | ||||||
|  |     ['list'], | ||||||
|  |     ['html', { open: 'never' }], | ||||||
|  |     ['junit', { outputFile: '../test-results/e2e-results.xml' }] | ||||||
|  |   ], | ||||||
|  |   use: { | ||||||
|  |     baseURL: process.env.WORDPRESS_URL || 'http://localhost:8080', | ||||||
|  |     trace: 'on-first-retry', | ||||||
|  |     video: 'on-first-retry', | ||||||
|  |     screenshot: 'only-on-failure' | ||||||
|  |   }, | ||||||
|  |   projects: [ | ||||||
|  |     { | ||||||
|  |       name: 'chromium', | ||||||
|  |       use: { | ||||||
|  |         browserName: 'chromium', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   ], | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export default config; | ||||||
							
								
								
									
										45
									
								
								wordpress-dev/tests/e2e/tests/login.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								wordpress-dev/tests/e2e/tests/login.spec.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | ||||||
|  | import { test, expect } from '@playwright/test'; | ||||||
|  | 
 | ||||||
|  | test.describe('Login Functionality @login', () => { | ||||||
|  |   test.beforeEach(async ({ page }) => { | ||||||
|  |     await page.goto('/hce-login'); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   test('displays login form', async ({ page }) => { | ||||||
|  |     await expect(page.locator('#trainer-login-form')).toBeVisible(); | ||||||
|  |     await expect(page.locator('input[name="username"]')).toBeVisible(); | ||||||
|  |     await expect(page.locator('input[name="password"]')).toBeVisible(); | ||||||
|  |     await expect(page.locator('input[name="remember"]')).toBeVisible(); | ||||||
|  |     await expect(page.locator('button[type="submit"]')).toBeVisible(); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   test('shows error on invalid credentials', async ({ page }) => { | ||||||
|  |     await page.fill('input[name="username"]', 'invalid@example.com'); | ||||||
|  |     await page.fill('input[name="password"]', 'wrongpassword'); | ||||||
|  |     await page.click('button[type="submit"]'); | ||||||
|  |      | ||||||
|  |     await expect(page.locator('#login-message')).toContainText('Invalid username or password'); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   test('redirects to dashboard on successful login', async ({ page }) => { | ||||||
|  |     await page.fill('input[name="username"]', process.env.WP_ADMIN_USER || 'devadmin'); | ||||||
|  |     await page.fill('input[name="password"]', process.env.WP_ADMIN_PASSWORD || ''); | ||||||
|  |     await page.click('button[type="submit"]'); | ||||||
|  |      | ||||||
|  |     await expect(page).toHaveURL(/.*trainer-dashboard/); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   test('remembers login state', async ({ page, context }) => { | ||||||
|  |     await page.fill('input[name="username"]', process.env.WP_ADMIN_USER || 'devadmin'); | ||||||
|  |     await page.fill('input[name="password"]', process.env.WP_ADMIN_PASSWORD || ''); | ||||||
|  |     await page.check('input[name="remember"]'); | ||||||
|  |     await page.click('button[type="submit"]'); | ||||||
|  |      | ||||||
|  |     await expect(page).toHaveURL(/.*trainer-dashboard/); | ||||||
|  |      | ||||||
|  |     // Create a new page in the same context to verify persistent login
 | ||||||
|  |     const newPage = await context.newPage(); | ||||||
|  |     await newPage.goto('/trainer-dashboard'); | ||||||
|  |     await expect(newPage).not.toHaveURL(/.*hce-login/); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										120
									
								
								wordpress-dev/tests/test-results/e2e-results.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								wordpress-dev/tests/test-results/e2e-results.xml
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,120 @@ | ||||||
|  | <testsuites id="" name="" tests="4" failures="4" skipped="0" errors="0" time="3.341389"> | ||||||
|  | <testsuite name="login.spec.ts" timestamp="2025-03-25T15:01:39.745Z" hostname="chromium" tests="4" failures="4" skipped="0" time="0.927" errors="0"> | ||||||
|  | <testcase name="Login Functionality @login › displays login form" classname="login.spec.ts" time="0.341"> | ||||||
|  | <failure message="login.spec.ts:8:7 displays login form" type="FAILURE"> | ||||||
|  | <![CDATA[  [chromium] › login.spec.ts:8:7 › Login Functionality @login › displays login form ──────────────── | ||||||
|  | 
 | ||||||
|  |     Error: page.goto: net::ERR_CONNECTION_RESET at http://localhost:8080/hce-login | ||||||
|  |     Call log: | ||||||
|  |       - navigating to "http://localhost:8080/hce-login", waiting until "load" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |       3 | test.describe('Login Functionality @login', () => { | ||||||
|  |       4 |   test.beforeEach(async ({ page }) => { | ||||||
|  |     > 5 |     await page.goto('/hce-login'); | ||||||
|  |         |                ^ | ||||||
|  |       6 |   }); | ||||||
|  |       7 | | ||||||
|  |       8 |   test('displays login form', async ({ page }) => { | ||||||
|  |         at /Users/ben/dev/upskill-event-manager/wordpress-dev/tests/e2e/tests/login.spec.ts:5:16 | ||||||
|  | 
 | ||||||
|  |     attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── | ||||||
|  |     test-results/login-Login-Functionality-login-displays-login-form-chromium/test-failed-1.png | ||||||
|  |     ──────────────────────────────────────────────────────────────────────────────────────────────── | ||||||
|  | ]]> | ||||||
|  | </failure> | ||||||
|  | <system-out> | ||||||
|  | <![CDATA[ | ||||||
|  | [[ATTACHMENT|../../test-results/login-Login-Functionality-login-displays-login-form-chromium/test-failed-1.png]] | ||||||
|  | ]]> | ||||||
|  | </system-out> | ||||||
|  | </testcase> | ||||||
|  | <testcase name="Login Functionality @login › shows error on invalid credentials" classname="login.spec.ts" time="0.176"> | ||||||
|  | <failure message="login.spec.ts:16:7 shows error on invalid credentials" type="FAILURE"> | ||||||
|  | <![CDATA[  [chromium] › login.spec.ts:16:7 › Login Functionality @login › shows error on invalid credentials  | ||||||
|  | 
 | ||||||
|  |     Error: page.goto: net::ERR_CONNECTION_RESET at http://localhost:8080/hce-login | ||||||
|  |     Call log: | ||||||
|  |       - navigating to "http://localhost:8080/hce-login", waiting until "load" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |       3 | test.describe('Login Functionality @login', () => { | ||||||
|  |       4 |   test.beforeEach(async ({ page }) => { | ||||||
|  |     > 5 |     await page.goto('/hce-login'); | ||||||
|  |         |                ^ | ||||||
|  |       6 |   }); | ||||||
|  |       7 | | ||||||
|  |       8 |   test('displays login form', async ({ page }) => { | ||||||
|  |         at /Users/ben/dev/upskill-event-manager/wordpress-dev/tests/e2e/tests/login.spec.ts:5:16 | ||||||
|  | 
 | ||||||
|  |     attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── | ||||||
|  |     test-results/login-Login-Functionality--5805a-rror-on-invalid-credentials-chromium/test-failed-1.png | ||||||
|  |     ──────────────────────────────────────────────────────────────────────────────────────────────── | ||||||
|  | ]]> | ||||||
|  | </failure> | ||||||
|  | <system-out> | ||||||
|  | <![CDATA[ | ||||||
|  | [[ATTACHMENT|../../test-results/login-Login-Functionality--5805a-rror-on-invalid-credentials-chromium/test-failed-1.png]] | ||||||
|  | ]]> | ||||||
|  | </system-out> | ||||||
|  | </testcase> | ||||||
|  | <testcase name="Login Functionality @login › redirects to dashboard on successful login" classname="login.spec.ts" time="0.218"> | ||||||
|  | <failure message="login.spec.ts:24:7 redirects to dashboard on successful login" type="FAILURE"> | ||||||
|  | <![CDATA[  [chromium] › login.spec.ts:24:7 › Login Functionality @login › redirects to dashboard on successful login  | ||||||
|  | 
 | ||||||
|  |     Error: page.goto: net::ERR_CONNECTION_RESET at http://localhost:8080/hce-login | ||||||
|  |     Call log: | ||||||
|  |       - navigating to "http://localhost:8080/hce-login", waiting until "load" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |       3 | test.describe('Login Functionality @login', () => { | ||||||
|  |       4 |   test.beforeEach(async ({ page }) => { | ||||||
|  |     > 5 |     await page.goto('/hce-login'); | ||||||
|  |         |                ^ | ||||||
|  |       6 |   }); | ||||||
|  |       7 | | ||||||
|  |       8 |   test('displays login form', async ({ page }) => { | ||||||
|  |         at /Users/ben/dev/upskill-event-manager/wordpress-dev/tests/e2e/tests/login.spec.ts:5:16 | ||||||
|  | 
 | ||||||
|  |     attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── | ||||||
|  |     test-results/login-Login-Functionality--0d214-shboard-on-successful-login-chromium/test-failed-1.png | ||||||
|  |     ──────────────────────────────────────────────────────────────────────────────────────────────── | ||||||
|  | ]]> | ||||||
|  | </failure> | ||||||
|  | <system-out> | ||||||
|  | <![CDATA[ | ||||||
|  | [[ATTACHMENT|../../test-results/login-Login-Functionality--0d214-shboard-on-successful-login-chromium/test-failed-1.png]] | ||||||
|  | ]]> | ||||||
|  | </system-out> | ||||||
|  | </testcase> | ||||||
|  | <testcase name="Login Functionality @login › remembers login state" classname="login.spec.ts" time="0.192"> | ||||||
|  | <failure message="login.spec.ts:32:7 remembers login state" type="FAILURE"> | ||||||
|  | <![CDATA[  [chromium] › login.spec.ts:32:7 › Login Functionality @login › remembers login state ───────────── | ||||||
|  | 
 | ||||||
|  |     Error: page.goto: net::ERR_CONNECTION_RESET at http://localhost:8080/hce-login | ||||||
|  |     Call log: | ||||||
|  |       - navigating to "http://localhost:8080/hce-login", waiting until "load" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |       3 | test.describe('Login Functionality @login', () => { | ||||||
|  |       4 |   test.beforeEach(async ({ page }) => { | ||||||
|  |     > 5 |     await page.goto('/hce-login'); | ||||||
|  |         |                ^ | ||||||
|  |       6 |   }); | ||||||
|  |       7 | | ||||||
|  |       8 |   test('displays login form', async ({ page }) => { | ||||||
|  |         at /Users/ben/dev/upskill-event-manager/wordpress-dev/tests/e2e/tests/login.spec.ts:5:16 | ||||||
|  | 
 | ||||||
|  |     attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── | ||||||
|  |     test-results/login-Login-Functionality-login-remembers-login-state-chromium/test-failed-1.png | ||||||
|  |     ──────────────────────────────────────────────────────────────────────────────────────────────── | ||||||
|  | ]]> | ||||||
|  | </failure> | ||||||
|  | <system-out> | ||||||
|  | <![CDATA[ | ||||||
|  | [[ATTACHMENT|../../test-results/login-Login-Functionality-login-remembers-login-state-chromium/test-failed-1.png]] | ||||||
|  | ]]> | ||||||
|  | </system-out> | ||||||
|  | </testcase> | ||||||
|  | </testsuite> | ||||||
|  | </testsuites> | ||||||
							
								
								
									
										113
									
								
								wordpress-dev/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								wordpress-dev/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,113 @@ | ||||||
|  | { | ||||||
|  |   "compilerOptions": { | ||||||
|  |     /* Visit https://aka.ms/tsconfig to read more about this file */ | ||||||
|  | 
 | ||||||
|  |     /* Projects */ | ||||||
|  |     // "incremental": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ | ||||||
|  |     // "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */ | ||||||
|  |     // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path to .tsbuildinfo incremental compilation file. */ | ||||||
|  |     // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */ | ||||||
|  |     // "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */ | ||||||
|  |     // "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */ | ||||||
|  | 
 | ||||||
|  |     /* Language and Environment */ | ||||||
|  |     "target": "es2016",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ | ||||||
|  |     // "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */ | ||||||
|  |     // "jsx": "preserve",                                /* Specify what JSX code is generated. */ | ||||||
|  |     // "libReplacement": true,                           /* Enable lib replacement. */ | ||||||
|  |     // "experimentalDecorators": true,                   /* Enable experimental support for legacy experimental decorators. */ | ||||||
|  |     // "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */ | ||||||
|  |     // "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ | ||||||
|  |     // "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ | ||||||
|  |     // "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ | ||||||
|  |     // "reactNamespace": "",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ | ||||||
|  |     // "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */ | ||||||
|  |     // "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */ | ||||||
|  |     // "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */ | ||||||
|  | 
 | ||||||
|  |     /* Modules */ | ||||||
|  |     "module": "commonjs",                                /* Specify what module code is generated. */ | ||||||
|  |     // "rootDir": "./",                                  /* Specify the root folder within your source files. */ | ||||||
|  |     // "moduleResolution": "node10",                     /* Specify how TypeScript looks up a file from a given module specifier. */ | ||||||
|  |     // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */ | ||||||
|  |     // "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */ | ||||||
|  |     // "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */ | ||||||
|  |     // "typeRoots": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */ | ||||||
|  |     // "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */ | ||||||
|  |     // "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */ | ||||||
|  |     // "moduleSuffixes": [],                             /* List of file name suffixes to search when resolving a module. */ | ||||||
|  |     // "allowImportingTsExtensions": true,               /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ | ||||||
|  |     // "rewriteRelativeImportExtensions": true,          /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */ | ||||||
|  |     // "resolvePackageJsonExports": true,                /* Use the package.json 'exports' field when resolving package imports. */ | ||||||
|  |     // "resolvePackageJsonImports": true,                /* Use the package.json 'imports' field when resolving imports. */ | ||||||
|  |     // "customConditions": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ | ||||||
|  |     // "noUncheckedSideEffectImports": true,             /* Check side effect imports. */ | ||||||
|  |     // "resolveJsonModule": true,                        /* Enable importing .json files. */ | ||||||
|  |     // "allowArbitraryExtensions": true,                 /* Enable importing files with any extension, provided a declaration file is present. */ | ||||||
|  |     // "noResolve": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */ | ||||||
|  | 
 | ||||||
|  |     /* JavaScript Support */ | ||||||
|  |     // "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ | ||||||
|  |     // "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */ | ||||||
|  |     // "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ | ||||||
|  | 
 | ||||||
|  |     /* Emit */ | ||||||
|  |     // "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ | ||||||
|  |     // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */ | ||||||
|  |     // "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */ | ||||||
|  |     // "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */ | ||||||
|  |     // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */ | ||||||
|  |     // "noEmit": true,                                   /* Disable emitting files from a compilation. */ | ||||||
|  |     // "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ | ||||||
|  |     // "outDir": "./",                                   /* Specify an output folder for all emitted files. */ | ||||||
|  |     // "removeComments": true,                           /* Disable emitting comments. */ | ||||||
|  |     // "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ | ||||||
|  |     // "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ | ||||||
|  |     // "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */ | ||||||
|  |     // "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */ | ||||||
|  |     // "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */ | ||||||
|  |     // "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ | ||||||
|  |     // "newLine": "crlf",                                /* Set the newline character for emitting files. */ | ||||||
|  |     // "stripInternal": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ | ||||||
|  |     // "noEmitHelpers": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */ | ||||||
|  |     // "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */ | ||||||
|  |     // "preserveConstEnums": true,                       /* Disable erasing 'const enum' declarations in generated code. */ | ||||||
|  |     // "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */ | ||||||
|  | 
 | ||||||
|  |     /* Interop Constraints */ | ||||||
|  |     // "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */ | ||||||
|  |     // "verbatimModuleSyntax": true,                     /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ | ||||||
|  |     // "isolatedDeclarations": true,                     /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ | ||||||
|  |     // "erasableSyntaxOnly": true,                       /* Do not allow runtime constructs that are not part of ECMAScript. */ | ||||||
|  |     // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */ | ||||||
|  |     "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ | ||||||
|  |     // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ | ||||||
|  |     "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */ | ||||||
|  | 
 | ||||||
|  |     /* Type Checking */ | ||||||
|  |     "strict": true,                                      /* Enable all strict type-checking options. */ | ||||||
|  |     // "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */ | ||||||
|  |     // "strictNullChecks": true,                         /* When type checking, take into account 'null' and 'undefined'. */ | ||||||
|  |     // "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ | ||||||
|  |     // "strictBindCallApply": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ | ||||||
|  |     // "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */ | ||||||
|  |     // "strictBuiltinIteratorReturn": true,              /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ | ||||||
|  |     // "noImplicitThis": true,                           /* Enable error reporting when 'this' is given the type 'any'. */ | ||||||
|  |     // "useUnknownInCatchVariables": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */ | ||||||
|  |     // "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */ | ||||||
|  |     // "noUnusedLocals": true,                           /* Enable error reporting when local variables aren't read. */ | ||||||
|  |     // "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read. */ | ||||||
|  |     // "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */ | ||||||
|  |     // "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */ | ||||||
|  |     // "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */ | ||||||
|  |     // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to a type when accessed using an index. */ | ||||||
|  |     // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */ | ||||||
|  |     // "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */ | ||||||
|  |     // "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */ | ||||||
|  |     // "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */ | ||||||
|  | 
 | ||||||
|  |     /* Completeness */ | ||||||
|  |     // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */ | ||||||
|  |     "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */ | ||||||
|  |   } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue