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
|
||||||
|
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"
|
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