upskill-event-manager/wordpress-dev/bin/test-data-manager.sh
bengizmo 27bd8b512c feat: Add comprehensive testing resilience and monitoring scripts
- Added test-monitor.sh for monitoring test execution metrics and generating reports
- Created test-data-manager.sh for robust test data management
- Added health-check.sh for comprehensive system health verification
- Enhanced overall deployment safety and reliability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-21 20:58:41 -03:00

526 lines
No EOL
21 KiB
Bash
Executable file

#!/bin/bash
# test-data-manager.sh - Script to manage test data for the HVAC Community Events plugin
# Usage: ./bin/test-data-manager.sh [generate|verify|cleanup|backup|restore] [--suite=name]
set -e
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Default settings
ACTION=""
TEST_SUITE="default"
CURRENT_DATE=$(date +"%Y-%m-%d")
# Parse arguments
for arg in "$@"; do
case $arg in
generate|verify|cleanup|backup|restore)
ACTION="$arg"
shift
;;
--suite=*)
TEST_SUITE="${arg#*=}"
shift
;;
esac
done
# Check if action is provided
if [ -z "$ACTION" ]; then
echo -e "${RED}Error: No action specified. Use: generate, verify, cleanup, backup, or restore${NC}"
exit 1
fi
echo -e "${GREEN}=== Test Data Manager - ${ACTION} ===${NC}"
echo "Managing test data for suite: ${TEST_SUITE}"
# Check if we're in the right directory
if [ ! -d "tests/e2e" ]; then
echo -e "${RED}Error: Please run this script from the wordpress-dev directory${NC}"
exit 1
fi
# Create test data directory structure
mkdir -p tests/e2e/data
mkdir -p tests/e2e/data/backups
# Function to generate test data
generate_test_data() {
echo -e "\n${YELLOW}Generating test data for suite: ${TEST_SUITE}${NC}"
# Create test users first
generate_test_users
# Create test events based on the suite
case $TEST_SUITE in
"certificate")
generate_certificate_test_data
;;
"dashboard")
generate_dashboard_test_data
;;
"login")
# Login suite only needs users, which are already created
echo -e "${GREEN}Login test data created successfully${NC}"
;;
*)
# Default suite includes all test data
generate_certificate_test_data
generate_dashboard_test_data
echo -e "${GREEN}Default test data created successfully${NC}"
;;
esac
}
# Function to generate test users
generate_test_users() {
echo -e "${YELLOW}Generating test users...${NC}"
# Create test users TypeScript file
cat > "tests/e2e/data/test-users.ts" << 'EOF'
/**
* Test users for E2E testing
*/
export const TEST_USERS = {
trainer: {
username: 'test_trainer',
password: 'Test123!',
email: 'test_trainer@example.com',
role: 'trainer'
},
admin: {
username: 'admin_trainer',
password: 'Admin123!',
email: 'admin_trainer@example.com',
role: 'administrator'
},
pending: {
username: 'pending_trainer',
password: 'Pending123!',
email: 'pending_trainer@example.com',
role: 'pending'
}
};
EOF
echo -e "${GREEN}Test users created in tests/e2e/data/test-users.ts${NC}"
# Create shell script to create these users on the server
cat > "bin/create-test-users.sh" << 'EOF'
#!/bin/bash
# Create test users for E2E testing
# Create test_trainer user
ssh user@staging-server "cd /path/to/wordpress && wp user create test_trainer test_trainer@example.com --role=subscriber --user_pass=Test123! || wp user update test_trainer --role=subscriber --user_pass=Test123!"
# Add trainer role
ssh user@staging-server "cd /path/to/wordpress && wp user meta update test_trainer wp_capabilities '{\"subscriber\":true,\"trainer\":true}'"
# Create admin_trainer user
ssh user@staging-server "cd /path/to/wordpress && wp user create admin_trainer admin_trainer@example.com --role=administrator --user_pass=Admin123! || wp user update admin_trainer --role=administrator --user_pass=Admin123!"
# Create pending_trainer user
ssh user@staging-server "cd /path/to/wordpress && wp user create pending_trainer pending_trainer@example.com --role=subscriber --user_pass=Pending123! || wp user update pending_trainer --role=subscriber --user_pass=Pending123!"
# Add pending role
ssh user@staging-server "cd /path/to/wordpress && wp user meta update pending_trainer wp_capabilities '{\"subscriber\":true,\"pending_trainer\":true}'"
echo "Test users created/updated successfully"
EOF
chmod +x bin/create-test-users.sh
echo -e "${YELLOW}Created bin/create-test-users.sh - Update SSH credentials before using${NC}"
}
# Function to generate certificate test data
generate_certificate_test_data() {
echo -e "${YELLOW}Generating certificate test data...${NC}"
# Create test events TypeScript file with attendees for certificate testing
cat > "tests/e2e/data/test-events.ts" << 'EOF'
/**
* Test events for E2E testing
* Includes event data specifically designed for certificate testing
*/
export const TEST_EVENTS = {
basicEvent: {
title: 'Basic HVAC Training',
description: 'A basic training event for HVAC technicians.',
venue: 'Test Venue',
organizer: 'Test Organizer',
startDate: getTomorrowDate(),
endDate: getTomorrowDate(),
startTime: '09:00',
endTime: '17:00',
cost: '99.99',
capacity: '25'
},
certificateEvent: {
title: 'Certificate Training Course',
description: 'A training event that issues certificates upon completion.',
venue: 'Certificate Test Venue',
organizer: 'Certificate Test Organizer',
startDate: getYesterdayDate(), // Past event for certificate generation
endDate: getYesterdayDate(),
startTime: '08:00',
endTime: '16:00',
cost: '149.99',
capacity: '20',
issueCertificates: true
},
multiDayEvent: {
title: 'Advanced HVAC Workshop',
description: 'A multi-day workshop covering advanced HVAC topics.',
venue: 'Advanced Test Venue',
organizer: 'Advanced Test Organizer',
startDate: getTomorrowDate(),
endDate: getFutureDateDays(3), // 3 days in the future
startTime: '09:00',
endTime: '17:00',
cost: '299.99',
capacity: '15'
}
};
// Test attendees for certificate testing
export const TEST_ATTENDEES = {
complete: {
firstName: 'John',
lastName: 'Smith',
email: 'john.smith@example.com',
company: 'HVAC Testing Inc.',
checkedIn: true
},
notCheckedIn: {
firstName: 'Jane',
lastName: 'Doe',
email: 'jane.doe@example.com',
company: 'HVAC Services',
checkedIn: false
},
specialChars: {
firstName: 'Jörg',
lastName: "O'Neill-Müller",
email: 'jorg.oneill@example.com',
company: 'Special HVAC & Co.',
checkedIn: true
}
};
// Helper functions for dates
function getTomorrowDate() {
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
return formatDate(tomorrow);
}
function getYesterdayDate() {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
return formatDate(yesterday);
}
function getFutureDateDays(days) {
const future = new Date();
future.setDate(future.getDate() + days);
return formatDate(future);
}
function formatDate(date) {
return date.toISOString().split('T')[0]; // YYYY-MM-DD format
}
EOF
echo -e "${GREEN}Certificate test data created in tests/e2e/data/test-events.ts${NC}"
# Create shell script to create these events on the server
cat > "bin/create-test-data-with-checkins.sh" << 'EOF'
#!/bin/bash
# Create test events and attendees for certificate testing
# Create the certificate test event
ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_events --post_title='Certificate Training Course' --post_content='A training event that issues certificates upon completion.' --post_status=publish --meta_input='{\"_EventStartDate\":\"$(date -d \"yesterday\" +\"%Y-%m-%d 08:00:00\")\",\"_EventEndDate\":\"$(date -d \"yesterday\" +\"%Y-%m-%d 16:00:00\")\",\"_EventVenue\":\"Certificate Test Venue\",\"_EventCost\":\"149.99\",\"_tribe_events_issue_certificates\":\"1\"}' --porcelain"
# Get the event ID
EVENT_ID=$(ssh user@staging-server "cd /path/to/wordpress && wp post list --post_type=tribe_events --post_status=publish --posts_per_page=1 --post_title='Certificate Training Course' --field=ID")
# Create attendees
ATTENDEE1_ID=$(ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_attendee --post_title='John Smith' --post_status=publish --meta_input='{\"_tribe_tickets_first_name\":\"John\",\"_tribe_tickets_last_name\":\"Smith\",\"_tribe_tickets_email\":\"john.smith@example.com\",\"_tribe_tickets_checkin\":\"1\",\"_tribe_rsvp_event\":\"$EVENT_ID\",\"_tribe_tickets_attendee_company\":\"HVAC Testing Inc.\"}' --porcelain")
ATTENDEE2_ID=$(ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_attendee --post_title='Jane Doe' --post_status=publish --meta_input='{\"_tribe_tickets_first_name\":\"Jane\",\"_tribe_tickets_last_name\":\"Doe\",\"_tribe_tickets_email\":\"jane.doe@example.com\",\"_tribe_tickets_checkin\":\"0\",\"_tribe_rsvp_event\":\"$EVENT_ID\",\"_tribe_tickets_attendee_company\":\"HVAC Services\"}' --porcelain")
ATTENDEE3_ID=$(ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_attendee --post_title='Jörg O'Neill-Müller' --post_status=publish --meta_input='{\"_tribe_tickets_first_name\":\"Jörg\",\"_tribe_tickets_last_name\":\"O'Neill-Müller\",\"_tribe_tickets_email\":\"jorg.oneill@example.com\",\"_tribe_tickets_checkin\":\"1\",\"_tribe_rsvp_event\":\"$EVENT_ID\",\"_tribe_tickets_attendee_company\":\"Special HVAC & Co.\"}' --porcelain")
echo "Certificate test data created successfully"
echo "Event ID: $EVENT_ID"
echo "Attendees: $ATTENDEE1_ID, $ATTENDEE2_ID, $ATTENDEE3_ID"
EOF
chmod +x bin/create-test-data-with-checkins.sh
echo -e "${YELLOW}Created bin/create-test-data-with-checkins.sh - Update SSH credentials before using${NC}"
}
# Function to generate dashboard test data
generate_dashboard_test_data() {
echo -e "${YELLOW}Generating dashboard test data...${NC}"
# Create additional test events for dashboard testing
cat > "bin/create-test-events-admin.sh" << 'EOF'
#!/bin/bash
# Create test events for dashboard testing
# Create multiple events with different statuses
ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_events --post_title='Published HVAC Training' --post_content='A published training event for dashboard testing.' --post_status=publish --meta_input='{\"_EventStartDate\":\"$(date -d \"+5 days\" +\"%Y-%m-%d 09:00:00\")\",\"_EventEndDate\":\"$(date -d \"+5 days\" +\"%Y-%m-%d 17:00:00\")\",\"_EventVenue\":\"Dashboard Test Venue\",\"_EventCost\":\"99.99\"}' --porcelain"
ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_events --post_title='Draft HVAC Training' --post_content='A draft training event for dashboard testing.' --post_status=draft --meta_input='{\"_EventStartDate\":\"$(date -d \"+7 days\" +\"%Y-%m-%d 09:00:00\")\",\"_EventEndDate\":\"$(date -d \"+7 days\" +\"%Y-%m-%d 17:00:00\")\",\"_EventVenue\":\"Dashboard Test Venue\",\"_EventCost\":\"79.99\"}' --porcelain"
ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_events --post_title='Private HVAC Training' --post_content='A private training event for dashboard testing.' --post_status=private --meta_input='{\"_EventStartDate\":\"$(date -d \"+10 days\" +\"%Y-%m-%d 09:00:00\")\",\"_EventEndDate\":\"$(date -d \"+10 days\" +\"%Y-%m-%d 17:00:00\")\",\"_EventVenue\":\"Dashboard Test Venue\",\"_EventCost\":\"129.99\"}' --porcelain"
ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_events --post_title='Pending HVAC Training' --post_content='A pending training event for dashboard testing.' --post_status=pending --meta_input='{\"_EventStartDate\":\"$(date -d \"+15 days\" +\"%Y-%m-%d 09:00:00\")\",\"_EventEndDate\":\"$(date -d \"+15 days\" +\"%Y-%m-%d 17:00:00\")\",\"_EventVenue\":\"Dashboard Test Venue\",\"_EventCost\":\"149.99\"}' --porcelain"
# Create a past event
ssh user@staging-server "cd /path/to/wordpress && wp post create --post_type=tribe_events --post_title='Past HVAC Training' --post_content='A past training event for dashboard testing.' --post_status=publish --meta_input='{\"_EventStartDate\":\"$(date -d \"-3 days\" +\"%Y-%m-%d 09:00:00\")\",\"_EventEndDate\":\"$(date -d \"-3 days\" +\"%Y-%m-%d 17:00:00\")\",\"_EventVenue\":\"Dashboard Test Venue\",\"_EventCost\":\"99.99\"}' --porcelain"
echo "Dashboard test events created successfully"
EOF
chmod +x bin/create-test-events-admin.sh
echo -e "${YELLOW}Created bin/create-test-events-admin.sh - Update SSH credentials before using${NC}"
}
# Function to verify test data
verify_test_data() {
echo -e "\n${YELLOW}Verifying test data for suite: ${TEST_SUITE}${NC}"
# Verify test user files exist
if [ -f "tests/e2e/data/test-users.ts" ]; then
echo -e "${GREEN}✓ Test users file exists${NC}"
else
echo -e "${RED}✗ Test users file missing${NC}"
fi
# Verify test events files exist
if [ -f "tests/e2e/data/test-events.ts" ]; then
echo -e "${GREEN}✓ Test events file exists${NC}"
else
echo -e "${RED}✗ Test events file missing${NC}"
fi
# Verify test data on server (if scripts exist)
if [ -f "bin/verify-test-data.sh" ]; then
echo -e "${YELLOW}Running server-side test data verification...${NC}"
bash bin/verify-test-data.sh
else
echo -e "${YELLOW}Creating server-side verification script...${NC}"
# Create verification script
cat > "bin/verify-test-data.sh" << 'EOF'
#!/bin/bash
# Verify test data exists on the server
# Check test users
echo "Verifying test users..."
TEST_TRAINER=$(ssh user@staging-server "cd /path/to/wordpress && wp user get test_trainer --field=ID 2>/dev/null || echo 'missing'")
ADMIN_TRAINER=$(ssh user@staging-server "cd /path/to/wordpress && wp user get admin_trainer --field=ID 2>/dev/null || echo 'missing'")
PENDING_TRAINER=$(ssh user@staging-server "cd /path/to/wordpress && wp user get pending_trainer --field=ID 2>/dev/null || echo 'missing'")
if [ "$TEST_TRAINER" != "missing" ] && [ "$ADMIN_TRAINER" != "missing" ]; then
echo "✓ Test users verified"
else
echo "✗ Test users missing"
echo " - test_trainer: ${TEST_TRAINER}"
echo " - admin_trainer: ${ADMIN_TRAINER}"
echo " - pending_trainer: ${PENDING_TRAINER}"
fi
# Check test events
echo "Verifying test events..."
CERTIFICATE_EVENT=$(ssh user@staging-server "cd /path/to/wordpress && wp post list --post_type=tribe_events --post_status=publish --posts_per_page=1 --post_title='Certificate Training Course' --field=ID 2>/dev/null || echo 'missing'")
DASHBOARD_EVENTS=$(ssh user@staging-server "cd /path/to/wordpress && wp post list --post_type=tribe_events --field=ID | wc -l 2>/dev/null || echo '0'")
if [ "$CERTIFICATE_EVENT" != "missing" ] && [ "$DASHBOARD_EVENTS" -gt 0 ]; then
echo "✓ Test events verified"
echo " - Certificate event: ${CERTIFICATE_EVENT}"
echo " - Total events: ${DASHBOARD_EVENTS}"
else
echo "✗ Test events missing"
echo " - Certificate event: ${CERTIFICATE_EVENT}"
echo " - Total events: ${DASHBOARD_EVENTS}"
fi
# Check attendees
echo "Verifying test attendees..."
if [ "$CERTIFICATE_EVENT" != "missing" ]; then
ATTENDEES=$(ssh user@staging-server "cd /path/to/wordpress && wp post list --post_type=tribe_attendee --meta_key=_tribe_rsvp_event --meta_value=${CERTIFICATE_EVENT} --field=ID 2>/dev/null | wc -l || echo '0'")
if [ "$ATTENDEES" -gt 0 ]; then
echo "✓ Test attendees verified: ${ATTENDEES} attendees found"
else
echo "✗ Test attendees missing for certificate event"
fi
fi
echo "Test data verification complete"
EOF
chmod +x bin/verify-test-data.sh
echo -e "${YELLOW}Created bin/verify-test-data.sh - Update SSH credentials before using${NC}"
fi
}
# Function to cleanup test data
cleanup_test_data() {
echo -e "\n${YELLOW}Cleaning up test data for suite: ${TEST_SUITE}${NC}"
# Check if cleanup script exists
if [ -f "bin/cleanup-test-data.sh" ]; then
echo -e "${YELLOW}Running test data cleanup...${NC}"
bash bin/cleanup-test-data.sh
else
echo -e "${YELLOW}Creating cleanup script...${NC}"
# Create cleanup script
cat > "bin/cleanup-test-data.sh" << 'EOF'
#!/bin/bash
# Clean up test data from the server
echo "Cleaning up test data..."
# Clean up test events
echo "Removing test events..."
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_events --post_title='Certificate Training Course' --field=ID) --force 2>/dev/null || echo 'No certificate event to remove'"
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_events --post_title='Published HVAC Training' --field=ID) --force 2>/dev/null || echo 'No published event to remove'"
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_events --post_title='Draft HVAC Training' --field=ID) --force 2>/dev/null || echo 'No draft event to remove'"
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_events --post_title='Private HVAC Training' --field=ID) --force 2>/dev/null || echo 'No private event to remove'"
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_events --post_title='Pending HVAC Training' --field=ID) --force 2>/dev/null || echo 'No pending event to remove'"
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_events --post_title='Past HVAC Training' --field=ID) --force 2>/dev/null || echo 'No past event to remove'"
# Clean up attendees - remove all test attendees
echo "Removing test attendees..."
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_attendee --meta_key=_tribe_tickets_email --meta_value='john.smith@example.com' --field=ID) --force 2>/dev/null || echo 'No John Smith attendee to remove'"
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_attendee --meta_key=_tribe_tickets_email --meta_value='jane.doe@example.com' --field=ID) --force 2>/dev/null || echo 'No Jane Doe attendee to remove'"
ssh user@staging-server "cd /path/to/wordpress && wp post delete \$(wp post list --post_type=tribe_attendee --meta_key=_tribe_tickets_email --meta_value='jorg.oneill@example.com' --field=ID) --force 2>/dev/null || echo 'No Jorg attendee to remove'"
# Keep test users (just reset their data)
echo "Resetting test users..."
ssh user@staging-server "cd /path/to/wordpress && wp user meta delete test_trainer hvac_test_data 2>/dev/null || echo 'No test data to remove for test_trainer'"
ssh user@staging-server "cd /path/to/wordpress && wp user meta delete admin_trainer hvac_test_data 2>/dev/null || echo 'No test data to remove for admin_trainer'"
ssh user@staging-server "cd /path/to/wordpress && wp user meta delete pending_trainer hvac_test_data 2>/dev/null || echo 'No test data to remove for pending_trainer'"
echo "Test data cleanup complete"
EOF
chmod +x bin/cleanup-test-data.sh
echo -e "${YELLOW}Created bin/cleanup-test-data.sh - Update SSH credentials before using${NC}"
fi
}
# Function to backup test data
backup_test_data() {
echo -e "\n${YELLOW}Backing up test data for suite: ${TEST_SUITE}${NC}"
# Create backup directory
BACKUP_DIR="tests/e2e/data/backups/${CURRENT_DATE}_${TEST_SUITE}"
mkdir -p "$BACKUP_DIR"
# Backup test user data
if [ -f "tests/e2e/data/test-users.ts" ]; then
cp "tests/e2e/data/test-users.ts" "$BACKUP_DIR/"
echo -e "${GREEN}✓ Test users backed up${NC}"
fi
# Backup test event data
if [ -f "tests/e2e/data/test-events.ts" ]; then
cp "tests/e2e/data/test-events.ts" "$BACKUP_DIR/"
echo -e "${GREEN}✓ Test events backed up${NC}"
fi
# Backup any other test data files
if [ -f "tests/e2e/data/test-config.ts" ]; then
cp "tests/e2e/data/test-config.ts" "$BACKUP_DIR/"
echo -e "${GREEN}✓ Test config backed up${NC}"
fi
# Compress backup
tar -czf "$BACKUP_DIR.tar.gz" "$BACKUP_DIR"
echo -e "${GREEN}Backup created: ${BACKUP_DIR}.tar.gz${NC}"
# Remove uncompressed backup
rm -rf "$BACKUP_DIR"
}
# Function to restore test data
restore_test_data() {
echo -e "\n${YELLOW}Restoring test data for suite: ${TEST_SUITE}${NC}"
# Find most recent backup for the suite
LATEST_BACKUP=$(ls -t tests/e2e/data/backups/*_${TEST_SUITE}.tar.gz 2>/dev/null | head -1)
if [ -z "$LATEST_BACKUP" ]; then
echo -e "${RED}No backup found for suite: ${TEST_SUITE}${NC}"
return 1
fi
echo -e "${YELLOW}Restoring from backup: ${LATEST_BACKUP}${NC}"
# Create temp directory
TEMP_DIR="tests/e2e/data/temp_restore"
mkdir -p "$TEMP_DIR"
# Extract backup
tar -xzf "$LATEST_BACKUP" -C "$TEMP_DIR"
# Find extracted directory
EXTRACTED_DIR=$(find "$TEMP_DIR" -type d -depth 1)
# Restore files
if [ -f "$EXTRACTED_DIR/test-users.ts" ]; then
cp "$EXTRACTED_DIR/test-users.ts" "tests/e2e/data/"
echo -e "${GREEN}✓ Test users restored${NC}"
fi
if [ -f "$EXTRACTED_DIR/test-events.ts" ]; then
cp "$EXTRACTED_DIR/test-events.ts" "tests/e2e/data/"
echo -e "${GREEN}✓ Test events restored${NC}"
fi
if [ -f "$EXTRACTED_DIR/test-config.ts" ]; then
cp "$EXTRACTED_DIR/test-config.ts" "tests/e2e/data/"
echo -e "${GREEN}✓ Test config restored${NC}"
fi
# Clean up
rm -rf "$TEMP_DIR"
echo -e "${GREEN}Restore completed from: ${LATEST_BACKUP}${NC}"
}
# Execute action
case $ACTION in
"generate")
generate_test_data
;;
"verify")
verify_test_data
;;
"cleanup")
cleanup_test_data
;;
"backup")
backup_test_data
;;
"restore")
restore_test_data
;;
*)
echo -e "${RED}Invalid action: ${ACTION}${NC}"
exit 1
;;
esac
echo -e "\n${GREEN}=== Test Data Manager Complete ===${NC}"
echo "Action '${ACTION}' completed for suite: ${TEST_SUITE}"
exit 0