@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,531 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 📋 Sistema de Captura Completa de Logs do Terminal
|
|
3
|
+
* @description Captura TODOS os logs (console.log, Logger, etc.) que aparecem no terminal
|
|
4
|
+
* @author AutoCore Team
|
|
5
|
+
* @version 1.1.0
|
|
6
|
+
* 🔧 ATUALIZAÇÃO: Logs são persistidos em arquivo para compartilhar entre workers do Playwright
|
|
7
|
+
*/
|
|
8
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { resolve } from 'node:path';
|
|
10
|
+
// 🆕 Caminho do arquivo de logs compartilhado entre workers
|
|
11
|
+
const SHARED_LOGS_PATH = resolve(process.cwd(), '.rbqa', 'captured-logs.json');
|
|
12
|
+
/**
|
|
13
|
+
* 📊 Sistema de captura de logs do terminal
|
|
14
|
+
* 🔧 NOTA: Cada worker do Playwright tem sua própria instância em memória,
|
|
15
|
+
* mas os logs são persistidos em arquivo para compartilhamento.
|
|
16
|
+
*/
|
|
17
|
+
export class TerminalLogCapture {
|
|
18
|
+
static isActive = false;
|
|
19
|
+
static logs = [];
|
|
20
|
+
static logsByTest = new Map();
|
|
21
|
+
static currentTestName = null;
|
|
22
|
+
static currentCTName = null; // 🆕 Nome do CT atual
|
|
23
|
+
static workerId = TerminalLogCapture.generateWorkerId(); // 🆕 ID único do worker
|
|
24
|
+
static globalLogIndex = 0; // 🆕 Contador global de logs
|
|
25
|
+
static logListeners = new Map();
|
|
26
|
+
// Guardar funções originais do console
|
|
27
|
+
static originalConsole = {
|
|
28
|
+
log: console.log,
|
|
29
|
+
info: console.info,
|
|
30
|
+
warn: console.warn,
|
|
31
|
+
error: console.error,
|
|
32
|
+
debug: console.debug,
|
|
33
|
+
};
|
|
34
|
+
// Flag para evitar recursão infinita
|
|
35
|
+
static isCapturing = false;
|
|
36
|
+
/**
|
|
37
|
+
* 🆕 Gera um ID único para este worker
|
|
38
|
+
*/
|
|
39
|
+
static generateWorkerId() {
|
|
40
|
+
// Tentar usar variáveis de ambiente padrão do Playwright
|
|
41
|
+
const workerIndex = process.env.TEST_WORKER_INDEX || process.env.PLAYWRIGHT_TEST_WORKER_INDEX;
|
|
42
|
+
if (workerIndex !== undefined) {
|
|
43
|
+
return `worker-${workerIndex}`;
|
|
44
|
+
}
|
|
45
|
+
// Fallback: gerar ID baseado em timestamp + random
|
|
46
|
+
return `worker-${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 7)}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 🚀 Inicia captura de logs
|
|
50
|
+
*/
|
|
51
|
+
static start() {
|
|
52
|
+
if (TerminalLogCapture.isActive) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
TerminalLogCapture.isActive = true;
|
|
56
|
+
TerminalLogCapture.logs = [];
|
|
57
|
+
TerminalLogCapture.logsByTest.clear();
|
|
58
|
+
// 🆕 Sincronizar índice global com arquivo existente
|
|
59
|
+
TerminalLogCapture.syncGlobalIndex();
|
|
60
|
+
globalThis.TerminalLogCapture = TerminalLogCapture;
|
|
61
|
+
// Interceptar console.log
|
|
62
|
+
console.log = (...args) => {
|
|
63
|
+
TerminalLogCapture.captureLog('log', args);
|
|
64
|
+
TerminalLogCapture.originalConsole.log.apply(console, args);
|
|
65
|
+
};
|
|
66
|
+
// Interceptar console.info
|
|
67
|
+
console.info = (...args) => {
|
|
68
|
+
TerminalLogCapture.captureLog('info', args);
|
|
69
|
+
TerminalLogCapture.originalConsole.info.apply(console, args);
|
|
70
|
+
};
|
|
71
|
+
// Interceptar console.warn
|
|
72
|
+
console.warn = (...args) => {
|
|
73
|
+
TerminalLogCapture.captureLog('warn', args);
|
|
74
|
+
TerminalLogCapture.originalConsole.warn.apply(console, args);
|
|
75
|
+
};
|
|
76
|
+
// Interceptar console.error
|
|
77
|
+
console.error = (...args) => {
|
|
78
|
+
TerminalLogCapture.captureLog('error', args);
|
|
79
|
+
TerminalLogCapture.originalConsole.error.apply(console, args);
|
|
80
|
+
};
|
|
81
|
+
// Interceptar console.debug
|
|
82
|
+
console.debug = (...args) => {
|
|
83
|
+
TerminalLogCapture.captureLog('debug', args);
|
|
84
|
+
TerminalLogCapture.originalConsole.debug.apply(console, args);
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 🔄 Sincroniza índice global com arquivo existente
|
|
89
|
+
*/
|
|
90
|
+
static syncGlobalIndex() {
|
|
91
|
+
try {
|
|
92
|
+
if (existsSync(SHARED_LOGS_PATH)) {
|
|
93
|
+
const data = JSON.parse(readFileSync(SHARED_LOGS_PATH, 'utf8'));
|
|
94
|
+
TerminalLogCapture.globalLogIndex = data.globalIndex || 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Se erro, começar do zero
|
|
99
|
+
TerminalLogCapture.globalLogIndex = 0;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 📝 Captura um log
|
|
104
|
+
* 🔧 ATUALIZADO: Persiste logs em arquivo JSON compartilhado entre workers
|
|
105
|
+
*/
|
|
106
|
+
static captureLog(level, args) {
|
|
107
|
+
// Evitar recursão infinita
|
|
108
|
+
if (TerminalLogCapture.isCapturing) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
TerminalLogCapture.isCapturing = true;
|
|
112
|
+
try {
|
|
113
|
+
// Converter argumentos em string
|
|
114
|
+
const message = args
|
|
115
|
+
.map((arg) => {
|
|
116
|
+
if (typeof arg === 'string')
|
|
117
|
+
return arg;
|
|
118
|
+
if (typeof arg === 'object') {
|
|
119
|
+
try {
|
|
120
|
+
return JSON.stringify(arg, null, 2);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return String(arg);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return String(arg);
|
|
127
|
+
})
|
|
128
|
+
.join(' ');
|
|
129
|
+
// Capturar stack trace para logs de erro
|
|
130
|
+
let stackTrace;
|
|
131
|
+
if (level === 'error') {
|
|
132
|
+
try {
|
|
133
|
+
const stack = new Error().stack;
|
|
134
|
+
if (stack) {
|
|
135
|
+
stackTrace = stack.split('\n').slice(2).join('\n');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Ignorar erro ao capturar stack
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// 🆕 Incrementar índice global
|
|
143
|
+
TerminalLogCapture.globalLogIndex++;
|
|
144
|
+
const capturedLog = {
|
|
145
|
+
timestamp: new Date().toISOString(),
|
|
146
|
+
level,
|
|
147
|
+
message,
|
|
148
|
+
testName: TerminalLogCapture.currentTestName || undefined,
|
|
149
|
+
ctName: TerminalLogCapture.currentCTName || undefined, // 🆕 CT atual
|
|
150
|
+
workerId: TerminalLogCapture.workerId, // 🆕 ID do worker
|
|
151
|
+
stackTrace,
|
|
152
|
+
index: TerminalLogCapture.globalLogIndex, // 🆕 Índice global
|
|
153
|
+
};
|
|
154
|
+
// Adicionar ao array geral
|
|
155
|
+
TerminalLogCapture.logs.push(capturedLog);
|
|
156
|
+
// Adicionar ao array do teste atual (se houver)
|
|
157
|
+
if (TerminalLogCapture.currentTestName) {
|
|
158
|
+
if (!TerminalLogCapture.logsByTest.has(TerminalLogCapture.currentTestName)) {
|
|
159
|
+
TerminalLogCapture.logsByTest.set(TerminalLogCapture.currentTestName, []);
|
|
160
|
+
}
|
|
161
|
+
TerminalLogCapture.logsByTest
|
|
162
|
+
.get(TerminalLogCapture.currentTestName)
|
|
163
|
+
.push(capturedLog);
|
|
164
|
+
}
|
|
165
|
+
// 🆕 SEMPRE persistir em arquivo JSON compartilhado (essencial para multi-worker)
|
|
166
|
+
TerminalLogCapture.persistLogToSharedFile(capturedLog);
|
|
167
|
+
// Notificar listeners em tempo real
|
|
168
|
+
TerminalLogCapture.notifyListeners(capturedLog);
|
|
169
|
+
// Salvar em arquivo em tempo real (opcional - log de texto)
|
|
170
|
+
if (process.env.SAVE_LOGS_REALTIME === 'true') {
|
|
171
|
+
TerminalLogCapture.appendToLogFile(capturedLog);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
TerminalLogCapture.isCapturing = false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 🆕 Persiste log no arquivo JSON compartilhado entre workers
|
|
180
|
+
*/
|
|
181
|
+
static persistLogToSharedFile(log) {
|
|
182
|
+
try {
|
|
183
|
+
const dir = resolve(process.cwd(), '.rbqa');
|
|
184
|
+
if (!existsSync(dir)) {
|
|
185
|
+
mkdirSync(dir, { recursive: true });
|
|
186
|
+
}
|
|
187
|
+
// 🆕 Usar arquivo específico do worker para evitar race conditions
|
|
188
|
+
const workerId = TerminalLogCapture.getWorkerId();
|
|
189
|
+
const workerLogPath = resolve(dir, `captured-logs-${workerId}.json`);
|
|
190
|
+
// Ler logs existentes DESTE WORKER
|
|
191
|
+
let existingData = { globalIndex: 0, logs: [] };
|
|
192
|
+
if (existsSync(workerLogPath)) {
|
|
193
|
+
try {
|
|
194
|
+
existingData = JSON.parse(readFileSync(workerLogPath, 'utf8'));
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Se arquivo corrompido, criar novo
|
|
198
|
+
existingData = { globalIndex: 0, logs: [] };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Adicionar novo log
|
|
202
|
+
existingData.logs.push(log);
|
|
203
|
+
existingData.globalIndex = log.index || existingData.globalIndex + 1;
|
|
204
|
+
// Salvar arquivo (com retry para evitar conflitos entre workers)
|
|
205
|
+
TerminalLogCapture.writeWithRetry(workerLogPath, JSON.stringify(existingData, null, 2));
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Silenciosamente ignorar erros de persistência
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 🆕 Escreve arquivo com retry para evitar conflitos
|
|
213
|
+
*/
|
|
214
|
+
static writeWithRetry(filePath, content, maxRetries = 3) {
|
|
215
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
216
|
+
try {
|
|
217
|
+
writeFileSync(filePath, content, 'utf8');
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
if (i === maxRetries - 1)
|
|
222
|
+
throw new Error('Failed to write after retries');
|
|
223
|
+
// Esperar um pouco antes de tentar novamente
|
|
224
|
+
const waitTime = Math.random() * 50 + 10;
|
|
225
|
+
const start = Date.now();
|
|
226
|
+
while (Date.now() - start < waitTime) { /* busy wait */ }
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 🆕 Obtém todos os logs do arquivo compartilhado (para uso cross-worker)
|
|
232
|
+
*/
|
|
233
|
+
static getSharedLogs() {
|
|
234
|
+
try {
|
|
235
|
+
const dir = resolve(process.cwd(), '.rbqa');
|
|
236
|
+
if (!existsSync(dir))
|
|
237
|
+
return [];
|
|
238
|
+
// 🆕 Ler de TODOS os arquivos de logs (worker-specific)
|
|
239
|
+
// Usar require('fs') dinâmico para garantir acesso ao readdirSync
|
|
240
|
+
const fs = require('fs');
|
|
241
|
+
const files = fs.readdirSync(dir).filter((f) => f.startsWith('captured-logs-') && f.endsWith('.json'));
|
|
242
|
+
let allLogs = [];
|
|
243
|
+
for (const file of files) {
|
|
244
|
+
try {
|
|
245
|
+
const content = readFileSync(resolve(dir, file), 'utf8');
|
|
246
|
+
const data = JSON.parse(content);
|
|
247
|
+
if (Array.isArray(data.logs)) {
|
|
248
|
+
allLogs = allLogs.concat(data.logs);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Ignore
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Ordenar por timestamp pois índices são locais por worker
|
|
256
|
+
return allLogs.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// Se erro, retornar vazio
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 🆕 Obtém índice global atual do arquivo compartilhado
|
|
265
|
+
*/
|
|
266
|
+
static getSharedGlobalIndex() {
|
|
267
|
+
try {
|
|
268
|
+
if (existsSync(SHARED_LOGS_PATH)) {
|
|
269
|
+
const data = JSON.parse(readFileSync(SHARED_LOGS_PATH, 'utf8'));
|
|
270
|
+
return data.globalIndex || 0;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// Se erro, retornar 0
|
|
275
|
+
}
|
|
276
|
+
return 0;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* 🆕 Obtém o índice global atual em memória (sem acessar arquivo)
|
|
280
|
+
*/
|
|
281
|
+
static getCurrentGlobalIndex() {
|
|
282
|
+
return TerminalLogCapture.globalLogIndex;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* 🆕 Registra listener para receber logs em tempo real (usado pelos CTs)
|
|
286
|
+
*/
|
|
287
|
+
static addListener(id, listener) {
|
|
288
|
+
TerminalLogCapture.logListeners.set(id, listener);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* 🆕 Remove listener registrado
|
|
292
|
+
*/
|
|
293
|
+
static removeListener(id) {
|
|
294
|
+
TerminalLogCapture.logListeners.delete(id);
|
|
295
|
+
}
|
|
296
|
+
static notifyListeners(log) {
|
|
297
|
+
if (TerminalLogCapture.logListeners.size === 0) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
for (const listener of TerminalLogCapture.logListeners.values()) {
|
|
301
|
+
try {
|
|
302
|
+
listener(log);
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
// Ignorar erros de listeners para não quebrar captura principal
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* 🆕 Limpa arquivo de logs compartilhado (usar no início de nova execução)
|
|
311
|
+
*/
|
|
312
|
+
static clearSharedLogs() {
|
|
313
|
+
try {
|
|
314
|
+
if (existsSync(SHARED_LOGS_PATH)) {
|
|
315
|
+
writeFileSync(SHARED_LOGS_PATH, JSON.stringify({ globalIndex: 0, logs: [] }, null, 2), 'utf8');
|
|
316
|
+
}
|
|
317
|
+
TerminalLogCapture.globalLogIndex = 0;
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
// Silenciosamente ignorar
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* 🔄 Define o teste atual
|
|
325
|
+
*/
|
|
326
|
+
static setCurrentTest(testName) {
|
|
327
|
+
TerminalLogCapture.currentTestName = testName;
|
|
328
|
+
if (!TerminalLogCapture.logsByTest.has(testName)) {
|
|
329
|
+
TerminalLogCapture.logsByTest.set(testName, []);
|
|
330
|
+
// ✅ USAR CONSOLE NORMAL para aparecer nos logs
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
const existingLogs = TerminalLogCapture.logsByTest.get(testName).length;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* 🏁 Limpa o teste atual
|
|
338
|
+
*/
|
|
339
|
+
static clearCurrentTest() {
|
|
340
|
+
TerminalLogCapture.currentTestName = null;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* 🆕 Define o CT atual (para filtros mais precisos)
|
|
344
|
+
*/
|
|
345
|
+
static setCurrentCT(ctName) {
|
|
346
|
+
TerminalLogCapture.currentCTName = ctName;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* 🆕 Limpa o CT atual
|
|
350
|
+
*/
|
|
351
|
+
static clearCurrentCT() {
|
|
352
|
+
TerminalLogCapture.currentCTName = null;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* 🆕 Obtém o worker ID atual
|
|
356
|
+
*/
|
|
357
|
+
static getWorkerId() {
|
|
358
|
+
return TerminalLogCapture.workerId;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* 🆕 Obtém logs filtrados por CT name (funciona em single e multi-worker)
|
|
362
|
+
*/
|
|
363
|
+
static getLogsForCT(ctName, testName) {
|
|
364
|
+
// 1. Primeiro tentar da memória local (single-worker ou mesmo worker)
|
|
365
|
+
let logs = TerminalLogCapture.logs.filter(log => {
|
|
366
|
+
const matchCT = log.ctName === ctName || log.message.includes(ctName);
|
|
367
|
+
const matchTest = !testName || log.testName === testName || log.message.includes(testName);
|
|
368
|
+
return matchCT && matchTest;
|
|
369
|
+
});
|
|
370
|
+
// 2. Se não encontrou, tentar do arquivo compartilhado (multi-worker)
|
|
371
|
+
if (logs.length === 0) {
|
|
372
|
+
const sharedLogs = TerminalLogCapture.getSharedLogs();
|
|
373
|
+
logs = sharedLogs.filter(log => {
|
|
374
|
+
const matchCT = log.ctName === ctName || log.message.includes(ctName);
|
|
375
|
+
const matchTest = !testName || log.testName === testName || log.message.includes(testName);
|
|
376
|
+
return matchCT && matchTest;
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
// 3. Ordenar por índice global
|
|
380
|
+
return logs.sort((a, b) => (a.index || 0) - (b.index || 0));
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* 🆕 Obtém todos os logs combinando memória e arquivo compartilhado (para multi-worker)
|
|
384
|
+
*/
|
|
385
|
+
static getAllLogsCombined() {
|
|
386
|
+
// Combinar logs da memória com logs do arquivo compartilhado
|
|
387
|
+
const memoryLogs = TerminalLogCapture.logs;
|
|
388
|
+
const sharedLogs = TerminalLogCapture.getSharedLogs();
|
|
389
|
+
// Usar Map para deduplicar por índice
|
|
390
|
+
const logsMap = new Map();
|
|
391
|
+
for (const log of sharedLogs) {
|
|
392
|
+
if (log.index) {
|
|
393
|
+
logsMap.set(log.index, log);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// Logs da memória têm prioridade (mais recentes)
|
|
397
|
+
for (const log of memoryLogs) {
|
|
398
|
+
if (log.index) {
|
|
399
|
+
logsMap.set(log.index, log);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
// Retornar ordenado por índice
|
|
403
|
+
return Array.from(logsMap.values()).sort((a, b) => (a.index || 0) - (b.index || 0));
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* 🆕 Obtém logs por range de índice (funciona em single e multi-worker)
|
|
407
|
+
*/
|
|
408
|
+
static getLogsByIndexRange(startIndex, endIndex) {
|
|
409
|
+
// Combinar todas as fontes
|
|
410
|
+
const allLogs = TerminalLogCapture.getAllLogsCombined();
|
|
411
|
+
return allLogs.filter(log => {
|
|
412
|
+
const logIndex = log.index || 0;
|
|
413
|
+
if (endIndex !== undefined) {
|
|
414
|
+
return logIndex >= startIndex && logIndex <= endIndex;
|
|
415
|
+
}
|
|
416
|
+
return logIndex >= startIndex;
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* 📊 Retorna todos os logs capturados
|
|
421
|
+
*/
|
|
422
|
+
static getAllLogs() {
|
|
423
|
+
return [...TerminalLogCapture.logs];
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* 📋 Retorna logs de um teste específico
|
|
427
|
+
*/
|
|
428
|
+
static getLogsForTest(testName) {
|
|
429
|
+
return TerminalLogCapture.logsByTest.get(testName) || [];
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* 📊 Retorna todos os logs organizados por teste
|
|
433
|
+
*/
|
|
434
|
+
static getLogsByTest() {
|
|
435
|
+
return new Map(TerminalLogCapture.logsByTest);
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* 💾 Salva logs em arquivo JSON
|
|
439
|
+
*/
|
|
440
|
+
static saveToFile(outputPath = './test-results/terminal-logs.json') {
|
|
441
|
+
try {
|
|
442
|
+
const dir = outputPath.substring(0, outputPath.lastIndexOf('/'));
|
|
443
|
+
if (!existsSync(dir)) {
|
|
444
|
+
mkdirSync(dir, { recursive: true });
|
|
445
|
+
}
|
|
446
|
+
const data = {
|
|
447
|
+
captureStarted: TerminalLogCapture.logs[0]?.timestamp || new Date().toISOString(),
|
|
448
|
+
captureEnded: new Date().toISOString(),
|
|
449
|
+
totalLogs: TerminalLogCapture.logs.length,
|
|
450
|
+
logsByTest: Object.fromEntries(Array.from(TerminalLogCapture.logsByTest.entries()).map(([testName, logs]) => [
|
|
451
|
+
testName,
|
|
452
|
+
{
|
|
453
|
+
count: logs.length,
|
|
454
|
+
logs,
|
|
455
|
+
},
|
|
456
|
+
])),
|
|
457
|
+
allLogs: TerminalLogCapture.logs,
|
|
458
|
+
};
|
|
459
|
+
writeFileSync(outputPath, JSON.stringify(data, null, 2), 'utf8');
|
|
460
|
+
TerminalLogCapture.originalConsole.info(`✅ Logs salvos em: ${outputPath}`);
|
|
461
|
+
}
|
|
462
|
+
catch (error) {
|
|
463
|
+
TerminalLogCapture.originalConsole.error(`❌ Erro ao salvar logs: ${error}`);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* 📝 Adiciona log em arquivo em tempo real
|
|
468
|
+
*/
|
|
469
|
+
static appendToLogFile(log) {
|
|
470
|
+
try {
|
|
471
|
+
const logPath = './test-results/terminal-logs-realtime.log';
|
|
472
|
+
const dir = logPath.substring(0, logPath.lastIndexOf('/'));
|
|
473
|
+
if (!existsSync(dir)) {
|
|
474
|
+
mkdirSync(dir, { recursive: true });
|
|
475
|
+
}
|
|
476
|
+
const logLine = `[${log.timestamp}] [${log.level.toUpperCase()}]${log.testName ? ` [${log.testName}]` : ''} ${log.message}\n`;
|
|
477
|
+
appendFileSync(logPath, logLine, 'utf8');
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
// Ignorar erro silenciosamente
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* 🛑 Para captura e restaura console original
|
|
485
|
+
*/
|
|
486
|
+
static stop() {
|
|
487
|
+
if (!TerminalLogCapture.isActive) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
console.log = TerminalLogCapture.originalConsole.log;
|
|
491
|
+
console.info = TerminalLogCapture.originalConsole.info;
|
|
492
|
+
console.warn = TerminalLogCapture.originalConsole.warn;
|
|
493
|
+
console.error = TerminalLogCapture.originalConsole.error;
|
|
494
|
+
console.debug = TerminalLogCapture.originalConsole.debug;
|
|
495
|
+
TerminalLogCapture.isActive = false;
|
|
496
|
+
// Salvar logs finais
|
|
497
|
+
TerminalLogCapture.saveToFile();
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* 🧹 Limpa todos os logs
|
|
501
|
+
*/
|
|
502
|
+
static clear() {
|
|
503
|
+
TerminalLogCapture.logs = [];
|
|
504
|
+
TerminalLogCapture.logsByTest.clear();
|
|
505
|
+
TerminalLogCapture.currentTestName = null;
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* 📊 Estatísticas de logs
|
|
509
|
+
*/
|
|
510
|
+
static getStats() {
|
|
511
|
+
const stats = {
|
|
512
|
+
totalLogs: TerminalLogCapture.logs.length,
|
|
513
|
+
byLevel: {
|
|
514
|
+
log: 0,
|
|
515
|
+
info: 0,
|
|
516
|
+
warn: 0,
|
|
517
|
+
error: 0,
|
|
518
|
+
debug: 0,
|
|
519
|
+
},
|
|
520
|
+
byTest: {},
|
|
521
|
+
testsWithLogs: TerminalLogCapture.logsByTest.size,
|
|
522
|
+
};
|
|
523
|
+
for (const log of TerminalLogCapture.logs) {
|
|
524
|
+
stats.byLevel[log.level]++;
|
|
525
|
+
if (log.testName) {
|
|
526
|
+
stats.byTest[log.testName] = (stats.byTest[log.testName] || 0) + 1;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return stats;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔧 TestMethodLogger - Helper para logs visuais organizados
|
|
3
|
+
*
|
|
4
|
+
* Facilita a criação de logs com separação visual clara entre métodos
|
|
5
|
+
* para melhor debugging e acompanhamento de execução de testes.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TestMethodLogger {
|
|
8
|
+
/**
|
|
9
|
+
* 🚀 Executa um método com logs automáticos de início/fim
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* await TestMethodLogger.run('getTokenSFA', 'StatementsTokenSFA', async () => {
|
|
13
|
+
* return await new StatementsTokenSFA().getTokenSFA("mve.svc", "yUqFQ3Hkwx9Gd8-U");
|
|
14
|
+
* }, ["mve.svc", "yUqFQ3Hkwx9Gd8-U"]);
|
|
15
|
+
*/
|
|
16
|
+
static run<T>(methodName: string, className: string, method: () => Promise<T> | T, params?: any[]): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* 📋 Log simples de início de método (sem wrapper)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* TestMethodLogger.start('getTokenSFA', 'StatementsTokenSFA', ["mve.svc", "yUqFQ3Hkwx9Gd8-U"]);
|
|
22
|
+
*/
|
|
23
|
+
static start(methodName: string, className: string, params?: any[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* ✅ Log de fim de método (sem wrapper)
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* TestMethodLogger.end('getTokenSFA', 'StatementsTokenSFA', true, 1500);
|
|
29
|
+
*/
|
|
30
|
+
static end(methodName: string, className: string, success?: boolean, duration?: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* 🎯 Separador de seção para grupos de métodos relacionados
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* TestMethodLogger.section('CRIAÇÃO DE MASSA SFA');
|
|
36
|
+
*/
|
|
37
|
+
static section(sectionName: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* 📖 Log simples para método sem timing
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* TestMethodLogger.log('validarCNPJ', 'StatementsValidarCNPJ');
|
|
43
|
+
*/
|
|
44
|
+
static log(methodName: string, className: string): void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 🎨 Decorator para métodos (TypeScript Experimental)
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* class StatementsTokenSFA {
|
|
51
|
+
* @logMethod('StatementsTokenSFA')
|
|
52
|
+
* async getTokenSFA(service: string, token: string) {
|
|
53
|
+
* // sua implementação aqui
|
|
54
|
+
* }
|
|
55
|
+
* }
|
|
56
|
+
*/
|
|
57
|
+
export declare function logMethod(className: string): (target: any, propertyName: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
58
|
+
/**
|
|
59
|
+
* 🚀 Helper para executar uma sequência de métodos com logs organizados
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* await TestMethodSequence.execute('GERAÇÃO MASSA SFA', [
|
|
63
|
+
* ['getTokenSFA', 'StatementsTokenSFA', () => new StatementsTokenSFA().getTokenSFA("mve.svc", "yUqFQ3Hkwx9Gd8-U")],
|
|
64
|
+
* ['geroOuReceboCNPJ', 'StatementsValidarCNPJ', () => new StatementsValidarCNPJ().geroOuReceboCNPJ()],
|
|
65
|
+
* ['criacaoCliente', 'StatementsCriarCliente', () => new StatementsCriarCliente().criacaoCliente("Criação de Cliente FTTH", "MPJ00081891", "a0081891")]
|
|
66
|
+
* ]);
|
|
67
|
+
*/
|
|
68
|
+
export declare class TestMethodSequence {
|
|
69
|
+
static execute(sectionName: string, methods: Array<[string, string, () => Promise<any> | any, any[]?]>): Promise<void>;
|
|
70
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔧 TestMethodLogger - Helper para logs visuais organizados
|
|
3
|
+
*
|
|
4
|
+
* Facilita a criação de logs com separação visual clara entre métodos
|
|
5
|
+
* para melhor debugging e acompanhamento de execução de testes.
|
|
6
|
+
*/
|
|
7
|
+
import { ConfigLogger } from './ConfigLogger.js';
|
|
8
|
+
export class TestMethodLogger {
|
|
9
|
+
/**
|
|
10
|
+
* 🚀 Executa um método com logs automáticos de início/fim
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* await TestMethodLogger.run('getTokenSFA', 'StatementsTokenSFA', async () => {
|
|
14
|
+
* return await new StatementsTokenSFA().getTokenSFA("mve.svc", "yUqFQ3Hkwx9Gd8-U");
|
|
15
|
+
* }, ["mve.svc", "yUqFQ3Hkwx9Gd8-U"]);
|
|
16
|
+
*/
|
|
17
|
+
static async run(methodName, className, method, params) {
|
|
18
|
+
return await ConfigLogger.executeWithLogs(methodName, className, method, params);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 📋 Log simples de início de método (sem wrapper)
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* TestMethodLogger.start('getTokenSFA', 'StatementsTokenSFA', ["mve.svc", "yUqFQ3Hkwx9Gd8-U"]);
|
|
25
|
+
*/
|
|
26
|
+
static start(methodName, className, params) {
|
|
27
|
+
ConfigLogger.methodStart(methodName, className, params);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* ✅ Log de fim de método (sem wrapper)
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* TestMethodLogger.end('getTokenSFA', 'StatementsTokenSFA', true, 1500);
|
|
34
|
+
*/
|
|
35
|
+
static end(methodName, className, success = true, duration) {
|
|
36
|
+
ConfigLogger.methodEnd(methodName, className, success, duration);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 🎯 Separador de seção para grupos de métodos relacionados
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* TestMethodLogger.section('CRIAÇÃO DE MASSA SFA');
|
|
43
|
+
*/
|
|
44
|
+
static section(sectionName) {
|
|
45
|
+
ConfigLogger.sectionSeparator(sectionName);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 📖 Log simples para método sem timing
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* TestMethodLogger.log('validarCNPJ', 'StatementsValidarCNPJ');
|
|
52
|
+
*/
|
|
53
|
+
static log(methodName, className) {
|
|
54
|
+
ConfigLogger.methodLog(methodName, className);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 🎨 Decorator para métodos (TypeScript Experimental)
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* class StatementsTokenSFA {
|
|
62
|
+
* @logMethod('StatementsTokenSFA')
|
|
63
|
+
* async getTokenSFA(service: string, token: string) {
|
|
64
|
+
* // sua implementação aqui
|
|
65
|
+
* }
|
|
66
|
+
* }
|
|
67
|
+
*/
|
|
68
|
+
export function logMethod(className) {
|
|
69
|
+
return (target, propertyName, descriptor) => {
|
|
70
|
+
const method = descriptor.value;
|
|
71
|
+
descriptor.value = async function (...args) {
|
|
72
|
+
return await TestMethodLogger.run(propertyName, className, () => method.apply(this, args), args);
|
|
73
|
+
};
|
|
74
|
+
return descriptor;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 🚀 Helper para executar uma sequência de métodos com logs organizados
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* await TestMethodSequence.execute('GERAÇÃO MASSA SFA', [
|
|
82
|
+
* ['getTokenSFA', 'StatementsTokenSFA', () => new StatementsTokenSFA().getTokenSFA("mve.svc", "yUqFQ3Hkwx9Gd8-U")],
|
|
83
|
+
* ['geroOuReceboCNPJ', 'StatementsValidarCNPJ', () => new StatementsValidarCNPJ().geroOuReceboCNPJ()],
|
|
84
|
+
* ['criacaoCliente', 'StatementsCriarCliente', () => new StatementsCriarCliente().criacaoCliente("Criação de Cliente FTTH", "MPJ00081891", "a0081891")]
|
|
85
|
+
* ]);
|
|
86
|
+
*/
|
|
87
|
+
export class TestMethodSequence {
|
|
88
|
+
static async execute(sectionName, methods) {
|
|
89
|
+
TestMethodLogger.section(sectionName);
|
|
90
|
+
for (const [methodName, className, method, params] of methods) {
|
|
91
|
+
await TestMethodLogger.run(methodName, className, method, params);
|
|
92
|
+
}
|
|
93
|
+
ConfigLogger.success(`✅ Seção ${sectionName} concluída com sucesso!`);
|
|
94
|
+
}
|
|
95
|
+
}
|