- Created Page Object Model structure for all trainer-facing pages - Implemented complete test coverage for trainer journey steps 1-8 - Added centralized test data management with test users and events - Updated run-tests.sh with --trainer-journey option for easy execution - Enhanced documentation with test setup, usage, and troubleshooting guides - Created verification scripts to ensure proper test environment setup - Prepared framework for Phase 2/3 features (email, check-in, certificates) This implementation provides a solid foundation for testing the complete trainer user journey and can be easily extended as new features are deployed.
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| # Load environment variables
 | |
| if [ ! -f ./.env ]; then
 | |
|     echo "Error: .env file not found!"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| echo "Sourcing .env file from: $(pwd)/.env"
 | |
| source ./.env
 | |
| 
 | |
| # Change to the script's directory parent (wordpress-dev)
 | |
| SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) # Corrected: &> and &&
 | |
| cd "$SCRIPT_DIR/.." || exit 1
 | |
| echo "Changed working directory to: $(pwd)"
 | |
| 
 | |
| # Colors for output
 | |
| GREEN='\033[0;32m'
 | |
| RED='\033[0;31m'
 | |
| YELLOW='\033[1;33m'
 | |
| NC='\033[0m'
 | |
| 
 | |
| # Default values
 | |
| RUN_UNIT=false
 | |
| RUN_INTEGRATION=false
 | |
| RUN_E2E=false
 | |
| DEBUG=false
 | |
| TEST_SUITE=""
 | |
| PHPUNIT_FILTER=""
 | |
| 
 | |
| # Parse arguments
 | |
| while [[ $# -gt 0 ]]; do
 | |
|     case $1 in
 | |
|         --unit)
 | |
|             RUN_UNIT=true
 | |
|             shift
 | |
|             ;;
 | |
|         --integration)
 | |
|             RUN_INTEGRATION=true
 | |
|             shift
 | |
|             ;;
 | |
|         --e2e)
 | |
|             RUN_E2E=true
 | |
|             shift
 | |
|             ;;
 | |
|         --login)
 | |
|             RUN_E2E=true
 | |
|             TEST_SUITE="login"
 | |
|             shift
 | |
|             ;;
 | |
|         --trainer-journey)
 | |
|             RUN_E2E=true
 | |
|             TEST_SUITE="trainer-journey"
 | |
|             shift
 | |
|             ;;
 | |
|         --debug)
 | |
|             DEBUG=true
 | |
|             shift
 | |
|             ;;
 | |
|         --filter)
 | |
|             if [[ -z "$2" || "$2" == --* ]]; then
 | |
|                 echo "Error: --filter option requires a value."
 | |
|                 exit 1
 | |
|             fi
 | |
|             PHPUNIT_FILTER="$2"
 | |
|             shift 2 # Consume both --filter and its value
 | |
|             ;;
 | |
|         *)
 | |
|             echo "Unknown option: $1"
 | |
|             exit 1
 | |
|             ;;
 | |
|     esac
 | |
| done
 | |
| 
 | |
| # If no test type specified, run all
 | |
| if ! $RUN_UNIT && ! $RUN_INTEGRATION && ! $RUN_E2E; then # Corrected: &&
 | |
|     RUN_UNIT=true
 | |
|     RUN_INTEGRATION=true
 | |
|     RUN_E2E=true
 | |
| fi
 | |
| 
 | |
| # Function to run tests
 | |
| run_tests() {
 | |
|     local test_type=$1
 | |
|     local test_command=$2
 | |
| 
 | |
|     echo -e "${YELLOW}Running $test_type tests...${NC}"
 | |
|     if $DEBUG; then
 | |
|         echo "Test command: $test_command"
 | |
|     fi
 | |
| 
 | |
|     if eval $test_command; then
 | |
|         echo -e "${GREEN}✓ $test_type tests passed${NC}"
 | |
|         return 0
 | |
|     else
 | |
|         echo -e "${RED}✗ $test_type tests failed. Exiting.${NC}"
 | |
|         exit 1 # Exit script immediately on failure
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Create results directory
 | |
| mkdir -p ../test-results
 | |
| 
 | |
| # Composer dependencies are managed on the host and mounted via volume.
 | |
| 
 | |
| # Run unit tests using relative path via docker-compose exec
 | |
| if $RUN_UNIT; then
 | |
|     # Base command
 | |
|     UNIT_CMD="vendor/bin/phpunit --verbose --testsuite unit --log-junit ../test-results/unit.xml"
 | |
|     # Add filter if provided, ensuring proper quoting for the value
 | |
|     if [ -n "$PHPUNIT_FILTER" ]; then
 | |
|         # Escape potential special characters within the filter value for sh -c
 | |
|         FILTER_ESCAPED=$(printf '%s\n' "$PHPUNIT_FILTER" | sed "s/'/'\\\\''/g")
 | |
|         UNIT_CMD="$UNIT_CMD --filter '$FILTER_ESCAPED'"
 | |
|     fi
 | |
|     # Add command to capture exit status
 | |
|     UNIT_CMD="$UNIT_CMD; exit \$?"
 | |
|     # Execute the command via sh -c, passing the constructed command in single quotes
 | |
| 	run_tests "Unit" "docker-compose exec -T wordpress sh -c '$UNIT_CMD'"
 | |
| fi
 | |
| 
 | |
| # Run integration tests using relative path via docker-compose exec
 | |
| if $RUN_INTEGRATION; then
 | |
|     # Base command
 | |
|     INTEGRATION_CMD="vendor/bin/phpunit --testsuite integration --log-junit ../test-results/integration.xml"
 | |
|     # Add filter if provided
 | |
|     if [ -n "$PHPUNIT_FILTER" ]; then
 | |
|         FILTER_ESCAPED=$(printf '%s\n' "$PHPUNIT_FILTER" | sed "s/'/'\\\\''/g")
 | |
|         INTEGRATION_CMD="$INTEGRATION_CMD --filter '$FILTER_ESCAPED'"
 | |
|     fi
 | |
|     # Add command to capture exit status
 | |
|     INTEGRATION_CMD="$INTEGRATION_CMD; exit \$?"
 | |
|     # Execute the command via sh -c
 | |
| 	run_tests "Integration" "docker-compose exec -T wordpress sh -c '$INTEGRATION_CMD'"
 | |
| fi
 | |
| 
 | |
| # Run E2E tests
 | |
| if $RUN_E2E; then
 | |
|     # Ensure plugin activation hooks run and permalinks are fresh for E2E context
 | |
|     echo -e "${YELLOW}Deactivating/Reactivating plugin to ensure hooks fire...${NC}"
 | |
|     sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && wp plugin deactivate hvac-community-events --allow-root" || echo -e "${YELLOW}Note: Plugin already inactive or not found (continuing).${NC}" # Allow failure if already inactive
 | |
|     sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && wp plugin activate hvac-community-events --allow-root"
 | |
|     if [ $? -ne 0 ]; then
 | |
|         echo -e "${RED}✗ Failed to activate hvac-community-events plugin. Exiting.${NC}"
 | |
|         exit 1
 | |
|     fi
 | |
|     echo -e "${GREEN}✓ Plugin reactivated.${NC}"
 | |
| 
 | |
|     # Flush rewrite rules after activation
 | |
|     echo -e "${YELLOW}Flushing rewrite rules...${NC}"
 | |
|     if ! sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && wp rewrite flush --hard --allow-root"; then
 | |
|         echo -e "${RED}✗ Failed to flush rewrite rules. Exiting.${NC}"
 | |
|         exit 1
 | |
|     fi
 | |
|     echo -e "${GREEN}✓ Rewrite rules flushed.${NC}"
 | |
| 
 | |
|     # Now run the tests
 | |
|     if [ -n "$TEST_SUITE" ]; then
 | |
|         # Run specific test suite
 | |
|         if [ "$TEST_SUITE" == "trainer-journey" ]; then
 | |
|             UPSKILL_STAGING_URL="$UPSKILL_STAGING_URL" npx playwright test --config=playwright.config.ts tests/e2e/trainer-journey.test.ts
 | |
|         else
 | |
|             UPSKILL_STAGING_URL="$UPSKILL_STAGING_URL" npx playwright test --config=playwright.config.ts --grep "@$TEST_SUITE"
 | |
|         fi
 | |
|     else
 | |
|         # Run all E2E tests
 | |
|         echo "Current working directory: $(pwd)"
 | |
|         # Run all E2E tests
 | |
|         TEST_FILE_PATH="/Users/ben/dev/upskill-event-manager/wordpress-dev/tests/e2e/homepage.test.ts"
 | |
|         echo "Current working directory: $(pwd)"
 | |
|         echo "Executing command: UPSKILL_STAGING_URL=\"$UPSKILL_STAGING_URL\" npx playwright test --config=tests/e2e/playwright.config.ts $TEST_FILE_PATH"
 | |
|         UPSKILL_STAGING_URL="$UPSKILL_STAGING_URL" npx playwright test --config=tests/e2e/playwright.config.ts "$TEST_FILE_PATH"
 | |
|     fi
 | |
| fi
 |