@silasfmartins/testhub 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +520 -0
- package/biome.json +37 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +169 -0
- package/dist/scripts/consumer-postinstall.d.ts +15 -0
- package/dist/scripts/consumer-postinstall.js +785 -0
- package/dist/scripts/generate-docs.d.ts +16 -0
- package/dist/scripts/generate-docs.js +1363 -0
- package/dist/scripts/generate-index.d.ts +2 -0
- package/dist/scripts/generate-index.js +314 -0
- package/dist/scripts/init-api.d.ts +2 -0
- package/dist/scripts/init-api.js +525 -0
- package/dist/scripts/init-banco.d.ts +2 -0
- package/dist/scripts/init-banco.js +347 -0
- package/dist/scripts/init-frontend.d.ts +2 -0
- package/dist/scripts/init-frontend.js +627 -0
- package/dist/scripts/init-mobile.d.ts +2 -0
- package/dist/scripts/init-mobile.js +481 -0
- package/dist/scripts/init-scenarios.d.ts +2 -0
- package/dist/scripts/init-scenarios.js +846 -0
- package/dist/scripts/init-ssh.d.ts +2 -0
- package/dist/scripts/init-ssh.js +639 -0
- package/dist/scripts/package-versions.d.ts +57 -0
- package/dist/scripts/package-versions.js +768 -0
- package/dist/scripts/postinstall.d.ts +1 -0
- package/dist/scripts/postinstall.js +527 -0
- package/dist/scripts/robust-build.d.ts +7 -0
- package/dist/scripts/robust-build.js +88 -0
- package/dist/scripts/setup-local-packages.d.ts +31 -0
- package/dist/scripts/setup-local-packages.js +237 -0
- package/dist/scripts/smart-override.d.ts +2 -0
- package/dist/scripts/smart-override.js +1360 -0
- package/dist/scripts/sync-configs.d.ts +27 -0
- package/dist/scripts/sync-configs.js +248 -0
- package/dist/scripts/test-biome-parse.d.ts +5 -0
- package/dist/scripts/test-biome-parse.js +84 -0
- package/dist/scripts/ultracite-setup.d.ts +4 -0
- package/dist/scripts/ultracite-setup.js +310 -0
- package/dist/scripts/update-all-init-scripts.d.ts +2 -0
- package/dist/scripts/update-all-init-scripts.js +52 -0
- package/dist/scripts/update-biome-schema.d.ts +15 -0
- package/dist/scripts/update-biome-schema.js +124 -0
- package/dist/src/AutoCoreFacade.d.ts +145 -0
- package/dist/src/AutoCoreFacade.js +217 -0
- package/dist/src/api/ApiActions.d.ts +297 -0
- package/dist/src/api/ApiActions.js +1905 -0
- package/dist/src/api/Certificate.d.ts +60 -0
- package/dist/src/api/Certificate.js +79 -0
- package/dist/src/api/JsonResponse.d.ts +116 -0
- package/dist/src/api/JsonResponse.js +206 -0
- package/dist/src/appium/DeviceFarmViewer.d.ts +79 -0
- package/dist/src/appium/DeviceFarmViewer.js +1083 -0
- package/dist/src/appium/MobileActions.d.ts +347 -0
- package/dist/src/appium/MobileActions.js +1632 -0
- package/dist/src/appium/MobileConnection.d.ts +160 -0
- package/dist/src/appium/MobileConnection.js +772 -0
- package/dist/src/config/envLoader.d.ts +123 -0
- package/dist/src/config/envLoader.js +361 -0
- package/dist/src/config/jest-safe-setup.d.ts +19 -0
- package/dist/src/config/jest-safe-setup.js +369 -0
- package/dist/src/config/timeouts.d.ts +32 -0
- package/dist/src/config/timeouts.js +38 -0
- package/dist/src/desktop/DesktopActions.d.ts +46 -0
- package/dist/src/desktop/DesktopActions.js +398 -0
- package/dist/src/desktop/DesktopConnection.d.ts +32 -0
- package/dist/src/desktop/DesktopConnection.js +84 -0
- package/dist/src/domain/entities/TestExecution.d.ts +117 -0
- package/dist/src/domain/entities/TestExecution.js +150 -0
- package/dist/src/domain/entities/TestReport.d.ts +114 -0
- package/dist/src/domain/entities/TestReport.js +179 -0
- package/dist/src/domain/repositories/ITestRepository.d.ts +196 -0
- package/dist/src/domain/repositories/ITestRepository.js +14 -0
- package/dist/src/domain/schemas/ValidationSchemas.d.ts +159 -0
- package/dist/src/domain/schemas/ValidationSchemas.js +181 -0
- package/dist/src/functions/errors/BaseError.d.ts +78 -0
- package/dist/src/functions/errors/BaseError.js +245 -0
- package/dist/src/functions/errors/ConfigurationError.d.ts +16 -0
- package/dist/src/functions/errors/ConfigurationError.js +48 -0
- package/dist/src/functions/errors/ErrorCatalog.d.ts +148 -0
- package/dist/src/functions/errors/ErrorCatalog.js +157 -0
- package/dist/src/functions/errors/GlobalErrorHandler.d.ts +101 -0
- package/dist/src/functions/errors/GlobalErrorHandler.js +281 -0
- package/dist/src/functions/errors/IntegrationError.d.ts +17 -0
- package/dist/src/functions/errors/IntegrationError.js +51 -0
- package/dist/src/functions/errors/SecurityError.d.ts +14 -0
- package/dist/src/functions/errors/SecurityError.js +42 -0
- package/dist/src/functions/errors/SystemError.d.ts +12 -0
- package/dist/src/functions/errors/SystemError.js +36 -0
- package/dist/src/functions/errors/ValidationError.d.ts +14 -0
- package/dist/src/functions/errors/ValidationError.js +61 -0
- package/dist/src/functions/errors/index.d.ts +12 -0
- package/dist/src/functions/errors/index.js +13 -0
- package/dist/src/global-setup.d.ts +1 -0
- package/dist/src/global-setup.js +1037 -0
- package/dist/src/helpers/BancoActions.d.ts +188 -0
- package/dist/src/helpers/BancoActions.js +581 -0
- package/dist/src/helpers/EnviromentHelper.d.ts +17 -0
- package/dist/src/helpers/EnviromentHelper.js +66 -0
- package/dist/src/helpers/ParallelExecutionHelper.d.ts +183 -0
- package/dist/src/helpers/ParallelExecutionHelper.js +375 -0
- package/dist/src/helpers/SyncSignal.d.ts +15 -0
- package/dist/src/helpers/SyncSignal.js +44 -0
- package/dist/src/hubdocs/CategoryDetector.d.ts +83 -0
- package/dist/src/hubdocs/CategoryDetector.js +401 -0
- package/dist/src/hubdocs/DirectStatementInterceptor.d.ts +54 -0
- package/dist/src/hubdocs/DirectStatementInterceptor.js +243 -0
- package/dist/src/hubdocs/ExecutionTracker.d.ts +107 -0
- package/dist/src/hubdocs/ExecutionTracker.js +702 -0
- package/dist/src/hubdocs/HubDocs.d.ts +395 -0
- package/dist/src/hubdocs/HubDocs.js +3586 -0
- package/dist/src/hubdocs/StatementMethodFilter.d.ts +71 -0
- package/dist/src/hubdocs/StatementMethodFilter.js +618 -0
- package/dist/src/hubdocs/StatementTracker.d.ts +417 -0
- package/dist/src/hubdocs/StatementTracker.js +2419 -0
- package/dist/src/hubdocs/SwaggerGenerator.d.ts +59 -0
- package/dist/src/hubdocs/SwaggerGenerator.js +405 -0
- package/dist/src/hubdocs/index.d.ts +9 -0
- package/dist/src/hubdocs/index.js +9 -0
- package/dist/src/hubdocs/types.d.ts +114 -0
- package/dist/src/hubdocs/types.js +5 -0
- package/dist/src/infrastructure/DependencyContainer.d.ts +142 -0
- package/dist/src/infrastructure/DependencyContainer.js +250 -0
- package/dist/src/infrastructure/adapters/AppiumAdapter.d.ts +168 -0
- package/dist/src/infrastructure/adapters/AppiumAdapter.js +468 -0
- package/dist/src/infrastructure/adapters/OracleAdapter.d.ts +150 -0
- package/dist/src/infrastructure/adapters/OracleAdapter.js +388 -0
- package/dist/src/infrastructure/adapters/PlaywrightAdapter.d.ts +192 -0
- package/dist/src/infrastructure/adapters/PlaywrightAdapter.js +382 -0
- package/dist/src/infrastructure/adapters/SSHAdapter.d.ts +141 -0
- package/dist/src/infrastructure/adapters/SSHAdapter.js +428 -0
- package/dist/src/interfaces.d.ts +501 -0
- package/dist/src/interfaces.js +25 -0
- package/dist/src/internal/fakes/__fake-actions__.d.ts +17 -0
- package/dist/src/internal/fakes/__fake-actions__.js +21 -0
- package/dist/src/internal/fakes/__forbidden__.d.ts +10 -0
- package/dist/src/internal/fakes/__forbidden__.js +18 -0
- package/dist/src/internal/fakes/__honeypot__.d.ts +15 -0
- package/dist/src/internal/fakes/__honeypot__.js +24 -0
- package/dist/src/octane/OctaneReporter.d.ts +13 -0
- package/dist/src/octane/OctaneReporter.js +61 -0
- package/dist/src/playwright/CryptoActions.d.ts +20 -0
- package/dist/src/playwright/CryptoActions.js +75 -0
- package/dist/src/playwright/EnhancedWebActions.d.ts +7 -0
- package/dist/src/playwright/EnhancedWebActions.js +65 -0
- package/dist/src/playwright/WebActions.d.ts +1599 -0
- package/dist/src/playwright/WebActions.js +11788 -0
- package/dist/src/playwright/actions/ActionTimeline.d.ts +36 -0
- package/dist/src/playwright/actions/ActionTimeline.js +101 -0
- package/dist/src/playwright/actions/RecoveryQueue.d.ts +82 -0
- package/dist/src/playwright/actions/RecoveryQueue.js +130 -0
- package/dist/src/playwright/actions/SelectorCache.d.ts +53 -0
- package/dist/src/playwright/actions/SelectorCache.js +96 -0
- package/dist/src/playwright/actions/index.d.ts +13 -0
- package/dist/src/playwright/actions/index.js +14 -0
- package/dist/src/playwright/actions/types.d.ts +147 -0
- package/dist/src/playwright/actions/types.js +5 -0
- package/dist/src/playwright/fixtures.d.ts +112 -0
- package/dist/src/playwright/fixtures.js +718 -0
- package/dist/src/playwright/network-logs-reporter.d.ts +7 -0
- package/dist/src/playwright/network-logs-reporter.js +66 -0
- package/dist/src/playwright/registerRecoveryWrappers.d.ts +1 -0
- package/dist/src/playwright/registerRecoveryWrappers.js +54 -0
- package/dist/src/security/BuildSecurity.d.ts +12 -0
- package/dist/src/security/BuildSecurity.js +138 -0
- package/dist/src/security/EulaProtection.d.ts +70 -0
- package/dist/src/security/EulaProtection.js +155 -0
- package/dist/src/security/HoneypotManager.d.ts +46 -0
- package/dist/src/security/HoneypotManager.js +234 -0
- package/dist/src/security/KeysManager.d.ts +36 -0
- package/dist/src/security/KeysManager.js +158 -0
- package/dist/src/security/ProofOfWorkIntegration.d.ts +64 -0
- package/dist/src/security/ProofOfWorkIntegration.js +206 -0
- package/dist/src/security/SecurityValidation.d.ts +21 -0
- package/dist/src/security/SecurityValidation.js +163 -0
- package/dist/src/security/SourceMapProtection.d.ts +55 -0
- package/dist/src/security/SourceMapProtection.js +220 -0
- package/dist/src/security/protector.d.ts +1 -0
- package/dist/src/security/protector.js +97 -0
- package/dist/src/ssh/SSHActions.d.ts +262 -0
- package/dist/src/ssh/SSHActions.js +790 -0
- package/dist/src/ssh/SSHClient.d.ts +99 -0
- package/dist/src/ssh/SSHClient.js +409 -0
- package/dist/src/statements/BaseStatement.d.ts +38 -0
- package/dist/src/statements/BaseStatement.js +78 -0
- package/dist/src/testContext/AuthStateManager.d.ts +93 -0
- package/dist/src/testContext/AuthStateManager.js +256 -0
- package/dist/src/testContext/CoverageManager.d.ts +198 -0
- package/dist/src/testContext/CoverageManager.js +917 -0
- package/dist/src/testContext/TestAnnotations.d.ts +476 -0
- package/dist/src/testContext/TestAnnotations.js +2647 -0
- package/dist/src/testContext/TestContext.d.ts +138 -0
- package/dist/src/testContext/TestContext.js +369 -0
- package/dist/src/testContext/UnifiedHtmlGenerator.d.ts +7 -0
- package/dist/src/testContext/UnifiedHtmlGenerator.js +264 -0
- package/dist/src/testContext/UnifiedReportManager.d.ts +211 -0
- package/dist/src/testContext/UnifiedReportManager.js +1206 -0
- package/dist/src/testhub/DynamicConfigManager.d.ts +121 -0
- package/dist/src/testhub/DynamicConfigManager.js +320 -0
- package/dist/src/testhub/SystemsManager.d.ts +119 -0
- package/dist/src/testhub/SystemsManager.js +365 -0
- package/dist/src/testhub/TestHubClient.d.ts +335 -0
- package/dist/src/testhub/TestHubClient.js +1215 -0
- package/dist/src/testhub/TestHubReporter.d.ts +62 -0
- package/dist/src/testhub/TestHubReporter.js +576 -0
- package/dist/src/testhub/TestHubVars.d.ts +116 -0
- package/dist/src/testhub/TestHubVars.js +273 -0
- package/dist/src/utils/ActionInterceptor.d.ts +59 -0
- package/dist/src/utils/ActionInterceptor.js +741 -0
- package/dist/src/utils/ArtifactsCompressor.d.ts +43 -0
- package/dist/src/utils/ArtifactsCompressor.js +181 -0
- package/dist/src/utils/AutoLogsFinal.d.ts +47 -0
- package/dist/src/utils/AutoLogsFinal.js +148 -0
- package/dist/src/utils/CodeGenSession.d.ts +114 -0
- package/dist/src/utils/CodeGenSession.js +264 -0
- package/dist/src/utils/ConfigLogger.d.ts +133 -0
- package/dist/src/utils/ConfigLogger.js +611 -0
- package/dist/src/utils/CustomReporter.d.ts +22 -0
- package/dist/src/utils/CustomReporter.js +352 -0
- package/dist/src/utils/DataStore.d.ts +171 -0
- package/dist/src/utils/DataStore.js +484 -0
- package/dist/src/utils/DatabaseInterceptor.d.ts +19 -0
- package/dist/src/utils/DatabaseInterceptor.js +295 -0
- package/dist/src/utils/DateHelper.d.ts +16 -0
- package/dist/src/utils/DateHelper.js +120 -0
- package/dist/src/utils/DateValidator.d.ts +4 -0
- package/dist/src/utils/DateValidator.js +51 -0
- package/dist/src/utils/DocumentGenerator.d.ts +35 -0
- package/dist/src/utils/DocumentGenerator.js +129 -0
- package/dist/src/utils/EvidenceCapture.d.ts +90 -0
- package/dist/src/utils/EvidenceCapture.js +600 -0
- package/dist/src/utils/EvidenceReportGenerator.d.ts +70 -0
- package/dist/src/utils/EvidenceReportGenerator.js +799 -0
- package/dist/src/utils/FrameManagementUtil.d.ts +42 -0
- package/dist/src/utils/FrameManagementUtil.js +75 -0
- package/dist/src/utils/GlobalStatementsInterceptor.d.ts +1 -0
- package/dist/src/utils/GlobalStatementsInterceptor.js +1 -0
- package/dist/src/utils/HTMLTemplate.d.ts +1 -0
- package/dist/src/utils/HTMLTemplate.js +1034 -0
- package/dist/src/utils/InterceptacaoMagica.d.ts +23 -0
- package/dist/src/utils/InterceptacaoMagica.js +365 -0
- package/dist/src/utils/LogSanitizer.d.ts +35 -0
- package/dist/src/utils/LogSanitizer.js +110 -0
- package/dist/src/utils/Logger.d.ts +65 -0
- package/dist/src/utils/Logger.js +284 -0
- package/dist/src/utils/McpLocalClient.d.ts +141 -0
- package/dist/src/utils/McpLocalClient.js +871 -0
- package/dist/src/utils/PDFEvidenceGenerator.d.ts +20 -0
- package/dist/src/utils/PDFEvidenceGenerator.js +156 -0
- package/dist/src/utils/SpecFileAnalyzer.d.ts +35 -0
- package/dist/src/utils/SpecFileAnalyzer.js +209 -0
- package/dist/src/utils/StatementInterceptor.d.ts +18 -0
- package/dist/src/utils/StatementInterceptor.js +87 -0
- package/dist/src/utils/StatementLogger.d.ts +33 -0
- package/dist/src/utils/StatementLogger.js +113 -0
- package/dist/src/utils/StatementsInterceptor.d.ts +1 -0
- package/dist/src/utils/StatementsInterceptor.js +1 -0
- package/dist/src/utils/TeamsFlushHook.d.ts +17 -0
- package/dist/src/utils/TeamsFlushHook.js +168 -0
- package/dist/src/utils/TerminalLogCapture.d.ts +158 -0
- package/dist/src/utils/TerminalLogCapture.js +531 -0
- package/dist/src/utils/TestMethodLogger.d.ts +70 -0
- package/dist/src/utils/TestMethodLogger.js +95 -0
- package/dist/src/utils/UnifiedTeardown.d.ts +4 -0
- package/dist/src/utils/UnifiedTeardown.js +400 -0
- package/dist/src/utils/XPathCatalog.d.ts +152 -0
- package/dist/src/utils/XPathCatalog.js +350 -0
- package/dist/src/utils/generators.d.ts +90 -0
- package/dist/src/utils/generators.js +167 -0
- package/dist/src/utils/testRecovery/ResilientPlaywright.d.ts +152 -0
- package/dist/src/utils/testRecovery/ResilientPlaywright.js +715 -0
- package/dist/src/utils/testRecovery/TestRecoveryClient.d.ts +801 -0
- package/dist/src/utils/testRecovery/TestRecoveryClient.js +1415 -0
- package/dist/src/utils/testRecovery/autoFixCode.d.ts +65 -0
- package/dist/src/utils/testRecovery/autoFixCode.js +32 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +59 -0
- package/dist/wdio.conf.d.ts +1 -0
- package/dist/wdio.conf.js +420 -0
- package/package.json +137 -0
- package/protect-loader.mjs +643 -0
- package/scripts/consumer-postinstall.ts +975 -0
- package/scripts/generate-index.ts +343 -0
- package/scripts/init-api.ts +613 -0
- package/scripts/init-banco.ts +437 -0
- package/scripts/init-frontend.ts +727 -0
- package/scripts/init-mobile.ts +558 -0
- package/scripts/init-scenarios.ts +925 -0
- package/scripts/init-ssh.ts +734 -0
- package/scripts/package-versions.ts +978 -0
- package/scripts/postinstall.ts +605 -0
- package/scripts/smart-override.ts +1675 -0
- package/scripts/sync-configs.ts +302 -0
- package/scripts/ultracite-setup.ts +370 -0
- package/src/types/globals.d.ts +48 -0
- package/tsconfig.json +29 -0
- package/types/autocore-sync-signal.d.ts +10 -0
|
@@ -0,0 +1,1037 @@
|
|
|
1
|
+
import * as dotenv from 'dotenv';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { loadEnv } from './config/envLoader.js';
|
|
7
|
+
import { resolveJestVitestConflict } from './config/jest-safe-setup.js';
|
|
8
|
+
import { AutoDocs } from './hubdocs/HubDocs.js';
|
|
9
|
+
import { CoverageManager } from './testContext/CoverageManager.js';
|
|
10
|
+
import { UnifiedReportManager } from './testContext/UnifiedReportManager.js';
|
|
11
|
+
import { ConfigLogger } from './utils/ConfigLogger.js';
|
|
12
|
+
import { DataStore } from './utils/DataStore.js';
|
|
13
|
+
import { TerminalLogCapture } from './utils/TerminalLogCapture.js';
|
|
14
|
+
import SystemsManager from './testhub/SystemsManager.js';
|
|
15
|
+
import { ExecutionTracker } from './hubdocs/ExecutionTracker.js';
|
|
16
|
+
import { MobileActions } from './appium/MobileActions.js';
|
|
17
|
+
// Compatibilidade com ES Modules
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = path.dirname(__filename);
|
|
20
|
+
// Regex patterns definidos no top level para performance
|
|
21
|
+
const CN_SPEC_PATTERN = /^CN\d+.*\.spec\.ts$/;
|
|
22
|
+
const SPEC_PATTERN = /\.spec\.ts$/;
|
|
23
|
+
export default async function globalSetup() {
|
|
24
|
+
// 🔧 SOLUÇÃO DEFINITIVA: Resolver conflito Jest/Vitest ANTES de qualquer import
|
|
25
|
+
resolveJestVitestConflict();
|
|
26
|
+
// 📋 CRÍTICO: Iniciar captura de logs do terminal ANTES DE TUDO
|
|
27
|
+
TerminalLogCapture.start();
|
|
28
|
+
// 🆕 Limpar logs compartilhados do início da execução (cross-worker)
|
|
29
|
+
TerminalLogCapture.clearSharedLogs();
|
|
30
|
+
globalThis.TerminalLogCapture = TerminalLogCapture;
|
|
31
|
+
// ✅ PRIORIDADE MÁXIMA: Limpar arquivos temporários ANTES de qualquer coisa
|
|
32
|
+
await cleanupTempFiles();
|
|
33
|
+
dotenv.config();
|
|
34
|
+
const currentEnv = process.env.ENV || 'development';
|
|
35
|
+
dotenv.config({ path: `.env.${currentEnv}` });
|
|
36
|
+
console.log('🏗️ Iniciando setup global...');
|
|
37
|
+
try {
|
|
38
|
+
// Determinar o tipo de projeto baseado no environment
|
|
39
|
+
const projectType = await determineProjectType();
|
|
40
|
+
console.log(`ℹ️ Tipo de projeto detectado: ${projectType}`);
|
|
41
|
+
// Configurar PROJECT_TYPE no environment se não estiver definido
|
|
42
|
+
if (!process.env.PROJECT_TYPE) {
|
|
43
|
+
process.env.PROJECT_TYPE = projectType;
|
|
44
|
+
}
|
|
45
|
+
// ✅ NOVO: Inicializar DataStore para compartilhamento entre projetos
|
|
46
|
+
DataStore.set('PROJECT_TYPE', projectType);
|
|
47
|
+
DataStore.set('START_TIME', new Date().toISOString());
|
|
48
|
+
DataStore.set('NODE_ENV', currentEnv);
|
|
49
|
+
// 📚 NOVO: Inicializar sistema de documentação automática
|
|
50
|
+
try {
|
|
51
|
+
const projectName = process.env.npm_package_name || `AutoCore ${projectType} Tests`;
|
|
52
|
+
await AutoDocs.initialize({
|
|
53
|
+
projectName,
|
|
54
|
+
outputDir: './docs',
|
|
55
|
+
config: {
|
|
56
|
+
enabled: process.env.AUTODOCS_ENABLED !== 'false',
|
|
57
|
+
generateSwagger: true,
|
|
58
|
+
includeScreenshots: process.env.NODE_ENV !== 'ci',
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
// ✅ CRÍTICO: Inicializar ExecutionTracker com detecção automática
|
|
62
|
+
ExecutionTracker.initialize(projectName, projectType);
|
|
63
|
+
globalThis.AutoDocs = AutoDocs;
|
|
64
|
+
globalThis.ExecutionTracker = ExecutionTracker;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.warn('⚠️ Falha ao inicializar AutoDocs, continuando sem documentação:', error);
|
|
68
|
+
}
|
|
69
|
+
// 🌐 NOVO: Inicializar TestHub Systems Manager
|
|
70
|
+
try {
|
|
71
|
+
const systemsManager = SystemsManager.getInstance();
|
|
72
|
+
// Inicializar (carrega sistemas do backend e gera enum)
|
|
73
|
+
await systemsManager.initialize();
|
|
74
|
+
globalThis.SystemsManager = systemsManager;
|
|
75
|
+
console.log('✅ TestHub Systems carregados e disponíveis');
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.warn('⚠️ Falha ao inicializar TestHub Systems, continuando sem integração:', error);
|
|
79
|
+
console.warn(' Os testes continuarão normalmente usando configuração manual (.env)');
|
|
80
|
+
}
|
|
81
|
+
// Configurar logs específicos por tipo de projeto
|
|
82
|
+
ConfigLogger.init({
|
|
83
|
+
projectName: `AutoCore ${projectType} Tests`,
|
|
84
|
+
logToFile: process.env.LOG_TO_FILE === 'true',
|
|
85
|
+
});
|
|
86
|
+
// Carregar variáveis de ambiente
|
|
87
|
+
loadEnv({
|
|
88
|
+
logConfig: true,
|
|
89
|
+
silent: false,
|
|
90
|
+
loadModeSpecificFiles: true,
|
|
91
|
+
});
|
|
92
|
+
// Mostrar informações do sistema
|
|
93
|
+
displaySystemInfo();
|
|
94
|
+
// ✅ NOVO: Verificar e configurar estruturas obrigatórias (gated)
|
|
95
|
+
// Só cria estrutura quando explicitamente solicitado
|
|
96
|
+
if (process.env.AUTOCORE_CREATE_STRUCTURE === 'true') {
|
|
97
|
+
await ensureRequiredStructure(projectType);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log('📁 Criação de estrutura pulada (AUTOCORE_CREATE_STRUCTURE != true)');
|
|
101
|
+
}
|
|
102
|
+
// Verificar configuração do Playwright
|
|
103
|
+
checkPlaywrightConfig();
|
|
104
|
+
// Inicializar contextos específicos
|
|
105
|
+
await initializeContexts(projectType);
|
|
106
|
+
// Verificar recursos necessários
|
|
107
|
+
await checkProjectResources(projectType);
|
|
108
|
+
// ✅ MELHORADO: Verificação mais detalhada de ambiente
|
|
109
|
+
checkEnvironmentVariables(projectType);
|
|
110
|
+
// ✅ NOVO: Configurar métricas de sistema
|
|
111
|
+
setupSystemMetrics();
|
|
112
|
+
// Inicializar sistema de relatórios unificado
|
|
113
|
+
UnifiedReportManager.registrarInicioExecucao();
|
|
114
|
+
// 🤖 NOVO: Inicializar sistema de coverage automático
|
|
115
|
+
await CoverageManager.autoInitialize();
|
|
116
|
+
// ✅ NOVO: Registrar informações iniciais do setup
|
|
117
|
+
await recordSetupMetrics(projectType, currentEnv);
|
|
118
|
+
console.log('✅ Setup global concluído com sucesso!');
|
|
119
|
+
// ✅ NOVO: Log de resumo do setup
|
|
120
|
+
logSetupSummary(projectType, currentEnv);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error('❌ Erro durante setup global');
|
|
124
|
+
console.error(error);
|
|
125
|
+
// ✅ NOVO: Registrar erro no sistema de relatórios
|
|
126
|
+
try {
|
|
127
|
+
console.error(`❌ Erro durante setup: ${String(error)}`);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Ignorar se não conseguir registrar
|
|
131
|
+
}
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* ✅ FUNÇÃO MELHORADA: Limpeza robusta de arquivos temporários
|
|
137
|
+
* Executa ANTES de qualquer configuração para evitar falhas
|
|
138
|
+
*/
|
|
139
|
+
async function cleanupTempFiles() {
|
|
140
|
+
const cwd = process.cwd();
|
|
141
|
+
// ✅ EXPANDIDO: Lista mais completa de arquivos temporários
|
|
142
|
+
const tempFiles = [
|
|
143
|
+
'.env.lock',
|
|
144
|
+
'.configlogger.lock',
|
|
145
|
+
'.test-data-store.json',
|
|
146
|
+
'.autocore.lock',
|
|
147
|
+
'.setup.lock',
|
|
148
|
+
];
|
|
149
|
+
const tempDirs = [
|
|
150
|
+
'playwright/.auth',
|
|
151
|
+
'test-results/.tmp',
|
|
152
|
+
'.rbqa', // ✅ AUTODOCS: Limpar dados antigos do ExecutionTracker
|
|
153
|
+
];
|
|
154
|
+
await cleanupFiles(tempFiles, cwd);
|
|
155
|
+
await cleanupDirectories(tempDirs, cwd);
|
|
156
|
+
// Pequena pausa para garantir que o sistema de arquivos processou as remoções
|
|
157
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Limpeza de arquivos individuais
|
|
161
|
+
*/
|
|
162
|
+
async function cleanupFiles(files, basePath) {
|
|
163
|
+
let filesRemoved = 0;
|
|
164
|
+
let errors = 0;
|
|
165
|
+
for (const fileName of files) {
|
|
166
|
+
const filePath = path.join(basePath, fileName);
|
|
167
|
+
try {
|
|
168
|
+
if (fs.existsSync(filePath)) {
|
|
169
|
+
await removeFileWithFallback(filePath);
|
|
170
|
+
filesRemoved++;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
console.error(`❌ Erro ao remover ${fileName}: ${String(error)}`);
|
|
175
|
+
errors++;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (errors > 0) {
|
|
179
|
+
console.warn(`⚠️ ${errors} erro(s) durante limpeza de arquivos - os testes continuarão`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Limpeza de diretórios
|
|
184
|
+
*/
|
|
185
|
+
async function cleanupDirectories(dirs, basePath) {
|
|
186
|
+
let dirsRemoved = 0;
|
|
187
|
+
let errors = 0;
|
|
188
|
+
for (const dirName of dirs) {
|
|
189
|
+
const dirPath = path.join(basePath, dirName);
|
|
190
|
+
try {
|
|
191
|
+
if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
|
|
192
|
+
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
193
|
+
dirsRemoved++;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.error(`❌ Erro ao remover diretório ${dirName}: ${String(error)}`);
|
|
198
|
+
errors++;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (errors > 0) {
|
|
202
|
+
console.warn(`⚠️ ${errors} erro(s) durante limpeza de diretórios - os testes continuarão`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Remove arquivo com fallback para Windows
|
|
207
|
+
*/
|
|
208
|
+
async function removeFileWithFallback(filePath) {
|
|
209
|
+
try {
|
|
210
|
+
fs.unlinkSync(filePath);
|
|
211
|
+
}
|
|
212
|
+
catch (unlinkError) {
|
|
213
|
+
// Fallback para Windows com alteração de permissões
|
|
214
|
+
if (process.platform === 'win32') {
|
|
215
|
+
try {
|
|
216
|
+
fs.chmodSync(filePath, 0o666);
|
|
217
|
+
fs.unlinkSync(filePath);
|
|
218
|
+
}
|
|
219
|
+
catch (forceError) {
|
|
220
|
+
throw forceError;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
throw unlinkError;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* ✅ NOVA FUNÇÃO: Garantir estruturas obrigatórias
|
|
230
|
+
*/
|
|
231
|
+
async function ensureRequiredStructure(projectType) {
|
|
232
|
+
console.log('📁 Verificando estruturas obrigatórias...');
|
|
233
|
+
const cwd = process.cwd();
|
|
234
|
+
const requiredDirs = [
|
|
235
|
+
'tests',
|
|
236
|
+
'screenshots',
|
|
237
|
+
'test-results',
|
|
238
|
+
'playwright-report',
|
|
239
|
+
];
|
|
240
|
+
// Diretórios específicos por tipo de projeto
|
|
241
|
+
const typeSpecificDirs = {
|
|
242
|
+
API: ['src/statements', 'src/request'],
|
|
243
|
+
Frontend: ['src/pages', 'src/attributes'],
|
|
244
|
+
Mobile: ['src/pages'],
|
|
245
|
+
SSH: ['src/statements'],
|
|
246
|
+
Banco: ['src/models', 'src/services'],
|
|
247
|
+
Scenarios: ['tests'],
|
|
248
|
+
};
|
|
249
|
+
const allRequiredDirs = [
|
|
250
|
+
...requiredDirs,
|
|
251
|
+
...(typeSpecificDirs[projectType] || []),
|
|
252
|
+
];
|
|
253
|
+
await createDirectories(allRequiredDirs, cwd);
|
|
254
|
+
await createEssentialFiles(projectType, cwd);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Criar diretórios necessários
|
|
258
|
+
*/
|
|
259
|
+
async function createDirectories(dirs, basePath) {
|
|
260
|
+
for (const dir of dirs) {
|
|
261
|
+
const dirPath = path.join(basePath, dir);
|
|
262
|
+
if (!fs.existsSync(dirPath)) {
|
|
263
|
+
try {
|
|
264
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
265
|
+
console.log(`📁 Criado diretório: ${dir}`);
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
console.warn(`⚠️ Erro ao criar diretório ${dir}: ${String(error)}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* ✅ NOVA FUNÇÃO: Criar arquivos essenciais
|
|
275
|
+
*/
|
|
276
|
+
async function createEssentialFiles(projectType, cwd) {
|
|
277
|
+
await createDefaultEnvFile(cwd);
|
|
278
|
+
await updateGitignoreFile(cwd);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Criar arquivo .env padrão se não existir
|
|
282
|
+
*/
|
|
283
|
+
async function createDefaultEnvFile(cwd) {
|
|
284
|
+
const envPath = path.join(cwd, '.env');
|
|
285
|
+
if (!fs.existsSync(envPath)) {
|
|
286
|
+
const defaultEnv = `# Arquivo que seleciona o ambiente a ser utilizado
|
|
287
|
+
ENV=preprod
|
|
288
|
+
|
|
289
|
+
# Configurações básicas
|
|
290
|
+
SCREENSHOTS_ENABLED=false
|
|
291
|
+
LOG_LEVEL=info
|
|
292
|
+
LOG_TO_FILE=false
|
|
293
|
+
`;
|
|
294
|
+
fs.writeFileSync(envPath, defaultEnv);
|
|
295
|
+
console.log('📄 Criado arquivo .env padrão');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Atualizar .gitignore com entradas do AutoCore
|
|
300
|
+
*/
|
|
301
|
+
async function updateGitignoreFile(cwd) {
|
|
302
|
+
const gitignorePath = path.join(cwd, '.gitignore');
|
|
303
|
+
const tempIgnoreEntries = [
|
|
304
|
+
'# Arquivos temporários do AutoCore',
|
|
305
|
+
'.env.lock',
|
|
306
|
+
'.configlogger.lock',
|
|
307
|
+
'.test-data-store.json',
|
|
308
|
+
'.autocore.lock',
|
|
309
|
+
'.setup.lock',
|
|
310
|
+
'test-results/',
|
|
311
|
+
'playwright-report/',
|
|
312
|
+
'screenshots/',
|
|
313
|
+
'evidencias/',
|
|
314
|
+
'downloads/',
|
|
315
|
+
];
|
|
316
|
+
if (fs.existsSync(gitignorePath)) {
|
|
317
|
+
const gitignoreContent = fs.readFileSync(gitignorePath, 'utf-8');
|
|
318
|
+
const missingEntries = tempIgnoreEntries.filter((entry) => !gitignoreContent.includes(entry));
|
|
319
|
+
if (missingEntries.length > 0) {
|
|
320
|
+
const newContent = `\n\n${missingEntries.join('\n')}\n`;
|
|
321
|
+
fs.appendFileSync(gitignorePath, newContent);
|
|
322
|
+
console.log(`📄 Adicionadas ${missingEntries.length} entradas ao .gitignore`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* ✅ NOVA FUNÇÃO: Configurar métricas de sistema
|
|
328
|
+
*/
|
|
329
|
+
function setupSystemMetrics() {
|
|
330
|
+
console.log('📊 Configurando métricas de sistema...');
|
|
331
|
+
try {
|
|
332
|
+
// Registrar informações iniciais no DataStore
|
|
333
|
+
const memInfo = process.memoryUsage();
|
|
334
|
+
const systemInfo = {
|
|
335
|
+
startTime: Date.now(),
|
|
336
|
+
initialMemory: {
|
|
337
|
+
heapUsed: Math.round(memInfo.heapUsed / 1024 / 1024), // MB
|
|
338
|
+
heapTotal: Math.round(memInfo.heapTotal / 1024 / 1024), // MB
|
|
339
|
+
external: Math.round(memInfo.external / 1024 / 1024), // MB
|
|
340
|
+
},
|
|
341
|
+
cpuInfo: {
|
|
342
|
+
count: os.cpus().length,
|
|
343
|
+
architecture: process.arch,
|
|
344
|
+
platform: process.platform,
|
|
345
|
+
},
|
|
346
|
+
nodeVersion: process.version,
|
|
347
|
+
environment: process.env.ENV || 'development',
|
|
348
|
+
};
|
|
349
|
+
DataStore.set('SYSTEM_METRICS', systemInfo);
|
|
350
|
+
console.log('📊 Métricas de sistema registradas');
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
console.warn('⚠️ Erro ao configurar métricas:', error);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* ✅ NOVA FUNÇÃO: Registrar métricas do setup
|
|
358
|
+
*/
|
|
359
|
+
async function recordSetupMetrics(projectType, environment) {
|
|
360
|
+
try {
|
|
361
|
+
const setupInfo = {
|
|
362
|
+
projectType,
|
|
363
|
+
environment,
|
|
364
|
+
nodeVersion: process.version,
|
|
365
|
+
platform: process.platform,
|
|
366
|
+
setupCompletedAt: new Date().toISOString(),
|
|
367
|
+
totalMemoryGB: Math.round(os.totalmem() / 1024 / 1024 / 1024),
|
|
368
|
+
cpuCount: os.cpus().length,
|
|
369
|
+
};
|
|
370
|
+
DataStore.set('SETUP_INFO', setupInfo);
|
|
371
|
+
console.log('📋 Informações do setup registradas');
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
console.warn('⚠️ Erro ao registrar métricas do setup:', error);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* ✅ NOVA FUNÇÃO: Log de resumo do setup
|
|
379
|
+
*/
|
|
380
|
+
function logSetupSummary(projectType, environment) {
|
|
381
|
+
console.log('\n📋 === Resumo do Setup ===');
|
|
382
|
+
console.log(`🎯 Tipo de projeto: ${projectType}`);
|
|
383
|
+
console.log(`🌍 Ambiente: ${environment}`);
|
|
384
|
+
console.log(`⚡ Node.js: ${process.version}`);
|
|
385
|
+
console.log(`💻 Plataforma: ${process.platform} (${process.arch})`);
|
|
386
|
+
console.log(`🧠 CPUs disponíveis: ${os.cpus().length}`);
|
|
387
|
+
console.log(`💾 Memória total: ${Math.round(os.totalmem() / 1024 / 1024 / 1024)}GB`);
|
|
388
|
+
// ✅ NOVO: Mostrar variáveis críticas configuradas
|
|
389
|
+
const criticalVars = ['BASE_URL', 'BASE_URL_API', 'DB_HOST', 'SSH_HOST'];
|
|
390
|
+
const configuredVars = criticalVars.filter((varName) => process.env[varName]);
|
|
391
|
+
if (configuredVars.length > 0) {
|
|
392
|
+
console.log(`⚙️ Variáveis críticas: ${configuredVars.join(', ')}`);
|
|
393
|
+
}
|
|
394
|
+
console.log(`📁 Diretório: ${process.cwd()}`);
|
|
395
|
+
console.log('✨ Setup concluído com sucesso!\n');
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* ✅ MELHORADA: Verificação genérica de variáveis de ambiente com detalhes por tipo
|
|
399
|
+
* Não para os testes, apenas informa sobre configuração
|
|
400
|
+
*/
|
|
401
|
+
function checkEnvironmentVariables(projectType) {
|
|
402
|
+
console.log('ℹ️ === Verificação de Configuração ===');
|
|
403
|
+
// Contar variáveis não vazias (excluindo ENV)
|
|
404
|
+
const allEnvVars = Object.keys(process.env).filter((key) => key !== 'ENV' &&
|
|
405
|
+
process.env[key] &&
|
|
406
|
+
(process.env[key] ?? '').trim() !== '');
|
|
407
|
+
// ✅ NOVO: Verificações específicas por tipo (apenas informativas)
|
|
408
|
+
const typeSpecificVars = {
|
|
409
|
+
API: ['BASE_URL', 'BASE_URL_API', 'BASE_URL_TOKEN'],
|
|
410
|
+
Frontend: ['BASE_URL'],
|
|
411
|
+
Mobile: ['APPIUM_SERVER_URL', 'DEVICE_NAME'],
|
|
412
|
+
SSH: ['SSH_HOST', 'SSH_USER'],
|
|
413
|
+
Banco: ['DB_HOST', 'DB_USER', 'DB_SERVICE_NAME'],
|
|
414
|
+
Scenarios: ['BASE_URL', 'OCTANE_URL'],
|
|
415
|
+
};
|
|
416
|
+
const suggestedVars = typeSpecificVars[projectType] || [];
|
|
417
|
+
const configuredSuggested = suggestedVars.filter((varName) => process.env[varName]);
|
|
418
|
+
console.log(`ℹ️ Total de variáveis configuradas: ${allEnvVars.length}`);
|
|
419
|
+
if (configuredSuggested.length > 0) {
|
|
420
|
+
console.log(`✅ Variáveis específicas para ${projectType}: ${configuredSuggested.join(', ')}`);
|
|
421
|
+
}
|
|
422
|
+
if (allEnvVars.length <= 3) {
|
|
423
|
+
console.warn('⚠️ Poucas variáveis de ambiente configuradas.');
|
|
424
|
+
console.warn(`💡 Recomendação para ${projectType}: Configure variáveis como ${suggestedVars.join(', ')}`);
|
|
425
|
+
console.warn('📁 Use os arquivos .env.* para diferentes ambientes');
|
|
426
|
+
console.warn('ℹ️ Os testes continuarão normalmente.');
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
console.log('✅ Configuração de ambiente adequada');
|
|
430
|
+
}
|
|
431
|
+
// ✅ NOVO: Mostrar arquivos .env encontrados
|
|
432
|
+
const envFiles = [
|
|
433
|
+
'.env',
|
|
434
|
+
'.env.preprod',
|
|
435
|
+
'.env.esteira1',
|
|
436
|
+
'.env.esteira2',
|
|
437
|
+
'.env.prodlike',
|
|
438
|
+
];
|
|
439
|
+
const existingEnvFiles = envFiles.filter((file) => fs.existsSync(path.join(process.cwd(), file)));
|
|
440
|
+
if (existingEnvFiles.length > 0) {
|
|
441
|
+
console.log(`📋 Arquivos de ambiente: ${existingEnvFiles.join(', ')}`);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Determinar tipo de projeto (otimizada para complexidade)
|
|
446
|
+
*/
|
|
447
|
+
async function determineProjectType() {
|
|
448
|
+
const cwd = process.cwd();
|
|
449
|
+
try {
|
|
450
|
+
// ✅ PRIORIDADE: Honor CI / pipeline overrides (force test type)
|
|
451
|
+
const overrideType = (process.env.FORCE_TEST_TYPE ||
|
|
452
|
+
process.env.TEST_TYPE ||
|
|
453
|
+
process.env.RUN_TEST_TYPE ||
|
|
454
|
+
'').toLowerCase();
|
|
455
|
+
if (overrideType) {
|
|
456
|
+
if (overrideType.includes('ssh'))
|
|
457
|
+
return 'SSH';
|
|
458
|
+
if (overrideType.includes('scenario') || overrideType.includes('scenarios'))
|
|
459
|
+
return 'Scenarios';
|
|
460
|
+
if (overrideType.includes('frontend') || overrideType.includes('playwright') || overrideType.includes('web'))
|
|
461
|
+
return 'Frontend';
|
|
462
|
+
if (overrideType.includes('api'))
|
|
463
|
+
return 'API';
|
|
464
|
+
if (overrideType.includes('mobile'))
|
|
465
|
+
return 'Mobile';
|
|
466
|
+
if (overrideType.includes('banco') || overrideType.includes('db'))
|
|
467
|
+
return 'Banco';
|
|
468
|
+
}
|
|
469
|
+
// 1. Detectar por nome do projeto no package.json
|
|
470
|
+
const projectNameType = await detectByProjectName(cwd);
|
|
471
|
+
if (projectNameType) {
|
|
472
|
+
return projectNameType;
|
|
473
|
+
}
|
|
474
|
+
// 2. Detectar por estrutura de arquivos
|
|
475
|
+
const structureType = await detectByFileStructure(cwd);
|
|
476
|
+
if (structureType) {
|
|
477
|
+
return structureType;
|
|
478
|
+
}
|
|
479
|
+
// 3. Detectar por variáveis de ambiente
|
|
480
|
+
const envType = detectByEnvironmentVars();
|
|
481
|
+
if (envType) {
|
|
482
|
+
return envType;
|
|
483
|
+
}
|
|
484
|
+
// 4. Detectar por arquivos de teste
|
|
485
|
+
const testType = await detectByTestFiles(cwd);
|
|
486
|
+
if (testType) {
|
|
487
|
+
return testType;
|
|
488
|
+
}
|
|
489
|
+
return 'Frontend'; // fallback
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
console.warn('⚠️ Erro ao detectar tipo de projeto:', error);
|
|
493
|
+
return 'API';
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Detectar tipo por nome do projeto
|
|
498
|
+
*/
|
|
499
|
+
async function detectByProjectName(cwd) {
|
|
500
|
+
const packageJsonPath = path.join(cwd, 'package.json');
|
|
501
|
+
const folderName = path.basename(cwd).toLowerCase();
|
|
502
|
+
// Treat projects with `-pw` suffix as Scenarios by default (CI convention)
|
|
503
|
+
if (folderName.endsWith('-pw')) {
|
|
504
|
+
console.log(`📁 Nome da pasta termina com -pw: ${folderName} → tratando como Scenarios por padrão`);
|
|
505
|
+
// If folder name explicitly contains 'playwright' prefer Frontend
|
|
506
|
+
if (folderName.includes('playwright')) {
|
|
507
|
+
console.log(' (contém "playwright" no nome, tratando como Frontend)');
|
|
508
|
+
return 'Frontend';
|
|
509
|
+
}
|
|
510
|
+
return 'Scenarios';
|
|
511
|
+
}
|
|
512
|
+
// ✅ NOVA: Verificar nome da pasta antes do package.json
|
|
513
|
+
const folderPatterns = [
|
|
514
|
+
// ✅ PRIORIDADE MÁXIMA: Detectar cenários/scenarios primeiro (mais específico)
|
|
515
|
+
{ pattern: /cenario|scenario/i, type: 'Scenarios' }, // Case insensitive, pega qualquer variação
|
|
516
|
+
{ pattern: /mobile|appium|android|ios/, type: 'Mobile' },
|
|
517
|
+
{ pattern: /oss-api|test-oss-api|service|rest/, type: 'API' }, // Mais específico para API
|
|
518
|
+
{ pattern: /\bapi\b/, type: 'API' }, // API como palavra completa
|
|
519
|
+
{ pattern: /frontend|web|ui|playwright/, type: 'Frontend' },
|
|
520
|
+
{ pattern: /ssh|terminal|shell/, type: 'SSH' },
|
|
521
|
+
{ pattern: /banco|database|db|sql/, type: 'Banco' },
|
|
522
|
+
];
|
|
523
|
+
for (const { pattern, type } of folderPatterns) {
|
|
524
|
+
if (pattern.test(folderName)) {
|
|
525
|
+
console.log(`📁 Tipo detectado por nome da pasta: ${folderName} → ${type}`);
|
|
526
|
+
return type;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
try {
|
|
533
|
+
const packageContent = fs.readFileSync(packageJsonPath, 'utf-8');
|
|
534
|
+
const packageJson = JSON.parse(packageContent);
|
|
535
|
+
const projectName = (packageJson.name || '').toLowerCase();
|
|
536
|
+
// If package name ends with -pw treat as Scenarios unless it explicitly references playwright
|
|
537
|
+
if (projectName.endsWith('-pw')) {
|
|
538
|
+
console.log(`📦 package.json name ends with -pw: ${projectName} → treating as Scenarios by default`);
|
|
539
|
+
if (projectName.includes('playwright')) {
|
|
540
|
+
console.log(' (package name contains "playwright", treating as Frontend)');
|
|
541
|
+
return 'Frontend';
|
|
542
|
+
}
|
|
543
|
+
return 'Scenarios';
|
|
544
|
+
}
|
|
545
|
+
const namePatterns = [
|
|
546
|
+
// ✅ PRIORIDADE MÁXIMA: Detectar cenários/scenarios primeiro (mais específico)
|
|
547
|
+
{ pattern: /cenario|scenario/i, type: 'Scenarios' }, // Case insensitive
|
|
548
|
+
{ pattern: /mobile|appium|android|ios/, type: 'Mobile' },
|
|
549
|
+
{ pattern: /oss-api|test-oss-api|service|rest/, type: 'API' }, // Mais específico para API
|
|
550
|
+
{ pattern: /\bapi\b/, type: 'API' }, // API como palavra completa
|
|
551
|
+
{ pattern: /frontend|web|ui|playwright/, type: 'Frontend' },
|
|
552
|
+
{ pattern: /ssh|terminal|shell/, type: 'SSH' },
|
|
553
|
+
{ pattern: /banco|database|db|sql/, type: 'Banco' },
|
|
554
|
+
];
|
|
555
|
+
for (const { pattern, type } of namePatterns) {
|
|
556
|
+
if (pattern.test(projectName)) {
|
|
557
|
+
console.log(`📦 Tipo detectado por package.json: ${projectName} → ${type}`);
|
|
558
|
+
return type;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
catch {
|
|
563
|
+
// Ignorar erro de parse
|
|
564
|
+
}
|
|
565
|
+
return null;
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Detectar tipo por estrutura de arquivos
|
|
569
|
+
*/
|
|
570
|
+
async function detectByFileStructure(cwd) {
|
|
571
|
+
const srcDir = path.join(cwd, 'src');
|
|
572
|
+
const testsDir = path.join(cwd, 'tests');
|
|
573
|
+
// Scenarios: ausência da pasta src + presença de CN*.spec.ts
|
|
574
|
+
if (!fs.existsSync(srcDir) && fs.existsSync(testsDir)) {
|
|
575
|
+
try {
|
|
576
|
+
const hasScenarios = fs
|
|
577
|
+
.readdirSync(testsDir)
|
|
578
|
+
.some((f) => CN_SPEC_PATTERN.test(f));
|
|
579
|
+
if (hasScenarios) {
|
|
580
|
+
return 'Scenarios';
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
catch {
|
|
584
|
+
// Ignorar erro de leitura
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
// Banco: arquivos específicos
|
|
588
|
+
const bancoFiles = [
|
|
589
|
+
'src/models/ModelDBA.ts',
|
|
590
|
+
'src/models/ModelDBA.js',
|
|
591
|
+
'src/services/ServiceSiebel.ts',
|
|
592
|
+
'src/services/ServiceSiebel.js',
|
|
593
|
+
];
|
|
594
|
+
for (const file of bancoFiles) {
|
|
595
|
+
if (fs.existsSync(path.join(cwd, file))) {
|
|
596
|
+
return 'Banco';
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
// Banco: pastas típicas
|
|
600
|
+
if (fs.existsSync(path.join(cwd, 'src', 'models')) ||
|
|
601
|
+
fs.existsSync(path.join(cwd, 'src', 'services'))) {
|
|
602
|
+
return 'Banco';
|
|
603
|
+
}
|
|
604
|
+
// Mobile: wdio.conf
|
|
605
|
+
if (fs.existsSync(path.join(cwd, 'wdio.conf.ts')) ||
|
|
606
|
+
fs.existsSync(path.join(cwd, 'wdio.conf.js'))) {
|
|
607
|
+
return 'Mobile';
|
|
608
|
+
}
|
|
609
|
+
return null;
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Detectar tipo por variáveis de ambiente
|
|
613
|
+
*/
|
|
614
|
+
function detectByEnvironmentVars() {
|
|
615
|
+
if (process.env.USE_MOBILE === 'true') {
|
|
616
|
+
return 'Mobile';
|
|
617
|
+
}
|
|
618
|
+
if (process.env.USE_SSH === 'true') {
|
|
619
|
+
return 'SSH';
|
|
620
|
+
}
|
|
621
|
+
if (process.env.USE_BANCO === 'true') {
|
|
622
|
+
return 'Banco';
|
|
623
|
+
}
|
|
624
|
+
return null;
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Detectar tipo por arquivos de teste
|
|
628
|
+
*/
|
|
629
|
+
async function detectByTestFiles(cwd) {
|
|
630
|
+
const testsDir = path.join(cwd, 'tests');
|
|
631
|
+
if (!fs.existsSync(testsDir)) {
|
|
632
|
+
return null;
|
|
633
|
+
}
|
|
634
|
+
try {
|
|
635
|
+
const hasSpecFiles = fs
|
|
636
|
+
.readdirSync(testsDir)
|
|
637
|
+
.some((f) => SPEC_PATTERN.test(f));
|
|
638
|
+
return hasSpecFiles ? 'API' : null;
|
|
639
|
+
}
|
|
640
|
+
catch {
|
|
641
|
+
return null;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Verificar recursos sem require()
|
|
646
|
+
*/
|
|
647
|
+
async function checkProjectResources(projectType) {
|
|
648
|
+
console.log('ℹ️ === Verificação de Recursos ===');
|
|
649
|
+
const cwd = process.cwd();
|
|
650
|
+
try {
|
|
651
|
+
// Verificar estrutura de pastas
|
|
652
|
+
const testDir = path.join(cwd, 'tests');
|
|
653
|
+
if (!fs.existsSync(testDir)) {
|
|
654
|
+
console.warn('⚠️ Pasta "tests" não encontrada, criando...');
|
|
655
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
656
|
+
}
|
|
657
|
+
// Verificar configurações específicas por tipo
|
|
658
|
+
const resourceCheckers = {
|
|
659
|
+
Mobile: checkMobileResources,
|
|
660
|
+
API: checkApiResources,
|
|
661
|
+
Frontend: checkFrontendResources,
|
|
662
|
+
SSH: checkSSHResources,
|
|
663
|
+
Banco: checkBancoResources,
|
|
664
|
+
Scenarios: checkScenariosResources,
|
|
665
|
+
};
|
|
666
|
+
const checker = resourceCheckers[projectType];
|
|
667
|
+
if (checker) {
|
|
668
|
+
await checker(cwd);
|
|
669
|
+
}
|
|
670
|
+
console.log('✅ Verificação de recursos concluída');
|
|
671
|
+
}
|
|
672
|
+
catch (error) {
|
|
673
|
+
console.warn('⚠️ Erro na verificação de recursos:', error);
|
|
674
|
+
// Não falhar o setup por problemas de verificação
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Verificações específicas para projetos API
|
|
679
|
+
*/
|
|
680
|
+
function checkApiResources(cwd) {
|
|
681
|
+
return new Promise((resolve) => {
|
|
682
|
+
console.log('ℹ️ Verificando recursos para projeto API...');
|
|
683
|
+
// Verificar se há arquivos .env
|
|
684
|
+
const envFiles = ['.env', '.env.preprod', '.env.esteira1'];
|
|
685
|
+
const existingEnvFiles = envFiles.filter((file) => fs.existsSync(path.join(cwd, file)));
|
|
686
|
+
if (existingEnvFiles.length > 0) {
|
|
687
|
+
console.log(`✅ Arquivos .env encontrados: ${existingEnvFiles.join(', ')}`);
|
|
688
|
+
}
|
|
689
|
+
else {
|
|
690
|
+
console.warn('⚠️ Nenhum arquivo .env encontrado - Configure conforme necessário');
|
|
691
|
+
}
|
|
692
|
+
// Verificar estrutura de pastas típica de API
|
|
693
|
+
const apiDirs = ['src/statements', 'src/request', 'src/services'];
|
|
694
|
+
const existingDirs = apiDirs.filter((dir) => fs.existsSync(path.join(cwd, dir)));
|
|
695
|
+
if (existingDirs.length > 0) {
|
|
696
|
+
console.log(`✅ Estrutura API encontrada: ${existingDirs.join(', ')}`);
|
|
697
|
+
}
|
|
698
|
+
else {
|
|
699
|
+
console.log('ℹ️ Estrutura será criada conforme necessário');
|
|
700
|
+
}
|
|
701
|
+
resolve();
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* Verificações para outros tipos de projeto
|
|
706
|
+
*/
|
|
707
|
+
function checkMobileResources(cwd) {
|
|
708
|
+
return new Promise((resolve) => {
|
|
709
|
+
console.log('ℹ️ Verificando recursos para projeto Mobile...');
|
|
710
|
+
const isMobileProject = detectMobileProject(cwd);
|
|
711
|
+
if (isMobileProject) {
|
|
712
|
+
checkDedicatedMobileProject(cwd);
|
|
713
|
+
}
|
|
714
|
+
else {
|
|
715
|
+
console.log('✅ Capacidades Mobile disponíveis via AutoCore');
|
|
716
|
+
}
|
|
717
|
+
checkMobileEnvironmentFiles(cwd);
|
|
718
|
+
resolve();
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Detectar se é projeto mobile dedicado
|
|
723
|
+
*/
|
|
724
|
+
function detectMobileProject(cwd) {
|
|
725
|
+
const packageJsonPath = path.join(cwd, 'package.json');
|
|
726
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
727
|
+
return false;
|
|
728
|
+
}
|
|
729
|
+
try {
|
|
730
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
731
|
+
const mobileDeps = ['webdriverio', '@wdio/cli'];
|
|
732
|
+
const mobileScripts = ['appium:start', 'test:android', 'test:ios'];
|
|
733
|
+
const hasMobileDeps = mobileDeps.some((dep) => packageJson.dependencies?.[dep] || packageJson.devDependencies?.[dep]);
|
|
734
|
+
const hasMobileScripts = mobileScripts.some((script) => packageJson.scripts?.[script]);
|
|
735
|
+
return hasMobileDeps || hasMobileScripts;
|
|
736
|
+
}
|
|
737
|
+
catch {
|
|
738
|
+
return false;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Verificar projeto mobile dedicado
|
|
743
|
+
*/
|
|
744
|
+
function checkDedicatedMobileProject(cwd) {
|
|
745
|
+
const wdioConfig = fs.existsSync(path.join(cwd, 'wdio.conf.ts')) ||
|
|
746
|
+
fs.existsSync(path.join(cwd, 'wdio.conf.js'));
|
|
747
|
+
if (wdioConfig) {
|
|
748
|
+
console.log('✅ Configuração WebdriverIO encontrada');
|
|
749
|
+
}
|
|
750
|
+
else {
|
|
751
|
+
console.log('ℹ️ Configuração WebdriverIO será criada quando necessário');
|
|
752
|
+
}
|
|
753
|
+
const appsDir = fs.existsSync(path.join(cwd, 'apps'));
|
|
754
|
+
if (appsDir) {
|
|
755
|
+
console.log('✅ Diretório apps/ encontrado');
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
console.log('ℹ️ Diretório apps/ será criado conforme necessário');
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
/**
|
|
762
|
+
* Verificar arquivos de ambiente mobile
|
|
763
|
+
*/
|
|
764
|
+
function checkMobileEnvironmentFiles(cwd) {
|
|
765
|
+
const mobileEnvFiles = [
|
|
766
|
+
'.env.preprod',
|
|
767
|
+
'.env.esteira1',
|
|
768
|
+
'.env.esteira2',
|
|
769
|
+
'.env.prodlike',
|
|
770
|
+
].filter((file) => fs.existsSync(path.join(cwd, file))).length;
|
|
771
|
+
if (mobileEnvFiles > 0) {
|
|
772
|
+
console.log(`✅ ${mobileEnvFiles} arquivo(s) de ambiente encontrado(s)`);
|
|
773
|
+
}
|
|
774
|
+
else {
|
|
775
|
+
console.log('ℹ️ Arquivos de ambiente serão criados conforme necessário');
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
function checkFrontendResources(cwd) {
|
|
779
|
+
return new Promise((resolve) => {
|
|
780
|
+
console.log('ℹ️ Verificando recursos para projeto Frontend...');
|
|
781
|
+
const playwrightConfig = fs.existsSync(path.join(cwd, 'playwright.config.ts')) ||
|
|
782
|
+
fs.existsSync(path.join(cwd, 'playwright.config.js'));
|
|
783
|
+
if (playwrightConfig) {
|
|
784
|
+
console.log('✅ Configuração Playwright encontrada');
|
|
785
|
+
}
|
|
786
|
+
else {
|
|
787
|
+
console.warn('⚠️ Configuração Playwright não encontrada');
|
|
788
|
+
}
|
|
789
|
+
// Verificar estrutura típica de Frontend
|
|
790
|
+
const frontendDirs = ['src/pages', 'src/page-objects', 'src/attributes'];
|
|
791
|
+
const existingDirs = frontendDirs.filter((dir) => fs.existsSync(path.join(cwd, dir)));
|
|
792
|
+
if (existingDirs.length > 0) {
|
|
793
|
+
console.log(`✅ Estrutura Frontend encontrada: ${existingDirs.join(', ')}`);
|
|
794
|
+
}
|
|
795
|
+
else {
|
|
796
|
+
console.log('ℹ️ Estrutura será criada conforme necessário');
|
|
797
|
+
}
|
|
798
|
+
resolve();
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
function checkSSHResources(cwd) {
|
|
802
|
+
return new Promise((resolve) => {
|
|
803
|
+
console.log('ℹ️ Verificando recursos para projeto SSH...');
|
|
804
|
+
// Verificar estrutura típica de SSH
|
|
805
|
+
const sshDirs = ['src/statements', 'secrets'];
|
|
806
|
+
const existingDirs = sshDirs.filter((dir) => fs.existsSync(path.join(cwd, dir)));
|
|
807
|
+
if (existingDirs.length > 0) {
|
|
808
|
+
console.log(`✅ Estrutura SSH encontrada: ${existingDirs.join(', ')}`);
|
|
809
|
+
}
|
|
810
|
+
else {
|
|
811
|
+
console.log('ℹ️ Estrutura será criada conforme necessário');
|
|
812
|
+
}
|
|
813
|
+
// Verificar arquivos de configuração SSH
|
|
814
|
+
const envFiles = ['.env.preprod', '.env.esteira1', '.env.esteira2'];
|
|
815
|
+
const existingEnvFiles = envFiles.filter((file) => fs.existsSync(path.join(cwd, file)));
|
|
816
|
+
if (existingEnvFiles.length > 0) {
|
|
817
|
+
console.log(`✅ Configurações de ambiente: ${existingEnvFiles.join(', ')}`);
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
console.log('ℹ️ Configure variáveis SSH nos arquivos .env.*');
|
|
821
|
+
}
|
|
822
|
+
resolve();
|
|
823
|
+
});
|
|
824
|
+
}
|
|
825
|
+
function checkBancoResources(cwd) {
|
|
826
|
+
return new Promise((resolve) => {
|
|
827
|
+
console.log('ℹ️ Verificando recursos para projeto Banco...');
|
|
828
|
+
// Verificar estrutura típica de Banco
|
|
829
|
+
const bancoDirs = ['src/models', 'src/services'];
|
|
830
|
+
const existingDirs = bancoDirs.filter((dir) => fs.existsSync(path.join(cwd, dir)));
|
|
831
|
+
if (existingDirs.length > 0) {
|
|
832
|
+
console.log(`✅ Estrutura Banco encontrada: ${existingDirs.join(', ')}`);
|
|
833
|
+
}
|
|
834
|
+
else {
|
|
835
|
+
console.log('ℹ️ Estrutura será criada conforme necessário');
|
|
836
|
+
}
|
|
837
|
+
// Verificar arquivos específicos de banco
|
|
838
|
+
const bancoFiles = [
|
|
839
|
+
'src/models/ModelDBA.ts',
|
|
840
|
+
'src/services/ServiceSiebel.ts',
|
|
841
|
+
];
|
|
842
|
+
const existingFiles = bancoFiles.filter((file) => fs.existsSync(path.join(cwd, file)));
|
|
843
|
+
if (existingFiles.length > 0) {
|
|
844
|
+
console.log(`✅ Arquivos de banco encontrados: ${existingFiles.length}`);
|
|
845
|
+
}
|
|
846
|
+
else {
|
|
847
|
+
console.log('ℹ️ Arquivos de modelo e serviço serão criados conforme necessário');
|
|
848
|
+
}
|
|
849
|
+
resolve();
|
|
850
|
+
});
|
|
851
|
+
}
|
|
852
|
+
function checkScenariosResources(cwd) {
|
|
853
|
+
return new Promise((resolve) => {
|
|
854
|
+
console.log('ℹ️ Verificando recursos para projeto Scenarios...');
|
|
855
|
+
// Verificar se existem arquivos CN*.spec.ts
|
|
856
|
+
const testsDir = path.join(cwd, 'tests');
|
|
857
|
+
if (fs.existsSync(testsDir)) {
|
|
858
|
+
const scenarioFiles = fs
|
|
859
|
+
.readdirSync(testsDir)
|
|
860
|
+
.filter((f) => CN_SPEC_PATTERN.test(f));
|
|
861
|
+
if (scenarioFiles.length > 0) {
|
|
862
|
+
console.log(`✅ ${scenarioFiles.length} arquivo(s) de cenário encontrado(s)`);
|
|
863
|
+
}
|
|
864
|
+
else {
|
|
865
|
+
console.log('ℹ️ Nenhum arquivo de cenário (CN*.spec.ts) encontrado');
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
// Verificar configurações de ambiente
|
|
869
|
+
const envFiles = [
|
|
870
|
+
'.env.preprod',
|
|
871
|
+
'.env.esteira1',
|
|
872
|
+
'.env.esteira2',
|
|
873
|
+
'.env.prodlike',
|
|
874
|
+
];
|
|
875
|
+
const existingEnvFiles = envFiles.filter((file) => fs.existsSync(path.join(cwd, file)));
|
|
876
|
+
if (existingEnvFiles.length > 0) {
|
|
877
|
+
console.log(`✅ Configurações de ambiente: ${existingEnvFiles.join(', ')}`);
|
|
878
|
+
}
|
|
879
|
+
else {
|
|
880
|
+
console.log('ℹ️ Configure variáveis nos arquivos .env.* conforme necessário');
|
|
881
|
+
}
|
|
882
|
+
resolve();
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* 🧹 Limpa screenshots web da execução anterior
|
|
887
|
+
*/
|
|
888
|
+
async function cleanWebScreenshots() {
|
|
889
|
+
try {
|
|
890
|
+
const screenshotDir = path.join(process.cwd(), 'test-results', 'web-screenshots');
|
|
891
|
+
if (fs.existsSync(screenshotDir)) {
|
|
892
|
+
const files = fs.readdirSync(screenshotDir);
|
|
893
|
+
const imageFiles = files.filter((file) => file.endsWith('.png') ||
|
|
894
|
+
file.endsWith('.jpg') ||
|
|
895
|
+
file.endsWith('.jpeg'));
|
|
896
|
+
for (const file of imageFiles) {
|
|
897
|
+
const filePath = path.join(screenshotDir, file);
|
|
898
|
+
fs.unlinkSync(filePath);
|
|
899
|
+
}
|
|
900
|
+
console.log(`🧹 Limpos ${imageFiles.length} screenshot(s) web da execução anterior`);
|
|
901
|
+
}
|
|
902
|
+
else {
|
|
903
|
+
fs.mkdirSync(screenshotDir, { recursive: true });
|
|
904
|
+
console.log(`📁 Diretório de screenshots web criado: ${screenshotDir}`);
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
catch (error) {
|
|
908
|
+
console.log(`⚠️ Erro ao limpar screenshots web: ${String(error)}`);
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
/**
|
|
912
|
+
* Inicializar contextos específicos por tipo de projeto
|
|
913
|
+
*/
|
|
914
|
+
async function initializeContexts(projectType) {
|
|
915
|
+
console.log('ℹ️ === Inicialização de Contextos ===');
|
|
916
|
+
try {
|
|
917
|
+
const contextInfo = {
|
|
918
|
+
API: [
|
|
919
|
+
'✅ Inicializando contextos para projeto API',
|
|
920
|
+
'ℹ️ - ApiActions disponível para requisições HTTP',
|
|
921
|
+
'ℹ️ - Validações de response automáticas',
|
|
922
|
+
'ℹ️ - Cache de requisições habilitado',
|
|
923
|
+
],
|
|
924
|
+
Frontend: [
|
|
925
|
+
'✅ Inicializando contextos para projeto Frontend',
|
|
926
|
+
'ℹ️ - Actions disponível para automação web',
|
|
927
|
+
'ℹ️ - Screenshots automáticos em falhas',
|
|
928
|
+
'ℹ️ - Navegação e interação com elementos',
|
|
929
|
+
],
|
|
930
|
+
Mobile: [
|
|
931
|
+
'✅ Inicializando contextos para projeto Mobile',
|
|
932
|
+
'ℹ️ - MobileActions disponível para automação mobile',
|
|
933
|
+
'ℹ️ - WebdriverIO configurado',
|
|
934
|
+
'ℹ️ - Gestos e interações touch',
|
|
935
|
+
],
|
|
936
|
+
SSH: [
|
|
937
|
+
'✅ Inicializando contextos para projeto SSH',
|
|
938
|
+
'ℹ️ - SSHActions disponível para comandos remotos',
|
|
939
|
+
'ℹ️ - Conexões seguras',
|
|
940
|
+
'ℹ️ - Execução de scripts remotos',
|
|
941
|
+
],
|
|
942
|
+
Banco: [
|
|
943
|
+
'✅ Inicializando contextos para projeto Banco',
|
|
944
|
+
'ℹ️ - BancoHelper disponível para queries',
|
|
945
|
+
'ℹ️ - Conexões Oracle/SQL',
|
|
946
|
+
'ℹ️ - Cache de resultados',
|
|
947
|
+
],
|
|
948
|
+
Scenarios: [
|
|
949
|
+
'✅ Inicializando contextos para projeto Scenarios',
|
|
950
|
+
'ℹ️ - Statements disponíveis para cenários',
|
|
951
|
+
'ℹ️ - Relatórios e evidências automáticas',
|
|
952
|
+
'ℹ️ - Suporte a múltiplos tipos de teste',
|
|
953
|
+
],
|
|
954
|
+
};
|
|
955
|
+
const messages = contextInfo[projectType] || [];
|
|
956
|
+
messages.forEach((message) => console.log(message));
|
|
957
|
+
// 🧹 Limpeza específica por tipo de projeto
|
|
958
|
+
if (projectType === 'Mobile') {
|
|
959
|
+
try {
|
|
960
|
+
await MobileActions.cleanMobileScreenshots();
|
|
961
|
+
}
|
|
962
|
+
catch (error) {
|
|
963
|
+
console.log('⚠️ Erro ao limpar screenshots mobile:', error);
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
// 🧹 Limpeza de screenshots Web/Frontend
|
|
967
|
+
if (projectType === 'Frontend' || projectType === 'Mixed') {
|
|
968
|
+
try {
|
|
969
|
+
await cleanWebScreenshots();
|
|
970
|
+
}
|
|
971
|
+
catch (error) {
|
|
972
|
+
console.log('⚠️ Erro ao limpar screenshots web:', error);
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
console.log(`📊 Sistema de relatórios unificado ativo para ${projectType}`);
|
|
976
|
+
console.log('ℹ️ - Logs automáticos em tempo real');
|
|
977
|
+
console.log('ℹ️ - Relatórios HTML visuais');
|
|
978
|
+
console.log('ℹ️ - Métricas e analytics integrados');
|
|
979
|
+
}
|
|
980
|
+
catch (error) {
|
|
981
|
+
console.warn('⚠️ Erro ao inicializar contextos:', error);
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
/**
|
|
985
|
+
* Exibir informações do sistema sem require()
|
|
986
|
+
*/
|
|
987
|
+
function displaySystemInfo() {
|
|
988
|
+
console.log('ℹ️ === Configuração do Ambiente ===');
|
|
989
|
+
console.log(`ℹ️ Node.js: ${process.version}`);
|
|
990
|
+
console.log(`ℹ️ Sistema operacional: ${process.platform} ${process.arch}`);
|
|
991
|
+
const totalMemGB = Math.round(os.totalmem() / 1024 / 1024 / 1024);
|
|
992
|
+
const freeMemGB = Math.round(os.freemem() / 1024 / 1024 / 1024);
|
|
993
|
+
const heapUsed = Math.round(process.memoryUsage().heapUsed / 1024 / 1024);
|
|
994
|
+
const heapTotal = Math.round(process.memoryUsage().heapTotal / 1024 / 1024);
|
|
995
|
+
console.log(`ℹ️ Memória total: ${totalMemGB}GB`);
|
|
996
|
+
console.log(`ℹ️ Memória disponível: ${freeMemGB}GB`);
|
|
997
|
+
console.log(`ℹ️ Heap usado: ${heapUsed}MB / ${heapTotal}MB`);
|
|
998
|
+
console.log(`ℹ️ CPUs: ${os.cpus().length} núcleos`);
|
|
999
|
+
console.log(`ℹ️ Usuário: ${process.env.USERNAME || process.env.USER || 'N/A'}`);
|
|
1000
|
+
console.log(`ℹ️ Nome da máquina: ${os.hostname()}`);
|
|
1001
|
+
console.log(`ℹ️ Diretório de trabalho: ${process.cwd()}`);
|
|
1002
|
+
// Mostrar ambiente selecionado
|
|
1003
|
+
const currentEnv = process.env.ENV || process.env.NODE_ENV || 'N/A';
|
|
1004
|
+
console.log(`ℹ️ Ambiente selecionado: ${currentEnv}`);
|
|
1005
|
+
}
|
|
1006
|
+
/**
|
|
1007
|
+
* Verificar configuração do Playwright
|
|
1008
|
+
*/
|
|
1009
|
+
function checkPlaywrightConfig() {
|
|
1010
|
+
console.log('ℹ️ === Configuração do Playwright ===');
|
|
1011
|
+
const cwd = process.cwd();
|
|
1012
|
+
const configFiles = ['playwright.config.ts', 'playwright.config.js'];
|
|
1013
|
+
const configFile = configFiles.find((file) => fs.existsSync(path.join(cwd, file)));
|
|
1014
|
+
if (configFile) {
|
|
1015
|
+
console.log(`✅ Configuração encontrada: ${configFile}`);
|
|
1016
|
+
try {
|
|
1017
|
+
// Tentar ler algumas configurações básicas
|
|
1018
|
+
const configPath = path.join(cwd, configFile);
|
|
1019
|
+
const configContent = fs.readFileSync(configPath, 'utf-8');
|
|
1020
|
+
// Extrair informações básicas via regex (simples)
|
|
1021
|
+
const testDirMatch = configContent.match(/testDir:\s*['"`]([^'"`]+)['"`]/);
|
|
1022
|
+
if (testDirMatch) {
|
|
1023
|
+
console.log(`ℹ️ Diretório de testes: ${testDirMatch[1]}`);
|
|
1024
|
+
}
|
|
1025
|
+
const timeoutMatch = configContent.match(/timeout:\s*(\d+)/);
|
|
1026
|
+
if (timeoutMatch) {
|
|
1027
|
+
console.log(`ℹ️ Timeout global: ${timeoutMatch[1]}ms`);
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
catch (error) {
|
|
1031
|
+
console.log('ℹ️ (Não foi possível ler detalhes da configuração)');
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
else {
|
|
1035
|
+
console.warn('⚠️ Nenhuma configuração do Playwright encontrada');
|
|
1036
|
+
}
|
|
1037
|
+
}
|