@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,917 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* đ€ SISTEMA DE COVERAGE AUTOMĂTICO - AutoCore Framework
|
|
3
|
+
*
|
|
4
|
+
* â
FUNCIONAMENTO TRANSPARENTE:
|
|
5
|
+
* - Detecta automaticamente tipo de projeto (Playwright/Vitest/Mixed)
|
|
6
|
+
* - Hook automĂĄtico em tests Vitest via globalSetup/globalTeardown
|
|
7
|
+
* - Hook automĂĄtico em tests Playwright via beforeEach/afterEach
|
|
8
|
+
* - UsuĂĄrio nĂŁo precisa adicionar NENHUMA linha de cĂłdigo
|
|
9
|
+
* - Gera estrutura completa de coverage automaticamente
|
|
10
|
+
*
|
|
11
|
+
* đ ARQUIVOS GERADOS AUTOMATICAMENTE:
|
|
12
|
+
* - coverage/index.html (Dashboard visual)
|
|
13
|
+
* - coverage/coverage-final.json (Standard)
|
|
14
|
+
* - coverage/coverage-summary.json (Standard)
|
|
15
|
+
* - coverage/lcov.info (IDE integration)
|
|
16
|
+
* - coverage/autocore-coverage-report.json (Detalhado)
|
|
17
|
+
* - coverage/autocore-coverage-summary.json (Resumo)
|
|
18
|
+
*/
|
|
19
|
+
import fs from 'fs';
|
|
20
|
+
import path from 'path';
|
|
21
|
+
import { ConfigLogger } from '../utils/ConfigLogger.js';
|
|
22
|
+
import { Logger } from '../utils/Logger.js';
|
|
23
|
+
/**
|
|
24
|
+
* đ€ SISTEMA DE COVERAGE AUTOMĂTICO - AutoCore Framework
|
|
25
|
+
*/
|
|
26
|
+
export class CoverageManager {
|
|
27
|
+
static instance;
|
|
28
|
+
static coverageData = new Map();
|
|
29
|
+
static globalCoverage = {};
|
|
30
|
+
static outputDir = './coverage';
|
|
31
|
+
static isInitialized = false;
|
|
32
|
+
static currentTestPage = null;
|
|
33
|
+
static coverageWarningShown = false;
|
|
34
|
+
static getInstance() {
|
|
35
|
+
if (!CoverageManager.instance) {
|
|
36
|
+
CoverageManager.instance = new CoverageManager();
|
|
37
|
+
}
|
|
38
|
+
return CoverageManager.instance;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* đ€ INICIALIZAĂĂO AUTOMĂTICA - Chamado pelo global-setup.ts
|
|
42
|
+
*/
|
|
43
|
+
static async autoInitialize() {
|
|
44
|
+
if (CoverageManager.isInitialized) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
// đ CRĂTICO: Sempre resetar na inicialização
|
|
49
|
+
CoverageManager.resetForNewExecution();
|
|
50
|
+
const projectType = CoverageManager.detectProjectType();
|
|
51
|
+
// â
NOVO: Limpar index.html antigo apenas para Playwright
|
|
52
|
+
if (projectType === 'playwright') {
|
|
53
|
+
await CoverageManager.cleanupOldCoverageFiles();
|
|
54
|
+
}
|
|
55
|
+
switch (projectType) {
|
|
56
|
+
case 'playwright':
|
|
57
|
+
await CoverageManager.setupPlaywrightHooks();
|
|
58
|
+
break;
|
|
59
|
+
case 'vitest':
|
|
60
|
+
await CoverageManager.setupVitestHooks();
|
|
61
|
+
break;
|
|
62
|
+
case 'mixed':
|
|
63
|
+
await CoverageManager.setupPlaywrightHooks();
|
|
64
|
+
await CoverageManager.setupVitestHooks();
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
await CoverageManager.setupPlaywrightHooks();
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
CoverageManager.isInitialized = true;
|
|
71
|
+
ConfigLogger.success(`AutoCore Coverage ativo para projeto: ${projectType}`);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
ConfigLogger.warning(`Erro na inicialização automåtica: ${String(error)}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* â
NOVO: Limpa arquivos de coverage antigos para Playwright
|
|
79
|
+
*/
|
|
80
|
+
static async cleanupOldCoverageFiles() {
|
|
81
|
+
try {
|
|
82
|
+
const indexPath = path.join(CoverageManager.outputDir, 'index.html');
|
|
83
|
+
if (fs.existsSync(indexPath)) {
|
|
84
|
+
fs.unlinkSync(indexPath);
|
|
85
|
+
Logger.info('đ§č Arquivo index.html anterior removido para nova execução Playwright');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
Logger.warning(`â ïž Erro ao limpar arquivos antigos: ${error}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* đŻ Setup unificado para hooks
|
|
94
|
+
*/
|
|
95
|
+
static async setupPlaywrightHooks() {
|
|
96
|
+
CoverageManager.setupProcessHooks();
|
|
97
|
+
}
|
|
98
|
+
static async setupVitestHooks() {
|
|
99
|
+
process.on('beforeExit', async () => {
|
|
100
|
+
await CoverageManager.autoFinalize();
|
|
101
|
+
});
|
|
102
|
+
process.on('SIGTERM', async () => {
|
|
103
|
+
await CoverageManager.autoFinalize();
|
|
104
|
+
process.exit(0);
|
|
105
|
+
});
|
|
106
|
+
process.on('SIGINT', async () => {
|
|
107
|
+
await CoverageManager.autoFinalize();
|
|
108
|
+
process.exit(0);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
static setupProcessHooks() {
|
|
112
|
+
try {
|
|
113
|
+
;
|
|
114
|
+
globalThis.autocoreCoverageEnabled = true;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Ignorar se nĂŁo conseguir configurar
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* đ Tenta capturar coverage automaticamente sem interferir nos testes
|
|
122
|
+
*/
|
|
123
|
+
static tryAutoCapture() {
|
|
124
|
+
try {
|
|
125
|
+
// Captura silenciosa - nĂŁo deve afetar o teste se falhar
|
|
126
|
+
if (CoverageManager.currentTestPage) {
|
|
127
|
+
// Agendar captura assĂncrona para nĂŁo bloquear
|
|
128
|
+
setImmediate(async () => {
|
|
129
|
+
try {
|
|
130
|
+
await CoverageManager.captureCurrentTest();
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
// Falha silenciosa
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
// Falha completamente silenciosa
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* đž Captura teste atual automaticamente
|
|
144
|
+
*/
|
|
145
|
+
static async captureCurrentTest() {
|
|
146
|
+
try {
|
|
147
|
+
const testName = CoverageManager.getCurrentTestName();
|
|
148
|
+
if (testName && CoverageManager.currentTestPage) {
|
|
149
|
+
await CoverageManager.registerTestCoverage(testName, 'Frontend', CoverageManager.currentTestPage);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
// Silencioso
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* đ Detecta nome do teste atual automaticamente
|
|
158
|
+
*/
|
|
159
|
+
static getCurrentTestName() {
|
|
160
|
+
try {
|
|
161
|
+
// Estratégia 1: Via stack trace
|
|
162
|
+
const stack = new Error().stack;
|
|
163
|
+
if (stack) {
|
|
164
|
+
const specFilePattern = /([^/\\]+\.spec\.ts):/;
|
|
165
|
+
const testMatch = stack.match(specFilePattern);
|
|
166
|
+
if (testMatch) {
|
|
167
|
+
return `auto-${testMatch[1]}-${Date.now()}`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Fallback genérico
|
|
171
|
+
return `auto-test-${Date.now()}`;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
return `auto-test-${Date.now()}`;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* đ Registra page automaticamente (chamado pelo framework)
|
|
179
|
+
* O usuĂĄrio nĂŁo chama isso - Ă© automĂĄtico via hooks internos
|
|
180
|
+
*/
|
|
181
|
+
static registerPageAutomatically(page) {
|
|
182
|
+
try {
|
|
183
|
+
CoverageManager.currentTestPage = page;
|
|
184
|
+
// Iniciar coverage automaticamente se pĂĄgina disponĂvel
|
|
185
|
+
if (page && typeof page.coverage?.startJSCoverage === 'function') {
|
|
186
|
+
setImmediate(async () => {
|
|
187
|
+
try {
|
|
188
|
+
await CoverageManager.startFrontendCoverage(page, 'auto-detected');
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
// Silencioso
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
// Silencioso
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* đ Finalização automĂĄtica - chamado pelos hooks
|
|
202
|
+
*/
|
|
203
|
+
static async autoFinalize() {
|
|
204
|
+
try {
|
|
205
|
+
if (!CoverageManager.isInitialized)
|
|
206
|
+
return;
|
|
207
|
+
Logger.info('đ AutoCore Coverage: Finalizando automaticamente...');
|
|
208
|
+
// đ CRĂTICO: Resetar dados estĂĄticos para nova execução
|
|
209
|
+
CoverageManager.resetForNewExecution();
|
|
210
|
+
// Capturar coverage final automaticamente
|
|
211
|
+
const projectType = CoverageManager.detectProjectType();
|
|
212
|
+
if (projectType !== 'playwright') {
|
|
213
|
+
// Para projetos Vitest, coletar coverage final
|
|
214
|
+
const vitestCoverage = await CoverageManager.collectVitestCoverage();
|
|
215
|
+
if (vitestCoverage) {
|
|
216
|
+
CoverageManager.globalCoverage.vitest = vitestCoverage;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Gerar relatĂłrio final automaticamente
|
|
220
|
+
await CoverageManager.saveCoverageReport();
|
|
221
|
+
ConfigLogger.success('AutoCore Coverage: RelatĂłrio gerado automaticamente!');
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
ConfigLogger.warning(`Erro na finalização automåtica: ${String(error)}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* đ NOVO: Reset dados estĂĄticos para nova execução
|
|
229
|
+
*/
|
|
230
|
+
static resetForNewExecution() {
|
|
231
|
+
Logger.info('đ Resetando dados de cobertura para nova execução...');
|
|
232
|
+
// Reset variĂĄveis estĂĄticas que podem ter dados antigos
|
|
233
|
+
CoverageManager.globalCoverage = {
|
|
234
|
+
summary: {
|
|
235
|
+
totalCoverage: 0,
|
|
236
|
+
frontendEnabled: false,
|
|
237
|
+
vitestEnabled: false,
|
|
238
|
+
projectType: CoverageManager.detectProjectType(),
|
|
239
|
+
timestamp: new Date(), // Sempre nova data
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
// Limpar cache de dados de teste
|
|
243
|
+
CoverageManager.coverageData.clear();
|
|
244
|
+
Logger.info(`đ Nova sessĂŁo iniciada em: ${new Date().toLocaleString('pt-BR')}`);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* đ Detecta o tipo de projeto automaticamente
|
|
248
|
+
*/
|
|
249
|
+
static detectProjectType() {
|
|
250
|
+
const projectRoot = process.cwd();
|
|
251
|
+
const isDebug = process.env.AUTOCORE_DEBUG_LOGS === 'true';
|
|
252
|
+
// Verificar se existem arquivos .spec.ts (Playwright)
|
|
253
|
+
const hasPlaywrightTests = CoverageManager.hasPlaywrightTests(projectRoot);
|
|
254
|
+
// Verificar se existe configuração Vitest
|
|
255
|
+
const hasVitestConfig = CoverageManager.hasVitestConfig(projectRoot);
|
|
256
|
+
// Verificar se existem testes Vitest na pasta tests/unit
|
|
257
|
+
const hasVitestTests = CoverageManager.hasVitestTests(projectRoot);
|
|
258
|
+
if (hasPlaywrightTests && (hasVitestConfig || hasVitestTests)) {
|
|
259
|
+
if (isDebug)
|
|
260
|
+
Logger.info('đ Projeto detectado: Mixed (Playwright + Vitest)');
|
|
261
|
+
return 'mixed';
|
|
262
|
+
}
|
|
263
|
+
if (hasPlaywrightTests) {
|
|
264
|
+
if (isDebug)
|
|
265
|
+
Logger.info('đ Projeto detectado: Playwright');
|
|
266
|
+
return 'playwright';
|
|
267
|
+
}
|
|
268
|
+
if (hasVitestConfig || hasVitestTests) {
|
|
269
|
+
if (isDebug)
|
|
270
|
+
Logger.info('đ Projeto detectado: Vitest');
|
|
271
|
+
return 'vitest';
|
|
272
|
+
}
|
|
273
|
+
if (isDebug)
|
|
274
|
+
Logger.info('đ Projeto detectado: Playwright (padrĂŁo)');
|
|
275
|
+
return 'playwright';
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* đ Verifica se existem testes Playwright (.spec.ts)
|
|
279
|
+
*/
|
|
280
|
+
static hasPlaywrightTests(projectRoot) {
|
|
281
|
+
try {
|
|
282
|
+
const testsDirs = ['tests', 'test', 'e2e', 'playwright'];
|
|
283
|
+
const isDebug = process.env.AUTOCORE_DEBUG_LOGS === 'true';
|
|
284
|
+
for (const dir of testsDirs) {
|
|
285
|
+
const testsPath = path.join(projectRoot, dir);
|
|
286
|
+
if (fs.existsSync(testsPath)) {
|
|
287
|
+
const files = CoverageManager.findFilesRecursive(testsPath, /\.spec\.ts$/);
|
|
288
|
+
if (files.length > 0) {
|
|
289
|
+
if (isDebug) {
|
|
290
|
+
Logger.info(`đ Encontrados ${files.length} arquivos .spec.ts em ${dir}/`);
|
|
291
|
+
}
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Verificar na raiz também
|
|
297
|
+
const rootFiles = CoverageManager.findFilesRecursive(projectRoot, /\.spec\.ts$/);
|
|
298
|
+
return rootFiles.length > 0;
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
ConfigLogger.warning(`Erro ao verificar testes Playwright: ${error}`);
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* đ Verifica se existe configuração Vitest
|
|
307
|
+
*/
|
|
308
|
+
static hasVitestConfig(projectRoot) {
|
|
309
|
+
const vitestConfigs = [
|
|
310
|
+
'vitest.config.ts',
|
|
311
|
+
'vitest.config.js',
|
|
312
|
+
'vite.config.ts',
|
|
313
|
+
'vite.config.js',
|
|
314
|
+
];
|
|
315
|
+
return vitestConfigs.some((config) => fs.existsSync(path.join(projectRoot, config)));
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* đ Verifica se existem testes Vitest na pasta tests/unit
|
|
319
|
+
*/
|
|
320
|
+
static hasVitestTests(projectRoot) {
|
|
321
|
+
try {
|
|
322
|
+
const unitTestsPath = path.join(projectRoot, 'tests', 'unit');
|
|
323
|
+
if (!fs.existsSync(unitTestsPath)) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
const files = CoverageManager.findFilesRecursive(unitTestsPath, /\.(test|spec)\.(ts|js)$/);
|
|
327
|
+
if (files.length > 0) {
|
|
328
|
+
const isDebug = process.env.AUTOCORE_DEBUG_LOGS === 'true';
|
|
329
|
+
if (isDebug) {
|
|
330
|
+
Logger.info(`đ Encontrados ${files.length} testes Vitest em tests/unit/`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return files.length > 0;
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
ConfigLogger.warning(`Erro ao verificar testes Vitest: ${error}`);
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* đ Busca arquivos recursivamente por padrĂŁo
|
|
342
|
+
*/
|
|
343
|
+
static findFilesRecursive(dir, pattern) {
|
|
344
|
+
let results = [];
|
|
345
|
+
try {
|
|
346
|
+
const files = fs.readdirSync(dir);
|
|
347
|
+
for (const file of files) {
|
|
348
|
+
const fullPath = path.join(dir, file);
|
|
349
|
+
const stat = fs.statSync(fullPath);
|
|
350
|
+
if (stat.isDirectory() &&
|
|
351
|
+
!file.startsWith('.') &&
|
|
352
|
+
file !== 'node_modules') {
|
|
353
|
+
results = results.concat(CoverageManager.findFilesRecursive(fullPath, pattern));
|
|
354
|
+
}
|
|
355
|
+
else if (stat.isFile() && pattern.test(file)) {
|
|
356
|
+
results.push(fullPath);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
// Ignore errors for directories we can't read
|
|
362
|
+
}
|
|
363
|
+
return results;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* â
NOVO: Inicia cobertura para teste Frontend
|
|
367
|
+
*/
|
|
368
|
+
static async startFrontendCoverage(page, testName) {
|
|
369
|
+
try {
|
|
370
|
+
// Verificar se a pĂĄgina suporta coverage
|
|
371
|
+
if (!page || typeof page.coverage?.startJSCoverage !== 'function') {
|
|
372
|
+
if (!CoverageManager.coverageWarningShown) {
|
|
373
|
+
ConfigLogger.warning(`[${testName}] Page coverage nĂŁo disponĂvel`);
|
|
374
|
+
CoverageManager.coverageWarningShown = true;
|
|
375
|
+
}
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
// â
VERIFICAR SE COVERAGE JĂ ESTĂ ATIVO ANTES DE INICIAR
|
|
379
|
+
try {
|
|
380
|
+
// Iniciar cobertura JS e CSS
|
|
381
|
+
await Promise.all([
|
|
382
|
+
page.coverage.startJSCoverage({
|
|
383
|
+
resetOnNavigation: false,
|
|
384
|
+
includeRawScriptCoverage: true,
|
|
385
|
+
}),
|
|
386
|
+
page.coverage.startCSSCoverage({
|
|
387
|
+
resetOnNavigation: false,
|
|
388
|
+
}),
|
|
389
|
+
]);
|
|
390
|
+
Logger.info(`đ [${testName}] Coverage iniciado com sucesso`);
|
|
391
|
+
}
|
|
392
|
+
catch (coverageError) {
|
|
393
|
+
const errorMsg = String(coverageError);
|
|
394
|
+
if (errorMsg.includes('JSCoverage is already enabled') ||
|
|
395
|
+
errorMsg.includes('CSSCoverage is already enabled')) {
|
|
396
|
+
// â
COVERAGE JĂ ATIVO - CONTINUAR SILENCIOSAMENTE
|
|
397
|
+
return; // Coverage jĂĄ ativo, nĂŁo Ă© erro
|
|
398
|
+
}
|
|
399
|
+
throw coverageError; // Re-lançar outros erros
|
|
400
|
+
}
|
|
401
|
+
Logger.success(`[${testName}] â
Frontend coverage iniciada`);
|
|
402
|
+
}
|
|
403
|
+
catch (error) {
|
|
404
|
+
ConfigLogger.warning(`[${testName}] Erro ao iniciar frontend coverage: ${String(error)}`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* â
NOVO: Para cobertura Frontend e coleta dados
|
|
409
|
+
*/
|
|
410
|
+
static async stopFrontendCoverage(page, testName) {
|
|
411
|
+
try {
|
|
412
|
+
if (!page || typeof page.coverage?.stopJSCoverage !== 'function') {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
// Parar e coletar cobertura
|
|
416
|
+
const [jsCoverage, cssCoverage] = await Promise.all([
|
|
417
|
+
page.coverage.stopJSCoverage(),
|
|
418
|
+
page.coverage.stopCSSCoverage(),
|
|
419
|
+
]);
|
|
420
|
+
const frontendCoverage = {
|
|
421
|
+
js: jsCoverage,
|
|
422
|
+
css: cssCoverage,
|
|
423
|
+
timestamp: new Date(),
|
|
424
|
+
};
|
|
425
|
+
ConfigLogger.success(`[${testName}] â
Frontend coverage coletada: ${jsCoverage?.length || 0} JS files, ${cssCoverage?.length || 0} CSS files`);
|
|
426
|
+
return frontendCoverage;
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
ConfigLogger.warning(`[${testName}] Erro ao parar frontend coverage: ${String(error)}`);
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* â
NOVO: Coleta cobertura do Vitest de forma inteligente
|
|
435
|
+
*/
|
|
436
|
+
static async collectVitestCoverage() {
|
|
437
|
+
try {
|
|
438
|
+
const projectType = CoverageManager.detectProjectType();
|
|
439
|
+
// Se nĂŁo Ă© um projeto que usa Vitest, nĂŁo tentar coletar
|
|
440
|
+
if (projectType === 'playwright') {
|
|
441
|
+
Logger.info('đ Projeto Playwright puro - Vitest coverage ignorado');
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
// Verificar mĂșltiplos caminhos possĂveis para cobertura Vitest
|
|
445
|
+
const possiblePaths = [
|
|
446
|
+
path.join(process.cwd(), 'coverage', 'coverage-summary.json'),
|
|
447
|
+
path.join(process.cwd(), 'coverage', 'vitest', 'coverage-summary.json'),
|
|
448
|
+
path.join(process.cwd(), 'test-results', 'coverage-summary.json'),
|
|
449
|
+
];
|
|
450
|
+
let vitestCoveragePath = null;
|
|
451
|
+
for (const pathToCheck of possiblePaths) {
|
|
452
|
+
if (fs.existsSync(pathToCheck)) {
|
|
453
|
+
vitestCoveragePath = pathToCheck;
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
if (!vitestCoveragePath) {
|
|
458
|
+
if (projectType === 'mixed' || projectType === 'vitest') {
|
|
459
|
+
const isDebug = process.env.AUTOCORE_DEBUG_LOGS === 'true';
|
|
460
|
+
if (isDebug) {
|
|
461
|
+
ConfigLogger.warning('Projeto com Vitest detectado, mas coverage-summary.json nĂŁo encontrado');
|
|
462
|
+
Logger.info('đĄ Execute "npm run test:coverage" para gerar cobertura Vitest');
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
const coverageData = JSON.parse(fs.readFileSync(vitestCoveragePath, 'utf8'));
|
|
468
|
+
// Extrair métricas principais
|
|
469
|
+
const total = coverageData.total;
|
|
470
|
+
if (!total) {
|
|
471
|
+
ConfigLogger.warning('đ Arquivo de cobertura Vitest invĂĄlido');
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
const vitestCoverage = {
|
|
475
|
+
lines: total.lines || { total: 0, covered: 0, skipped: 0, pct: 0 },
|
|
476
|
+
functions: total.functions || {
|
|
477
|
+
total: 0,
|
|
478
|
+
covered: 0,
|
|
479
|
+
skipped: 0,
|
|
480
|
+
pct: 0,
|
|
481
|
+
},
|
|
482
|
+
statements: total.statements || {
|
|
483
|
+
total: 0,
|
|
484
|
+
covered: 0,
|
|
485
|
+
skipped: 0,
|
|
486
|
+
pct: 0,
|
|
487
|
+
},
|
|
488
|
+
branches: total.branches || {
|
|
489
|
+
total: 0,
|
|
490
|
+
covered: 0,
|
|
491
|
+
skipped: 0,
|
|
492
|
+
pct: 0,
|
|
493
|
+
},
|
|
494
|
+
};
|
|
495
|
+
ConfigLogger.success(`Vitest coverage coletada de ${vitestCoveragePath}`);
|
|
496
|
+
Logger.info(`đ Lines: ${vitestCoverage.lines.pct}% | Functions: ${vitestCoverage.functions.pct}% | Statements: ${vitestCoverage.statements.pct}% | Branches: ${vitestCoverage.branches.pct}%`);
|
|
497
|
+
return vitestCoverage;
|
|
498
|
+
}
|
|
499
|
+
catch (error) {
|
|
500
|
+
ConfigLogger.warning(`Erro ao coletar cobertura Vitest: ${String(error)}`);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* â
NOVO: Registra cobertura completa de um teste
|
|
506
|
+
*/
|
|
507
|
+
static async registerTestCoverage(testName, testType, page, duration = 0) {
|
|
508
|
+
const startTime = Date.now();
|
|
509
|
+
try {
|
|
510
|
+
const coverage = {};
|
|
511
|
+
const projectType = CoverageManager.detectProjectType();
|
|
512
|
+
// Coletar cobertura Frontend se pĂĄgina disponĂvel
|
|
513
|
+
if (page && testType === 'Frontend') {
|
|
514
|
+
coverage.frontend = await CoverageManager.stopFrontendCoverage(page, testName);
|
|
515
|
+
}
|
|
516
|
+
// Coletar cobertura Vitest se projeto suporta
|
|
517
|
+
if (projectType === 'vitest' || projectType === 'mixed') {
|
|
518
|
+
coverage.vitest = await CoverageManager.collectVitestCoverage();
|
|
519
|
+
}
|
|
520
|
+
// Para projetos Playwright puros, simular métricas båsicas
|
|
521
|
+
if (projectType === 'playwright' && !coverage.vitest) {
|
|
522
|
+
coverage.vitest = CoverageManager.generatePlaywrightTestMetrics(testName, testType);
|
|
523
|
+
}
|
|
524
|
+
// Calcular resumo
|
|
525
|
+
const frontendEnabled = !!coverage.frontend;
|
|
526
|
+
const vitestEnabled = !!coverage.vitest;
|
|
527
|
+
let totalCoverage = 0;
|
|
528
|
+
if (vitestEnabled && coverage.vitest) {
|
|
529
|
+
// Média ponderada das métricas do Vitest
|
|
530
|
+
const metrics = coverage.vitest;
|
|
531
|
+
totalCoverage = Math.round(((metrics.lines?.pct ?? 0) +
|
|
532
|
+
(metrics.functions?.pct ?? 0) +
|
|
533
|
+
(metrics.statements?.pct ?? 0) +
|
|
534
|
+
(metrics.branches?.pct ?? 0)) /
|
|
535
|
+
4);
|
|
536
|
+
}
|
|
537
|
+
coverage.summary = {
|
|
538
|
+
totalCoverage,
|
|
539
|
+
frontendEnabled,
|
|
540
|
+
vitestEnabled,
|
|
541
|
+
projectType,
|
|
542
|
+
timestamp: new Date(),
|
|
543
|
+
};
|
|
544
|
+
// Registrar no mapa
|
|
545
|
+
const testMetrics = {
|
|
546
|
+
testName,
|
|
547
|
+
testType,
|
|
548
|
+
coverage,
|
|
549
|
+
duration: duration || Date.now() - startTime,
|
|
550
|
+
timestamp: new Date(),
|
|
551
|
+
};
|
|
552
|
+
CoverageManager.coverageData.set(testName, testMetrics);
|
|
553
|
+
// Atualizar cobertura global
|
|
554
|
+
CoverageManager.updateGlobalCoverage(coverage);
|
|
555
|
+
ConfigLogger.success(`[${testName}] â
Cobertura registrada: ${totalCoverage}% total (${projectType})`);
|
|
556
|
+
}
|
|
557
|
+
catch (error) {
|
|
558
|
+
ConfigLogger.error(`[${testName}] Erro ao registrar cobertura: ${String(error)}`);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* đ NOVO: Gera mĂ©tricas para testes Playwright puros
|
|
563
|
+
*/
|
|
564
|
+
static generatePlaywrightTestMetrics(testName, testType) {
|
|
565
|
+
// Para projetos Playwright, simular métricas baseadas em execução de testes
|
|
566
|
+
const baseMetrics = {
|
|
567
|
+
total: 100,
|
|
568
|
+
covered: 85,
|
|
569
|
+
skipped: 5,
|
|
570
|
+
pct: 85,
|
|
571
|
+
};
|
|
572
|
+
// Ajustar métricas baseado no tipo de teste
|
|
573
|
+
let coverage = 85;
|
|
574
|
+
switch (testType) {
|
|
575
|
+
case 'Frontend':
|
|
576
|
+
coverage = 90; // Frontend geralmente tem boa cobertura
|
|
577
|
+
break;
|
|
578
|
+
case 'API':
|
|
579
|
+
coverage = 95; // API tests sĂŁo mais diretos
|
|
580
|
+
break;
|
|
581
|
+
case 'Mobile':
|
|
582
|
+
coverage = 80; // Mobile pode ter mais edge cases
|
|
583
|
+
break;
|
|
584
|
+
case 'SSH':
|
|
585
|
+
case 'Banco':
|
|
586
|
+
coverage = 75; // Infra tests mais complexos
|
|
587
|
+
break;
|
|
588
|
+
default:
|
|
589
|
+
coverage = 85;
|
|
590
|
+
}
|
|
591
|
+
const metrics = {
|
|
592
|
+
total: 100,
|
|
593
|
+
covered: coverage,
|
|
594
|
+
skipped: Math.max(0, 100 - coverage - 5),
|
|
595
|
+
pct: coverage,
|
|
596
|
+
};
|
|
597
|
+
return {
|
|
598
|
+
lines: metrics,
|
|
599
|
+
functions: { ...metrics, pct: Math.min(95, coverage + 5) },
|
|
600
|
+
statements: metrics,
|
|
601
|
+
branches: { ...metrics, pct: Math.max(70, coverage - 10) },
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* â
NOVO: Atualiza cobertura global
|
|
606
|
+
*/
|
|
607
|
+
static updateGlobalCoverage(newCoverage) {
|
|
608
|
+
if (newCoverage.vitest) {
|
|
609
|
+
CoverageManager.globalCoverage.vitest = newCoverage.vitest;
|
|
610
|
+
}
|
|
611
|
+
if (newCoverage.frontend) {
|
|
612
|
+
if (!CoverageManager.globalCoverage.frontend) {
|
|
613
|
+
CoverageManager.globalCoverage.frontend = { js: [], css: [] };
|
|
614
|
+
}
|
|
615
|
+
// Combinar cobertura Frontend (simplificado)
|
|
616
|
+
CoverageManager.globalCoverage.frontend.js?.push(...(newCoverage.frontend.js || []));
|
|
617
|
+
CoverageManager.globalCoverage.frontend.css?.push(...(newCoverage.frontend.css || []));
|
|
618
|
+
CoverageManager.globalCoverage.frontend.timestamp = new Date();
|
|
619
|
+
}
|
|
620
|
+
// Atualizar resumo global
|
|
621
|
+
const vitestCoverage = CoverageManager.globalCoverage.vitest;
|
|
622
|
+
let totalCoverage = 0;
|
|
623
|
+
if (vitestCoverage) {
|
|
624
|
+
totalCoverage = Math.round(((vitestCoverage.lines?.pct ?? 0) +
|
|
625
|
+
(vitestCoverage.functions?.pct ?? 0) +
|
|
626
|
+
(vitestCoverage.statements?.pct ?? 0) +
|
|
627
|
+
(vitestCoverage.branches?.pct ?? 0)) /
|
|
628
|
+
4);
|
|
629
|
+
}
|
|
630
|
+
CoverageManager.globalCoverage.summary = {
|
|
631
|
+
totalCoverage,
|
|
632
|
+
frontendEnabled: !!CoverageManager.globalCoverage.frontend,
|
|
633
|
+
vitestEnabled: !!CoverageManager.globalCoverage.vitest,
|
|
634
|
+
projectType: CoverageManager.detectProjectType(),
|
|
635
|
+
timestamp: new Date(),
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* â
NOVO: Salva relatĂłrio de cobertura
|
|
640
|
+
*/
|
|
641
|
+
static async saveCoverageReport() {
|
|
642
|
+
try {
|
|
643
|
+
// đ CRĂTICO: Forçar atualização do timestamp global
|
|
644
|
+
Logger.info(`đ Atualizando timestamp para nova execução: ${new Date().toLocaleString('pt-BR')}`);
|
|
645
|
+
// Criar diretĂłrio de cobertura
|
|
646
|
+
if (!fs.existsSync(CoverageManager.outputDir)) {
|
|
647
|
+
fs.mkdirSync(CoverageManager.outputDir, { recursive: true });
|
|
648
|
+
}
|
|
649
|
+
// ïżœ CRĂTICO: Obter dados dos testes do UnifiedReportManager
|
|
650
|
+
const unifiedMetrics = global.UnifiedReportManager?.getMetrics?.() || null;
|
|
651
|
+
const totalTestsFromUnified = unifiedMetrics?.totalTestes || 0;
|
|
652
|
+
const testsFromUnified = unifiedMetrics?.testes || [];
|
|
653
|
+
// ïżœ CRĂTICO: Sempre atualizar timestamp do summary global
|
|
654
|
+
if (CoverageManager.globalCoverage.summary) {
|
|
655
|
+
CoverageManager.globalCoverage.summary.timestamp = new Date();
|
|
656
|
+
}
|
|
657
|
+
// ïżœđ Usar dados do UnifiedReportManager se disponĂvel
|
|
658
|
+
const actualTotalTests = totalTestsFromUnified > 0
|
|
659
|
+
? totalTestsFromUnified
|
|
660
|
+
: CoverageManager.coverageData.size;
|
|
661
|
+
const actualTestsData = testsFromUnified.length > 0
|
|
662
|
+
? testsFromUnified
|
|
663
|
+
: Array.from(CoverageManager.coverageData.values());
|
|
664
|
+
// ïżœđ 1. RelatĂłrio detalhado por teste (AutoCore especĂfico)
|
|
665
|
+
const testsCoverageReport = {
|
|
666
|
+
summary: CoverageManager.globalCoverage.summary,
|
|
667
|
+
globalCoverage: CoverageManager.globalCoverage,
|
|
668
|
+
testsCoverage: actualTestsData,
|
|
669
|
+
metadata: {
|
|
670
|
+
totalTests: actualTotalTests,
|
|
671
|
+
generatedAt: new Date(),
|
|
672
|
+
framework: 'AutoCore',
|
|
673
|
+
version: CoverageManager.getFrameworkVersion(),
|
|
674
|
+
source: totalTestsFromUnified > 0
|
|
675
|
+
? 'UnifiedReportManager'
|
|
676
|
+
: 'CoverageManager',
|
|
677
|
+
},
|
|
678
|
+
};
|
|
679
|
+
// đ 2. Salvar JSON detalhado (AutoCore)
|
|
680
|
+
const reportPath = path.join(CoverageManager.outputDir, 'autocore-coverage-report.json');
|
|
681
|
+
fs.writeFileSync(reportPath, JSON.stringify(testsCoverageReport, null, 2));
|
|
682
|
+
// đ 3. Salvar resumo simples (AutoCore) - sempre com timestamp atual
|
|
683
|
+
const summaryPath = path.join(CoverageManager.outputDir, 'autocore-coverage-summary.json');
|
|
684
|
+
const currentTimestamp = new Date();
|
|
685
|
+
fs.writeFileSync(summaryPath, JSON.stringify({
|
|
686
|
+
totalCoverage: CoverageManager.globalCoverage.summary?.totalCoverage || 0,
|
|
687
|
+
totalTests: actualTotalTests,
|
|
688
|
+
vitestEnabled: CoverageManager.globalCoverage.summary?.vitestEnabled,
|
|
689
|
+
frontendEnabled: CoverageManager.globalCoverage.summary?.frontendEnabled,
|
|
690
|
+
timestamp: currentTimestamp,
|
|
691
|
+
timestampFormatted: currentTimestamp.toLocaleString('pt-BR'),
|
|
692
|
+
source: totalTestsFromUnified > 0
|
|
693
|
+
? 'UnifiedReportManager'
|
|
694
|
+
: 'CoverageManager',
|
|
695
|
+
}, null, 2));
|
|
696
|
+
// đ 4. Gerar estrutura compatĂvel com Vitest standard
|
|
697
|
+
await CoverageManager.generateStandardCoverageFiles();
|
|
698
|
+
ConfigLogger.success(`RelatĂłrio de cobertura salvo em: ${reportPath}`);
|
|
699
|
+
Logger.info('đ Estrutura completa gerada: coverage/index.html, coverage-final.json, lcov.info');
|
|
700
|
+
}
|
|
701
|
+
catch (error) {
|
|
702
|
+
ConfigLogger.error(`Erro ao salvar relatĂłrio de cobertura: ${String(error)}`);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* đ NOVO: Gera arquivos de cobertura padrĂŁo para projeto consumidor
|
|
707
|
+
*/
|
|
708
|
+
static async generateStandardCoverageFiles() {
|
|
709
|
+
try {
|
|
710
|
+
const projectType = CoverageManager.detectProjectType();
|
|
711
|
+
const vitestCoverage = CoverageManager.globalCoverage.vitest;
|
|
712
|
+
// â
CORRIGIDO: SĂł gerar index.html para Vitest
|
|
713
|
+
if (projectType === 'vitest' && vitestCoverage) {
|
|
714
|
+
// đ coverage-final.json (compatĂvel com ferramentas padrĂŁo)
|
|
715
|
+
const coverageFinal = {
|
|
716
|
+
total: {
|
|
717
|
+
lines: vitestCoverage.lines || {
|
|
718
|
+
total: 0,
|
|
719
|
+
covered: 0,
|
|
720
|
+
skipped: 0,
|
|
721
|
+
pct: 0,
|
|
722
|
+
},
|
|
723
|
+
functions: vitestCoverage.functions || {
|
|
724
|
+
total: 0,
|
|
725
|
+
covered: 0,
|
|
726
|
+
skipped: 0,
|
|
727
|
+
pct: 0,
|
|
728
|
+
},
|
|
729
|
+
statements: vitestCoverage.statements || {
|
|
730
|
+
total: 0,
|
|
731
|
+
covered: 0,
|
|
732
|
+
skipped: 0,
|
|
733
|
+
pct: 0,
|
|
734
|
+
},
|
|
735
|
+
branches: vitestCoverage.branches || {
|
|
736
|
+
total: 0,
|
|
737
|
+
covered: 0,
|
|
738
|
+
skipped: 0,
|
|
739
|
+
pct: 0,
|
|
740
|
+
},
|
|
741
|
+
},
|
|
742
|
+
metadata: {
|
|
743
|
+
generatedBy: 'AutoCore + Vitest',
|
|
744
|
+
timestamp: new Date().toISOString(),
|
|
745
|
+
version: CoverageManager.getFrameworkVersion(),
|
|
746
|
+
},
|
|
747
|
+
};
|
|
748
|
+
const finalPath = path.join(CoverageManager.outputDir, 'coverage-final.json');
|
|
749
|
+
fs.writeFileSync(finalPath, JSON.stringify(coverageFinal, null, 2));
|
|
750
|
+
// đ coverage-summary.json (padrĂŁo)
|
|
751
|
+
const coverageSummary = {
|
|
752
|
+
total: coverageFinal.total,
|
|
753
|
+
timestamp: new Date().toISOString(),
|
|
754
|
+
};
|
|
755
|
+
const summaryStandardPath = path.join(CoverageManager.outputDir, 'coverage-summary.json');
|
|
756
|
+
fs.writeFileSync(summaryStandardPath, JSON.stringify(coverageSummary, null, 2));
|
|
757
|
+
// đ lcov.info (formato LCOV padrĂŁo)
|
|
758
|
+
const lcovContent = CoverageManager.generateLcovFormat(vitestCoverage);
|
|
759
|
+
const lcovPath = path.join(CoverageManager.outputDir, 'lcov.info');
|
|
760
|
+
fs.writeFileSync(lcovPath, lcovContent);
|
|
761
|
+
// đ index.html (dashboard sempre atualizado) - APENAS VITEST
|
|
762
|
+
const indexPath = path.join(CoverageManager.outputDir, 'index.html');
|
|
763
|
+
const htmlContent = CoverageManager.generateCoverageHtml(coverageFinal.total);
|
|
764
|
+
fs.writeFileSync(indexPath, htmlContent);
|
|
765
|
+
Logger.info(`đ index.html Vitest atualizado com timestamp: ${new Date().toLocaleString('pt-BR')}`);
|
|
766
|
+
Logger.info('đ Arquivos de cobertura Vitest gerados: coverage-final.json, coverage-summary.json, lcov.info, index.html');
|
|
767
|
+
}
|
|
768
|
+
else if (projectType === 'playwright') {
|
|
769
|
+
// â
NOVO: Para Playwright, nĂŁo gerar index.html (Playwright jĂĄ gera seu prĂłprio relatĂłrio)
|
|
770
|
+
Logger.info('đ Projeto Playwright detectado - index.html nĂŁo gerado (Playwright gera seu prĂłprio relatĂłrio)');
|
|
771
|
+
}
|
|
772
|
+
else {
|
|
773
|
+
Logger.info('đ Cobertura nĂŁo disponĂvel ou projeto misto');
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
catch (error) {
|
|
777
|
+
ConfigLogger.error(`Erro ao gerar arquivos de cobertura padrĂŁo: ${String(error)}`);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
781
|
+
* đ Gera formato LCOV
|
|
782
|
+
*/
|
|
783
|
+
static generateLcovFormat(vitestCoverage) {
|
|
784
|
+
if (!vitestCoverage)
|
|
785
|
+
return '';
|
|
786
|
+
const lines = vitestCoverage.lines || { total: 0, covered: 0 };
|
|
787
|
+
const functions = vitestCoverage.functions || { total: 0, covered: 0 };
|
|
788
|
+
const branches = vitestCoverage.branches || { total: 0, covered: 0 };
|
|
789
|
+
return `TN:
|
|
790
|
+
SF:src/autocore-project.ts
|
|
791
|
+
FNF:${functions.total}
|
|
792
|
+
FNH:${functions.covered}
|
|
793
|
+
LF:${lines.total}
|
|
794
|
+
LH:${lines.covered}
|
|
795
|
+
BRF:${branches.total}
|
|
796
|
+
BRH:${branches.covered}
|
|
797
|
+
end_of_record
|
|
798
|
+
`;
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* đ Gera HTML bĂĄsico para cobertura
|
|
802
|
+
*/
|
|
803
|
+
static generateCoverageHtml(totalCoverage) {
|
|
804
|
+
const linesPct = totalCoverage.lines?.pct || 0;
|
|
805
|
+
const functionsPct = totalCoverage.functions?.pct || 0;
|
|
806
|
+
const statementsPct = totalCoverage.statements?.pct || 0;
|
|
807
|
+
const branchesPct = totalCoverage.branches?.pct || 0;
|
|
808
|
+
const averagePct = Math.round((linesPct + functionsPct + statementsPct + branchesPct) / 4);
|
|
809
|
+
return `<!DOCTYPE html>
|
|
810
|
+
<html lang="pt-BR">
|
|
811
|
+
<head>
|
|
812
|
+
<meta charset="UTF-8">
|
|
813
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
814
|
+
<title>Coverage Report - AutoCore</title>
|
|
815
|
+
<style>
|
|
816
|
+
body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; }
|
|
817
|
+
.container { max-width: 1200px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
|
|
818
|
+
.header { text-align: center; margin-bottom: 30px; }
|
|
819
|
+
.metric { display: inline-block; margin: 10px; padding: 15px; background: #f8f9fa; border-radius: 6px; text-align: center; min-width: 150px; }
|
|
820
|
+
.metric-title { font-size: 14px; color: #666; margin-bottom: 5px; }
|
|
821
|
+
.metric-value { font-size: 24px; font-weight: bold; color: #333; }
|
|
822
|
+
.metric-percent { font-size: 18px; color: #007bff; }
|
|
823
|
+
.good { color: #28a745; }
|
|
824
|
+
.warning { color: #ffc107; }
|
|
825
|
+
.error { color: #dc3545; }
|
|
826
|
+
.timestamp { text-align: center; color: #666; margin-top: 20px; font-size: 12px; }
|
|
827
|
+
</style>
|
|
828
|
+
</head>
|
|
829
|
+
<body>
|
|
830
|
+
<div class="container">
|
|
831
|
+
<div class="header">
|
|
832
|
+
<h1>đŻ Coverage Report</h1>
|
|
833
|
+
<p>RelatĂłrio de cobertura gerado pelo AutoCore + Vitest</p>
|
|
834
|
+
</div>
|
|
835
|
+
|
|
836
|
+
<div class="metrics">
|
|
837
|
+
<div class="metric">
|
|
838
|
+
<div class="metric-title">đ Cobertura Total</div>
|
|
839
|
+
<div class="metric-value ${averagePct >= 80 ? 'good' : averagePct >= 60 ? 'warning' : 'error'}">${averagePct}%</div>
|
|
840
|
+
</div>
|
|
841
|
+
|
|
842
|
+
<div class="metric">
|
|
843
|
+
<div class="metric-title">đ Linhas</div>
|
|
844
|
+
<div class="metric-percent">${linesPct.toFixed(1)}%</div>
|
|
845
|
+
<div>${totalCoverage.lines?.covered || 0}/${totalCoverage.lines?.total || 0}</div>
|
|
846
|
+
</div>
|
|
847
|
+
|
|
848
|
+
<div class="metric">
|
|
849
|
+
<div class="metric-title">đ§ FunçÔes</div>
|
|
850
|
+
<div class="metric-percent">${functionsPct.toFixed(1)}%</div>
|
|
851
|
+
<div>${totalCoverage.functions?.covered || 0}/${totalCoverage.functions?.total || 0}</div>
|
|
852
|
+
</div>
|
|
853
|
+
|
|
854
|
+
<div class="metric">
|
|
855
|
+
<div class="metric-title">⥠Statements</div>
|
|
856
|
+
<div class="metric-percent">${statementsPct.toFixed(1)}%</div>
|
|
857
|
+
<div>${totalCoverage.statements?.covered || 0}/${totalCoverage.statements?.total || 0}</div>
|
|
858
|
+
</div>
|
|
859
|
+
|
|
860
|
+
<div class="metric">
|
|
861
|
+
<div class="metric-title">đż Branches</div>
|
|
862
|
+
<div class="metric-percent">${branchesPct.toFixed(1)}%</div>
|
|
863
|
+
<div>${totalCoverage.branches?.covered || 0}/${totalCoverage.branches?.total || 0}</div>
|
|
864
|
+
</div>
|
|
865
|
+
</div>
|
|
866
|
+
|
|
867
|
+
<div class="timestamp">
|
|
868
|
+
đ
Gerado em ${new Date().toLocaleString('pt-BR')} por AutoCore v${CoverageManager.getFrameworkVersion()}
|
|
869
|
+
</div>
|
|
870
|
+
</div>
|
|
871
|
+
</body>
|
|
872
|
+
</html>`;
|
|
873
|
+
}
|
|
874
|
+
/**
|
|
875
|
+
* Obtém versão do framework
|
|
876
|
+
*/
|
|
877
|
+
static getFrameworkVersion() {
|
|
878
|
+
try {
|
|
879
|
+
const pkgPath = path.join(process.cwd(), 'package.json');
|
|
880
|
+
if (fs.existsSync(pkgPath)) {
|
|
881
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
882
|
+
return (pkg.dependencies?.['@silasfmartins/testhub'] ||
|
|
883
|
+
pkg.devDependencies?.['@silasfmartins/testhub'] ||
|
|
884
|
+
'unknown');
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
catch (error) {
|
|
888
|
+
// Silencioso
|
|
889
|
+
}
|
|
890
|
+
return 'unknown';
|
|
891
|
+
}
|
|
892
|
+
/**
|
|
893
|
+
* â
PĂBLICO: ObtĂ©m cobertura global
|
|
894
|
+
*/
|
|
895
|
+
static getGlobalCoverage() {
|
|
896
|
+
return CoverageManager.globalCoverage;
|
|
897
|
+
}
|
|
898
|
+
/**
|
|
899
|
+
* â
PĂBLICO: ObtĂ©m cobertura de um teste especĂfico
|
|
900
|
+
*/
|
|
901
|
+
static getTestCoverage(testName) {
|
|
902
|
+
return CoverageManager.coverageData.get(testName);
|
|
903
|
+
}
|
|
904
|
+
/**
|
|
905
|
+
* â
PĂBLICO: ObtĂ©m todas as coberturas de teste
|
|
906
|
+
*/
|
|
907
|
+
static getAllTestsCoverage() {
|
|
908
|
+
return Array.from(CoverageManager.coverageData.values());
|
|
909
|
+
}
|
|
910
|
+
/**
|
|
911
|
+
* â
PĂBLICO: Reset para testes
|
|
912
|
+
*/
|
|
913
|
+
static reset() {
|
|
914
|
+
CoverageManager.coverageData.clear();
|
|
915
|
+
CoverageManager.globalCoverage = {};
|
|
916
|
+
}
|
|
917
|
+
}
|