Some checks are pending
HVAC Plugin CI/CD Pipeline / Security Analysis (push) Waiting to run
HVAC Plugin CI/CD Pipeline / Code Quality & Standards (push) Waiting to run
HVAC Plugin CI/CD Pipeline / Unit Tests (push) Waiting to run
HVAC Plugin CI/CD Pipeline / Integration Tests (push) Waiting to run
HVAC Plugin CI/CD Pipeline / Deploy to Staging (push) Blocked by required conditions
HVAC Plugin CI/CD Pipeline / Deploy to Production (push) Blocked by required conditions
HVAC Plugin CI/CD Pipeline / Notification (push) Blocked by required conditions
Security Monitoring & Compliance / Dependency Vulnerability Scan (push) Waiting to run
Security Monitoring & Compliance / Secrets & Credential Scan (push) Waiting to run
Security Monitoring & Compliance / WordPress Security Analysis (push) Waiting to run
Security Monitoring & Compliance / Static Code Security Analysis (push) Waiting to run
Security Monitoring & Compliance / Security Compliance Validation (push) Waiting to run
Security Monitoring & Compliance / Security Summary Report (push) Blocked by required conditions
Security Monitoring & Compliance / Security Team Notification (push) Blocked by required conditions
- Add 90+ test files including E2E, unit, and integration tests - Implement Page Object Model (POM) architecture - Add Docker testing environment with comprehensive services - Include modernized test framework with error recovery - Add specialized test suites for master trainer and trainer workflows - Update .gitignore to properly track test infrastructure 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
281 lines
No EOL
9.1 KiB
JavaScript
281 lines
No EOL
9.1 KiB
JavaScript
/**
|
|
* Environment Configuration Manager
|
|
* Centralized configuration management for different environments
|
|
*/
|
|
|
|
const path = require('path');
|
|
|
|
class EnvironmentConfig {
|
|
constructor(environment = 'staging') {
|
|
this.environment = environment;
|
|
this.config = null;
|
|
this.loadConfiguration();
|
|
}
|
|
|
|
/**
|
|
* Load configuration for specified environment
|
|
* @returns {void}
|
|
*/
|
|
loadConfiguration() {
|
|
try {
|
|
const configFile = path.join(__dirname, `${this.environment}.config.js`);
|
|
this.config = require(configFile);
|
|
} catch (error) {
|
|
console.warn(`Failed to load config for ${this.environment}, using default staging`);
|
|
this.config = require('./staging.config.js');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get full configuration object
|
|
* @returns {Object}
|
|
*/
|
|
getConfig() {
|
|
return this.config;
|
|
}
|
|
|
|
/**
|
|
* Get browser configuration
|
|
* @returns {Object}
|
|
*/
|
|
getBrowserConfig() {
|
|
return {
|
|
browserType: 'chromium',
|
|
headless: this.config.browser?.headless ?? true,
|
|
slowMo: this.config.browser?.slowMo ?? 0,
|
|
timeout: this.config.framework?.timeout ?? 30000,
|
|
viewport: this.config.browser?.viewport ?? { width: 1280, height: 720 },
|
|
video: this.config.framework?.videosOnFailure ?? false,
|
|
screenshot: this.config.framework?.screenshotsOnFailure ? 'only-on-failure' : 'off',
|
|
args: this.config.browser?.args ?? []
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get authentication configuration
|
|
* @returns {Object}
|
|
*/
|
|
getAuthConfig() {
|
|
return {
|
|
baseUrl: this.config.app?.baseUrl || this.config.baseUrl,
|
|
loginPath: this.config.urls?.login || this.config.wordpress?.customLoginPath || '/community-login/',
|
|
logoutPath: this.config.urls?.wpLogin || '/wp-login.php?action=logout'
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get test user accounts
|
|
* @returns {Object}
|
|
*/
|
|
getUserAccounts() {
|
|
if (this.config.environments?.users) {
|
|
// New format
|
|
return {
|
|
masterTrainer: this.config.environments.users.masterTrainer,
|
|
alternateMasterTrainer: this.config.environments.users.masterTrainerAlt,
|
|
trainer: this.config.environments.users.trainer,
|
|
admin: this.config.environments.users.admin
|
|
};
|
|
} else if (this.config.accounts) {
|
|
// Legacy format
|
|
return this.config.accounts;
|
|
} else {
|
|
// Fallback defaults
|
|
return {
|
|
masterTrainer: {
|
|
username: 'test_master',
|
|
password: 'TestMaster123!',
|
|
email: 'test_master@example.com',
|
|
role: 'master_trainer'
|
|
},
|
|
trainer: {
|
|
username: 'test_trainer',
|
|
password: 'TestTrainer123!',
|
|
email: 'test_trainer@example.com',
|
|
role: 'hvac_trainer'
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get test execution configuration
|
|
* @returns {Object}
|
|
*/
|
|
getTestConfig() {
|
|
return {
|
|
timeout: this.config.framework?.timeout ?? this.config.test?.timeout ?? 30000,
|
|
retries: this.config.framework?.retries ?? this.config.test?.retries ?? 2,
|
|
parallel: this.config.framework?.parallel ?? this.config.test?.parallel ?? false,
|
|
workers: this.config.framework?.maxWorkers ?? this.config.test?.workers ?? 1,
|
|
screenshotOnFailure: this.config.framework?.screenshotsOnFailure ?? this.config.test?.screenshotOnFailure ?? true,
|
|
videoOnFailure: this.config.framework?.videosOnFailure ?? this.config.test?.videoOnFailure ?? false
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get protected URLs for security testing
|
|
* @returns {string[]}
|
|
*/
|
|
getProtectedUrls() {
|
|
if (this.config.protectedUrls) {
|
|
return this.config.protectedUrls;
|
|
}
|
|
|
|
// Default protected URLs
|
|
return [
|
|
'/trainer/dashboard/',
|
|
'/trainer/venue/list/',
|
|
'/trainer/venue/manage/',
|
|
'/trainer/organizer/manage/',
|
|
'/trainer/profile/training-leads/',
|
|
'/master-trainer/master-dashboard/',
|
|
'/master-trainer/events/',
|
|
'/master-trainer/google-sheets/',
|
|
'/master-trainer/announcements/',
|
|
'/master-trainer/pending-approvals/',
|
|
'/master-trainer/trainers/',
|
|
'/master-trainer/communication-templates/'
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get test data configuration
|
|
* @returns {Object}
|
|
*/
|
|
getTestDataConfig() {
|
|
return {
|
|
seedData: this.config.testData?.seedData ?? true,
|
|
cleanupAfterTests: this.config.testData?.cleanupAfterTests ?? true,
|
|
isolateTransactions: this.config.testData?.isolateTransactions ?? true,
|
|
fixtures: this.config.testData?.fixtures ?? {}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get evidence collection configuration
|
|
* @returns {Object}
|
|
*/
|
|
getEvidenceConfig() {
|
|
return {
|
|
screenshots: {
|
|
enabled: this.config.evidence?.screenshots?.enabled ?? true,
|
|
onFailure: this.config.evidence?.screenshots?.onFailure ?? true,
|
|
onSuccess: this.config.evidence?.screenshots?.onSuccess ?? false,
|
|
fullPage: this.config.evidence?.screenshots?.fullPage ?? true,
|
|
dir: this.config.media?.screenshotDir ?? './tests/evidence/screenshots'
|
|
},
|
|
videos: {
|
|
enabled: this.config.evidence?.videos?.enabled ?? false,
|
|
onFailure: this.config.evidence?.videos?.onFailure ?? true,
|
|
onSuccess: this.config.evidence?.videos?.onSuccess ?? false,
|
|
dir: this.config.media?.videoDir ?? './tests/evidence/videos'
|
|
},
|
|
logs: {
|
|
enabled: this.config.evidence?.logs?.enabled ?? true,
|
|
level: this.config.evidence?.logs?.level ?? 'info',
|
|
includeNetwork: this.config.evidence?.logs?.includeNetwork ?? true,
|
|
includeConsole: this.config.evidence?.logs?.includeConsole ?? true
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get WordPress-specific configuration
|
|
* @returns {Object}
|
|
*/
|
|
getWordPressConfig() {
|
|
return {
|
|
cliPath: this.config.wordpress?.cliPath ?? 'wp',
|
|
adminPath: this.config.wordpress?.adminPath ?? '/wp-admin/',
|
|
apiPath: this.config.wordpress?.apiPath ?? '/wp-json/',
|
|
databaseIsolation: this.config.wordpress?.databaseIsolation ?? true,
|
|
flushRewriteRules: this.config.wordpress?.flushRewriteRules ?? true,
|
|
clearCache: this.config.wordpress?.clearCache ?? true
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get security configuration
|
|
* @returns {Object}
|
|
*/
|
|
getSecurityConfig() {
|
|
return {
|
|
allowInsecureCertificates: this.config.security?.allowInsecureCertificates ?? true,
|
|
ignoreHttpsErrors: this.config.network?.ignoreHTTPSErrors ?? true,
|
|
skipCsrfValidation: this.config.security?.skipCsrfValidation ?? false,
|
|
bypassCSP: this.config.network?.bypassCSP ?? false
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get base URL for the environment
|
|
* @returns {string}
|
|
*/
|
|
getBaseUrl() {
|
|
return this.config.app?.baseUrl || this.config.baseUrl || 'https://upskill-staging.measurequick.com';
|
|
}
|
|
|
|
/**
|
|
* Get environment name
|
|
* @returns {string}
|
|
*/
|
|
getEnvironmentName() {
|
|
return this.config.name || this.config.app?.environment || this.environment;
|
|
}
|
|
|
|
/**
|
|
* Check if feature is enabled
|
|
* @param {string} featureName - Name of feature to check
|
|
* @returns {boolean}
|
|
*/
|
|
isFeatureEnabled(featureName) {
|
|
return this.config.features?.[featureName] ?? true;
|
|
}
|
|
|
|
/**
|
|
* Get environment-specific selectors
|
|
* @returns {Object}
|
|
*/
|
|
getSelectors() {
|
|
return this.config.selectors ?? {
|
|
dataTestIdAttribute: 'data-testid',
|
|
roleAttribute: 'data-role',
|
|
pageAttribute: 'data-page'
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get expected content for validation
|
|
* @returns {Object}
|
|
*/
|
|
getExpectedContent() {
|
|
return this.config.expectedContent ?? {};
|
|
}
|
|
|
|
/**
|
|
* Get performance configuration
|
|
* @returns {Object}
|
|
*/
|
|
getPerformanceConfig() {
|
|
return {
|
|
slowNetworkSimulation: this.config.performance?.slowNetworkSimulation ?? false,
|
|
resourceBlocking: this.config.performance?.resourceBlocking ?? {
|
|
images: false,
|
|
fonts: false,
|
|
stylesheets: false
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create environment configuration instance
|
|
* @param {string} environment - Environment name
|
|
* @returns {EnvironmentConfig}
|
|
*/
|
|
function createEnvironmentConfig(environment = process.env.TEST_ENVIRONMENT || 'staging') {
|
|
return new EnvironmentConfig(environment);
|
|
}
|
|
|
|
module.exports = { EnvironmentConfig, createEnvironmentConfig }; |