UNPKG

tdpw

Version:

CLI tool for uploading Playwright test reports to TestDino platform with Azure storage support

163 lines โ€ข 7.89 kB
"use strict"; /** * 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