tdpw
Version:
CLI tool for uploading Playwright test reports to TestDino platform with Azure storage support
163 lines โข 7.89 kB
JavaScript
;
/**
* Enhanced Upload command implementation with progress tracking
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.UploadCommand = void 0;
const types_1 = require("../../types");
const config_1 = require("../../config");
const discovery_1 = require("../../core/discovery");
const upload_1 = require("../../services/upload");
const progress_1 = require("../../utils/progress");
/**
* Main upload command that orchestrates the entire upload process
*/
class UploadCommand {
name = 'upload';
description = 'Upload Playwright test reports to TestDino';
/**
* Execute the upload command with enhanced progress tracking
*/
async execute(options) {
const tracker = (0, progress_1.createProgressTracker)();
try {
// Create configuration from CLI options
tracker.start('Validating configuration...');
const config = config_1.configLoader.createConfig(options);
tracker.succeed('Configuration validated');
// Discover report files
tracker.start('Discovering report files...');
const discoveryService = new discovery_1.ReportDiscoveryService(options.reportDirectory);
const discoveryResult = await discoveryService.discover(options);
const discoveredFiles = [];
discoveredFiles.push(`JSON: ${discoveryResult.jsonReport}`);
if (discoveryResult.htmlReport)
discoveredFiles.push(`HTML: ${discoveryResult.htmlReport}`);
if (discoveryResult.traceDir)
discoveredFiles.push(`Traces: ${discoveryResult.traceDir}`);
const reportTypeText = discoveredFiles.length === 1 ? 'report type' : 'report types';
tracker.succeed(`Found ${discoveredFiles.length} ${reportTypeText}`);
// Show verbose configuration if requested
if (config.verbose) {
this.logVerboseInfo(config, options, discoveryResult);
}
// Handle dry run mode
if (config.dryRun) {
return this.handleDryRun(config, discoveryResult, tracker);
}
// Perform actual upload with progress tracking
const uploadService = new upload_1.UploadService(config);
// Use fallback method for graceful degradation
const uploadResponse = await uploadService.uploadWithFallback(discoveryResult.jsonReport, discoveryResult.htmlReport, discoveryResult.traceDir);
// Success output with actionable information
console.log();
console.log('Upload completed successfully!');
console.log();
console.log(` Test Run ID: ${uploadResponse.testRunId}`);
console.log(` View Results: https://app.testdino.com`);
}
catch (error) {
this.handleUploadError(error, tracker);
}
}
/**
* Log verbose configuration information
*/
logVerboseInfo(config, options, discoveryResult) {
console.log('\n๐ Upload Configuration:');
console.log(` Report Directory: ${options.reportDirectory}`);
console.log(` API Endpoint: ${config.apiUrl}`);
console.log(` Upload Images: ${config.uploadImages ? 'Yes' : 'No'}`);
console.log(` Upload Videos: ${config.uploadVideos ? 'Yes' : 'No'}`);
console.log(` Upload HTML: ${config.uploadHtml ? 'Yes' : 'No'}`);
console.log(` Upload Traces: ${config.uploadTraces ? 'Yes' : 'No'}`);
console.log(` Verbose Mode: ${config.verbose ? 'Yes' : 'No'}`);
console.log('\n๐ Discovered Files:');
console.log(` JSON Report: ${discoveryResult.jsonReport}`);
if (discoveryResult.htmlReport) {
console.log(` HTML Report: ${discoveryResult.htmlReport}`);
}
if (discoveryResult.traceDir) {
console.log(` Trace Directory: ${discoveryResult.traceDir}`);
}
const envInfo = config_1.EnvironmentDetector.getEnvironmentInfo();
console.log('\n๐ Environment Info:');
console.log(` Type: ${envInfo.type}`);
console.log(` CI/CD: ${envInfo.isCI ? `Yes (${envInfo.ciProvider})` : 'No'}`);
console.log(` Node.js: ${process.version}`);
}
/**
* Handle dry run mode with comprehensive validation
*/
handleDryRun(config, discoveryResult, tracker) {
tracker.start('๐งช Performing dry run validation...');
// Validate all components without uploading
const validations = [
'โ
Configuration is valid',
'โ
API token format is correct',
'โ
Report files are accessible',
'โ
Environment is properly configured',
];
if (config.uploadImages) {
validations.push('โ
Ready to scan and upload image attachments');
}
if (config.uploadVideos) {
validations.push('โ
Ready to scan and upload video attachments');
}
if (config.uploadHtml && discoveryResult.htmlReport) {
validations.push('โ
HTML report directory is ready');
validations.push('โ
HTML upload will include images and videos');
}
if (config.uploadTraces && discoveryResult.traceDir) {
validations.push('โ
Trace directory is ready');
}
tracker.succeed('Dry run validation complete');
console.log('\n๐งช Dry Run Results:');
validations.forEach(validation => console.log(` ${validation}`));
console.log('\nโ
Ready for upload! Remove --dry-run to proceed.');
}
/**
* Enhanced error handling with actionable feedback
*/
handleUploadError(error, tracker) {
tracker.fail('Upload failed');
if (error instanceof types_1.AuthenticationError) {
console.error('\nAuthentication Failed');
console.error('Solutions:');
console.error(' Verify your API token is correct');
console.error(' Check that your token has upload permissions');
console.error(' Ensure you\'re using the right environment token');
console.error('\nGet help: https://docs.testdino.com/authentication');
process.exit(types_1.ExitCode.AUTHENTICATION_ERROR);
}
if (error instanceof types_1.NetworkError) {
console.error('\nNetwork Error');
console.error(` ${error.message}`);
console.error('\nTroubleshooting:');
console.error(' Check your internet connection');
console.error(' Verify the API endpoint is accessible');
console.error(' Check NODE_ENV environment variable');
console.error(' Test with --dry-run flag first');
process.exit(types_1.ExitCode.NETWORK_ERROR);
}
// Generic error handling
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
console.error(`\nUpload Error: ${errorMessage}`);
// Show stack trace in verbose mode or development
const runtimeConfig = config_1.configLoader.getRuntimeConfig();
if (runtimeConfig.logLevel === 'debug' || process.env.NODE_ENV === 'development') {
console.error('\nDebug Information:');
console.error(error);
}
else {
console.error('\nRun with --verbose for detailed error information');
}
console.error('\nNeed help?');
console.error(' Documentation: https://docs.testdino.com');
console.error(' Support: support@testdino.com');
console.error(' Issues: https://github.com/alphabin-01/testdino-cli/issues');
process.exit(types_1.ExitCode.GENERAL_ERROR);
}
}
exports.UploadCommand = UploadCommand;
//# sourceMappingURL=upload.js.map