@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.
Files changed (296) hide show
  1. package/.github/copilot-instructions.md +520 -0
  2. package/biome.json +37 -0
  3. package/dist/index.d.ts +45 -0
  4. package/dist/index.js +169 -0
  5. package/dist/scripts/consumer-postinstall.d.ts +15 -0
  6. package/dist/scripts/consumer-postinstall.js +785 -0
  7. package/dist/scripts/generate-docs.d.ts +16 -0
  8. package/dist/scripts/generate-docs.js +1363 -0
  9. package/dist/scripts/generate-index.d.ts +2 -0
  10. package/dist/scripts/generate-index.js +314 -0
  11. package/dist/scripts/init-api.d.ts +2 -0
  12. package/dist/scripts/init-api.js +525 -0
  13. package/dist/scripts/init-banco.d.ts +2 -0
  14. package/dist/scripts/init-banco.js +347 -0
  15. package/dist/scripts/init-frontend.d.ts +2 -0
  16. package/dist/scripts/init-frontend.js +627 -0
  17. package/dist/scripts/init-mobile.d.ts +2 -0
  18. package/dist/scripts/init-mobile.js +481 -0
  19. package/dist/scripts/init-scenarios.d.ts +2 -0
  20. package/dist/scripts/init-scenarios.js +846 -0
  21. package/dist/scripts/init-ssh.d.ts +2 -0
  22. package/dist/scripts/init-ssh.js +639 -0
  23. package/dist/scripts/package-versions.d.ts +57 -0
  24. package/dist/scripts/package-versions.js +768 -0
  25. package/dist/scripts/postinstall.d.ts +1 -0
  26. package/dist/scripts/postinstall.js +527 -0
  27. package/dist/scripts/robust-build.d.ts +7 -0
  28. package/dist/scripts/robust-build.js +88 -0
  29. package/dist/scripts/setup-local-packages.d.ts +31 -0
  30. package/dist/scripts/setup-local-packages.js +237 -0
  31. package/dist/scripts/smart-override.d.ts +2 -0
  32. package/dist/scripts/smart-override.js +1360 -0
  33. package/dist/scripts/sync-configs.d.ts +27 -0
  34. package/dist/scripts/sync-configs.js +248 -0
  35. package/dist/scripts/test-biome-parse.d.ts +5 -0
  36. package/dist/scripts/test-biome-parse.js +84 -0
  37. package/dist/scripts/ultracite-setup.d.ts +4 -0
  38. package/dist/scripts/ultracite-setup.js +310 -0
  39. package/dist/scripts/update-all-init-scripts.d.ts +2 -0
  40. package/dist/scripts/update-all-init-scripts.js +52 -0
  41. package/dist/scripts/update-biome-schema.d.ts +15 -0
  42. package/dist/scripts/update-biome-schema.js +124 -0
  43. package/dist/src/AutoCoreFacade.d.ts +145 -0
  44. package/dist/src/AutoCoreFacade.js +217 -0
  45. package/dist/src/api/ApiActions.d.ts +297 -0
  46. package/dist/src/api/ApiActions.js +1905 -0
  47. package/dist/src/api/Certificate.d.ts +60 -0
  48. package/dist/src/api/Certificate.js +79 -0
  49. package/dist/src/api/JsonResponse.d.ts +116 -0
  50. package/dist/src/api/JsonResponse.js +206 -0
  51. package/dist/src/appium/DeviceFarmViewer.d.ts +79 -0
  52. package/dist/src/appium/DeviceFarmViewer.js +1083 -0
  53. package/dist/src/appium/MobileActions.d.ts +347 -0
  54. package/dist/src/appium/MobileActions.js +1632 -0
  55. package/dist/src/appium/MobileConnection.d.ts +160 -0
  56. package/dist/src/appium/MobileConnection.js +772 -0
  57. package/dist/src/config/envLoader.d.ts +123 -0
  58. package/dist/src/config/envLoader.js +361 -0
  59. package/dist/src/config/jest-safe-setup.d.ts +19 -0
  60. package/dist/src/config/jest-safe-setup.js +369 -0
  61. package/dist/src/config/timeouts.d.ts +32 -0
  62. package/dist/src/config/timeouts.js +38 -0
  63. package/dist/src/desktop/DesktopActions.d.ts +46 -0
  64. package/dist/src/desktop/DesktopActions.js +398 -0
  65. package/dist/src/desktop/DesktopConnection.d.ts +32 -0
  66. package/dist/src/desktop/DesktopConnection.js +84 -0
  67. package/dist/src/domain/entities/TestExecution.d.ts +117 -0
  68. package/dist/src/domain/entities/TestExecution.js +150 -0
  69. package/dist/src/domain/entities/TestReport.d.ts +114 -0
  70. package/dist/src/domain/entities/TestReport.js +179 -0
  71. package/dist/src/domain/repositories/ITestRepository.d.ts +196 -0
  72. package/dist/src/domain/repositories/ITestRepository.js +14 -0
  73. package/dist/src/domain/schemas/ValidationSchemas.d.ts +159 -0
  74. package/dist/src/domain/schemas/ValidationSchemas.js +181 -0
  75. package/dist/src/functions/errors/BaseError.d.ts +78 -0
  76. package/dist/src/functions/errors/BaseError.js +245 -0
  77. package/dist/src/functions/errors/ConfigurationError.d.ts +16 -0
  78. package/dist/src/functions/errors/ConfigurationError.js +48 -0
  79. package/dist/src/functions/errors/ErrorCatalog.d.ts +148 -0
  80. package/dist/src/functions/errors/ErrorCatalog.js +157 -0
  81. package/dist/src/functions/errors/GlobalErrorHandler.d.ts +101 -0
  82. package/dist/src/functions/errors/GlobalErrorHandler.js +281 -0
  83. package/dist/src/functions/errors/IntegrationError.d.ts +17 -0
  84. package/dist/src/functions/errors/IntegrationError.js +51 -0
  85. package/dist/src/functions/errors/SecurityError.d.ts +14 -0
  86. package/dist/src/functions/errors/SecurityError.js +42 -0
  87. package/dist/src/functions/errors/SystemError.d.ts +12 -0
  88. package/dist/src/functions/errors/SystemError.js +36 -0
  89. package/dist/src/functions/errors/ValidationError.d.ts +14 -0
  90. package/dist/src/functions/errors/ValidationError.js +61 -0
  91. package/dist/src/functions/errors/index.d.ts +12 -0
  92. package/dist/src/functions/errors/index.js +13 -0
  93. package/dist/src/global-setup.d.ts +1 -0
  94. package/dist/src/global-setup.js +1037 -0
  95. package/dist/src/helpers/BancoActions.d.ts +188 -0
  96. package/dist/src/helpers/BancoActions.js +581 -0
  97. package/dist/src/helpers/EnviromentHelper.d.ts +17 -0
  98. package/dist/src/helpers/EnviromentHelper.js +66 -0
  99. package/dist/src/helpers/ParallelExecutionHelper.d.ts +183 -0
  100. package/dist/src/helpers/ParallelExecutionHelper.js +375 -0
  101. package/dist/src/helpers/SyncSignal.d.ts +15 -0
  102. package/dist/src/helpers/SyncSignal.js +44 -0
  103. package/dist/src/hubdocs/CategoryDetector.d.ts +83 -0
  104. package/dist/src/hubdocs/CategoryDetector.js +401 -0
  105. package/dist/src/hubdocs/DirectStatementInterceptor.d.ts +54 -0
  106. package/dist/src/hubdocs/DirectStatementInterceptor.js +243 -0
  107. package/dist/src/hubdocs/ExecutionTracker.d.ts +107 -0
  108. package/dist/src/hubdocs/ExecutionTracker.js +702 -0
  109. package/dist/src/hubdocs/HubDocs.d.ts +395 -0
  110. package/dist/src/hubdocs/HubDocs.js +3586 -0
  111. package/dist/src/hubdocs/StatementMethodFilter.d.ts +71 -0
  112. package/dist/src/hubdocs/StatementMethodFilter.js +618 -0
  113. package/dist/src/hubdocs/StatementTracker.d.ts +417 -0
  114. package/dist/src/hubdocs/StatementTracker.js +2419 -0
  115. package/dist/src/hubdocs/SwaggerGenerator.d.ts +59 -0
  116. package/dist/src/hubdocs/SwaggerGenerator.js +405 -0
  117. package/dist/src/hubdocs/index.d.ts +9 -0
  118. package/dist/src/hubdocs/index.js +9 -0
  119. package/dist/src/hubdocs/types.d.ts +114 -0
  120. package/dist/src/hubdocs/types.js +5 -0
  121. package/dist/src/infrastructure/DependencyContainer.d.ts +142 -0
  122. package/dist/src/infrastructure/DependencyContainer.js +250 -0
  123. package/dist/src/infrastructure/adapters/AppiumAdapter.d.ts +168 -0
  124. package/dist/src/infrastructure/adapters/AppiumAdapter.js +468 -0
  125. package/dist/src/infrastructure/adapters/OracleAdapter.d.ts +150 -0
  126. package/dist/src/infrastructure/adapters/OracleAdapter.js +388 -0
  127. package/dist/src/infrastructure/adapters/PlaywrightAdapter.d.ts +192 -0
  128. package/dist/src/infrastructure/adapters/PlaywrightAdapter.js +382 -0
  129. package/dist/src/infrastructure/adapters/SSHAdapter.d.ts +141 -0
  130. package/dist/src/infrastructure/adapters/SSHAdapter.js +428 -0
  131. package/dist/src/interfaces.d.ts +501 -0
  132. package/dist/src/interfaces.js +25 -0
  133. package/dist/src/internal/fakes/__fake-actions__.d.ts +17 -0
  134. package/dist/src/internal/fakes/__fake-actions__.js +21 -0
  135. package/dist/src/internal/fakes/__forbidden__.d.ts +10 -0
  136. package/dist/src/internal/fakes/__forbidden__.js +18 -0
  137. package/dist/src/internal/fakes/__honeypot__.d.ts +15 -0
  138. package/dist/src/internal/fakes/__honeypot__.js +24 -0
  139. package/dist/src/octane/OctaneReporter.d.ts +13 -0
  140. package/dist/src/octane/OctaneReporter.js +61 -0
  141. package/dist/src/playwright/CryptoActions.d.ts +20 -0
  142. package/dist/src/playwright/CryptoActions.js +75 -0
  143. package/dist/src/playwright/EnhancedWebActions.d.ts +7 -0
  144. package/dist/src/playwright/EnhancedWebActions.js +65 -0
  145. package/dist/src/playwright/WebActions.d.ts +1599 -0
  146. package/dist/src/playwright/WebActions.js +11788 -0
  147. package/dist/src/playwright/actions/ActionTimeline.d.ts +36 -0
  148. package/dist/src/playwright/actions/ActionTimeline.js +101 -0
  149. package/dist/src/playwright/actions/RecoveryQueue.d.ts +82 -0
  150. package/dist/src/playwright/actions/RecoveryQueue.js +130 -0
  151. package/dist/src/playwright/actions/SelectorCache.d.ts +53 -0
  152. package/dist/src/playwright/actions/SelectorCache.js +96 -0
  153. package/dist/src/playwright/actions/index.d.ts +13 -0
  154. package/dist/src/playwright/actions/index.js +14 -0
  155. package/dist/src/playwright/actions/types.d.ts +147 -0
  156. package/dist/src/playwright/actions/types.js +5 -0
  157. package/dist/src/playwright/fixtures.d.ts +112 -0
  158. package/dist/src/playwright/fixtures.js +718 -0
  159. package/dist/src/playwright/network-logs-reporter.d.ts +7 -0
  160. package/dist/src/playwright/network-logs-reporter.js +66 -0
  161. package/dist/src/playwright/registerRecoveryWrappers.d.ts +1 -0
  162. package/dist/src/playwright/registerRecoveryWrappers.js +54 -0
  163. package/dist/src/security/BuildSecurity.d.ts +12 -0
  164. package/dist/src/security/BuildSecurity.js +138 -0
  165. package/dist/src/security/EulaProtection.d.ts +70 -0
  166. package/dist/src/security/EulaProtection.js +155 -0
  167. package/dist/src/security/HoneypotManager.d.ts +46 -0
  168. package/dist/src/security/HoneypotManager.js +234 -0
  169. package/dist/src/security/KeysManager.d.ts +36 -0
  170. package/dist/src/security/KeysManager.js +158 -0
  171. package/dist/src/security/ProofOfWorkIntegration.d.ts +64 -0
  172. package/dist/src/security/ProofOfWorkIntegration.js +206 -0
  173. package/dist/src/security/SecurityValidation.d.ts +21 -0
  174. package/dist/src/security/SecurityValidation.js +163 -0
  175. package/dist/src/security/SourceMapProtection.d.ts +55 -0
  176. package/dist/src/security/SourceMapProtection.js +220 -0
  177. package/dist/src/security/protector.d.ts +1 -0
  178. package/dist/src/security/protector.js +97 -0
  179. package/dist/src/ssh/SSHActions.d.ts +262 -0
  180. package/dist/src/ssh/SSHActions.js +790 -0
  181. package/dist/src/ssh/SSHClient.d.ts +99 -0
  182. package/dist/src/ssh/SSHClient.js +409 -0
  183. package/dist/src/statements/BaseStatement.d.ts +38 -0
  184. package/dist/src/statements/BaseStatement.js +78 -0
  185. package/dist/src/testContext/AuthStateManager.d.ts +93 -0
  186. package/dist/src/testContext/AuthStateManager.js +256 -0
  187. package/dist/src/testContext/CoverageManager.d.ts +198 -0
  188. package/dist/src/testContext/CoverageManager.js +917 -0
  189. package/dist/src/testContext/TestAnnotations.d.ts +476 -0
  190. package/dist/src/testContext/TestAnnotations.js +2647 -0
  191. package/dist/src/testContext/TestContext.d.ts +138 -0
  192. package/dist/src/testContext/TestContext.js +369 -0
  193. package/dist/src/testContext/UnifiedHtmlGenerator.d.ts +7 -0
  194. package/dist/src/testContext/UnifiedHtmlGenerator.js +264 -0
  195. package/dist/src/testContext/UnifiedReportManager.d.ts +211 -0
  196. package/dist/src/testContext/UnifiedReportManager.js +1206 -0
  197. package/dist/src/testhub/DynamicConfigManager.d.ts +121 -0
  198. package/dist/src/testhub/DynamicConfigManager.js +320 -0
  199. package/dist/src/testhub/SystemsManager.d.ts +119 -0
  200. package/dist/src/testhub/SystemsManager.js +365 -0
  201. package/dist/src/testhub/TestHubClient.d.ts +335 -0
  202. package/dist/src/testhub/TestHubClient.js +1215 -0
  203. package/dist/src/testhub/TestHubReporter.d.ts +62 -0
  204. package/dist/src/testhub/TestHubReporter.js +576 -0
  205. package/dist/src/testhub/TestHubVars.d.ts +116 -0
  206. package/dist/src/testhub/TestHubVars.js +273 -0
  207. package/dist/src/utils/ActionInterceptor.d.ts +59 -0
  208. package/dist/src/utils/ActionInterceptor.js +741 -0
  209. package/dist/src/utils/ArtifactsCompressor.d.ts +43 -0
  210. package/dist/src/utils/ArtifactsCompressor.js +181 -0
  211. package/dist/src/utils/AutoLogsFinal.d.ts +47 -0
  212. package/dist/src/utils/AutoLogsFinal.js +148 -0
  213. package/dist/src/utils/CodeGenSession.d.ts +114 -0
  214. package/dist/src/utils/CodeGenSession.js +264 -0
  215. package/dist/src/utils/ConfigLogger.d.ts +133 -0
  216. package/dist/src/utils/ConfigLogger.js +611 -0
  217. package/dist/src/utils/CustomReporter.d.ts +22 -0
  218. package/dist/src/utils/CustomReporter.js +352 -0
  219. package/dist/src/utils/DataStore.d.ts +171 -0
  220. package/dist/src/utils/DataStore.js +484 -0
  221. package/dist/src/utils/DatabaseInterceptor.d.ts +19 -0
  222. package/dist/src/utils/DatabaseInterceptor.js +295 -0
  223. package/dist/src/utils/DateHelper.d.ts +16 -0
  224. package/dist/src/utils/DateHelper.js +120 -0
  225. package/dist/src/utils/DateValidator.d.ts +4 -0
  226. package/dist/src/utils/DateValidator.js +51 -0
  227. package/dist/src/utils/DocumentGenerator.d.ts +35 -0
  228. package/dist/src/utils/DocumentGenerator.js +129 -0
  229. package/dist/src/utils/EvidenceCapture.d.ts +90 -0
  230. package/dist/src/utils/EvidenceCapture.js +600 -0
  231. package/dist/src/utils/EvidenceReportGenerator.d.ts +70 -0
  232. package/dist/src/utils/EvidenceReportGenerator.js +799 -0
  233. package/dist/src/utils/FrameManagementUtil.d.ts +42 -0
  234. package/dist/src/utils/FrameManagementUtil.js +75 -0
  235. package/dist/src/utils/GlobalStatementsInterceptor.d.ts +1 -0
  236. package/dist/src/utils/GlobalStatementsInterceptor.js +1 -0
  237. package/dist/src/utils/HTMLTemplate.d.ts +1 -0
  238. package/dist/src/utils/HTMLTemplate.js +1034 -0
  239. package/dist/src/utils/InterceptacaoMagica.d.ts +23 -0
  240. package/dist/src/utils/InterceptacaoMagica.js +365 -0
  241. package/dist/src/utils/LogSanitizer.d.ts +35 -0
  242. package/dist/src/utils/LogSanitizer.js +110 -0
  243. package/dist/src/utils/Logger.d.ts +65 -0
  244. package/dist/src/utils/Logger.js +284 -0
  245. package/dist/src/utils/McpLocalClient.d.ts +141 -0
  246. package/dist/src/utils/McpLocalClient.js +871 -0
  247. package/dist/src/utils/PDFEvidenceGenerator.d.ts +20 -0
  248. package/dist/src/utils/PDFEvidenceGenerator.js +156 -0
  249. package/dist/src/utils/SpecFileAnalyzer.d.ts +35 -0
  250. package/dist/src/utils/SpecFileAnalyzer.js +209 -0
  251. package/dist/src/utils/StatementInterceptor.d.ts +18 -0
  252. package/dist/src/utils/StatementInterceptor.js +87 -0
  253. package/dist/src/utils/StatementLogger.d.ts +33 -0
  254. package/dist/src/utils/StatementLogger.js +113 -0
  255. package/dist/src/utils/StatementsInterceptor.d.ts +1 -0
  256. package/dist/src/utils/StatementsInterceptor.js +1 -0
  257. package/dist/src/utils/TeamsFlushHook.d.ts +17 -0
  258. package/dist/src/utils/TeamsFlushHook.js +168 -0
  259. package/dist/src/utils/TerminalLogCapture.d.ts +158 -0
  260. package/dist/src/utils/TerminalLogCapture.js +531 -0
  261. package/dist/src/utils/TestMethodLogger.d.ts +70 -0
  262. package/dist/src/utils/TestMethodLogger.js +95 -0
  263. package/dist/src/utils/UnifiedTeardown.d.ts +4 -0
  264. package/dist/src/utils/UnifiedTeardown.js +400 -0
  265. package/dist/src/utils/XPathCatalog.d.ts +152 -0
  266. package/dist/src/utils/XPathCatalog.js +350 -0
  267. package/dist/src/utils/generators.d.ts +90 -0
  268. package/dist/src/utils/generators.js +167 -0
  269. package/dist/src/utils/testRecovery/ResilientPlaywright.d.ts +152 -0
  270. package/dist/src/utils/testRecovery/ResilientPlaywright.js +715 -0
  271. package/dist/src/utils/testRecovery/TestRecoveryClient.d.ts +801 -0
  272. package/dist/src/utils/testRecovery/TestRecoveryClient.js +1415 -0
  273. package/dist/src/utils/testRecovery/autoFixCode.d.ts +65 -0
  274. package/dist/src/utils/testRecovery/autoFixCode.js +32 -0
  275. package/dist/vitest.config.d.ts +2 -0
  276. package/dist/vitest.config.js +59 -0
  277. package/dist/wdio.conf.d.ts +1 -0
  278. package/dist/wdio.conf.js +420 -0
  279. package/package.json +137 -0
  280. package/protect-loader.mjs +643 -0
  281. package/scripts/consumer-postinstall.ts +975 -0
  282. package/scripts/generate-index.ts +343 -0
  283. package/scripts/init-api.ts +613 -0
  284. package/scripts/init-banco.ts +437 -0
  285. package/scripts/init-frontend.ts +727 -0
  286. package/scripts/init-mobile.ts +558 -0
  287. package/scripts/init-scenarios.ts +925 -0
  288. package/scripts/init-ssh.ts +734 -0
  289. package/scripts/package-versions.ts +978 -0
  290. package/scripts/postinstall.ts +605 -0
  291. package/scripts/smart-override.ts +1675 -0
  292. package/scripts/sync-configs.ts +302 -0
  293. package/scripts/ultracite-setup.ts +370 -0
  294. package/src/types/globals.d.ts +48 -0
  295. package/tsconfig.json +29 -0
  296. package/types/autocore-sync-signal.d.ts +10 -0
@@ -0,0 +1,352 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { AutoDocs } from '../hubdocs/HubDocs.js';
4
+ import { CoverageManager } from '../testContext/CoverageManager.js';
5
+ import { UnifiedReportManager, } from '../testContext/UnifiedReportManager.js';
6
+ import { Logger } from './Logger.js';
7
+ import { UnifiedTeardown } from './UnifiedTeardown.js';
8
+ import { StatementTracker } from '../hubdocs/StatementTracker.js';
9
+ import { ExecutionTracker } from '../hubdocs/ExecutionTracker.js';
10
+ export default class CustomReporter {
11
+ testCount = 0;
12
+ completedTests = 0;
13
+ projectRoot = '';
14
+ // 🔧 NOVO: Rastrear CTs por CN para finalizar apenas quando todos terminarem
15
+ ctsByCN = new Map();
16
+ // 🔧 Cache local do StatementTracker para evitar múltiplas resoluções
17
+ statementTracker;
18
+ onBegin(config, suite) {
19
+ // ✅ CORRIGIDO: Contar testes corretamente
20
+ this.testCount = this.countAllTests(suite);
21
+ console.log(`🎯 Iniciando execução de ${this.testCount} testes`);
22
+ // 📡 NETWORK LOGS: Capturar projectRoot para copiar logs depois
23
+ this.projectRoot = config.rootDir;
24
+ if (this.projectRoot.endsWith('tests') || this.projectRoot.endsWith('tests/') || this.projectRoot.endsWith('tests\\')) {
25
+ this.projectRoot = path.dirname(this.projectRoot);
26
+ }
27
+ // 🔧 NOVO: Mapear CNs e seus CTs
28
+ this.mapCNsAndCTs(suite);
29
+ // ✅ ESSENCIAL: Inicializar o gerenciador unificado
30
+ UnifiedReportManager.registrarInicioExecucao();
31
+ // ✅ CRÍTICO: Inicializar ExecutionTracker para garantir persistência
32
+ // Fazer de forma assíncrona sem bloquear
33
+ import('../hubdocs/ExecutionTracker.js')
34
+ .then(({ ExecutionTracker }) => {
35
+ ExecutionTracker.initialize();
36
+ })
37
+ .catch((error) => {
38
+ console.warn(`⚠️ CustomReporter: Erro ao inicializar ExecutionTracker: ${String(error)}`);
39
+ });
40
+ // ✅ NOVO: Inicializar AutoDocs para documentação automática
41
+ try {
42
+ AutoDocs.initialize({
43
+ projectName: 'TestHUB Project',
44
+ outputDir: './docs',
45
+ config: {
46
+ enabled: true,
47
+ categories: ['api', 'ssh', 'db', 'ui', 'mobile'],
48
+ generateSwagger: true,
49
+ includeScreenshots: true,
50
+ },
51
+ })
52
+ .catch((error) => {
53
+ Logger.warning(`Erro ao inicializar AutoDocs: ${String(error)}`);
54
+ });
55
+ }
56
+ catch (error) {
57
+ Logger.warning(`Erro ao carregar AutoDocs: ${String(error)}`);
58
+ }
59
+ }
60
+ countAllTests(suite) {
61
+ let count = 0;
62
+ // Contar testes diretos da suite
63
+ if (suite.tests) {
64
+ count += suite.tests.length;
65
+ }
66
+ // Contar testes das suites filhas (recursivo)
67
+ if (suite.suites) {
68
+ for (const childSuite of suite.suites) {
69
+ count += this.countAllTests(childSuite);
70
+ }
71
+ }
72
+ return count;
73
+ }
74
+ // 🔧 NOVO: Mapear CNs (test.describe) e seus CTs (test)
75
+ mapCNsAndCTs(suite) {
76
+ // Se a suite tem suites filhas (test.describe), mapear os CTs dentro
77
+ if (suite.suites && suite.suites.length > 0) {
78
+ for (const childSuite of suite.suites) {
79
+ // childSuite.title = CN (ex: "CN001_Orquestrador FTTH")
80
+ const cnName = childSuite.title;
81
+ const ctCount = childSuite.tests?.length || 0;
82
+ if (ctCount > 0) {
83
+ this.ctsByCN.set(cnName, {
84
+ total: ctCount,
85
+ completed: 0,
86
+ lastStatus: 'passed',
87
+ });
88
+ }
89
+ // Recursivo para test.describe aninhados
90
+ this.mapCNsAndCTs(childSuite);
91
+ }
92
+ }
93
+ }
94
+ detectProjectType(test) {
95
+ if (!test.location?.file) {
96
+ return 'Mixed';
97
+ }
98
+ const fileName = test.location.file.toLowerCase();
99
+ if (fileName.includes('frontend') || fileName.includes('page-object')) {
100
+ return 'Frontend';
101
+ }
102
+ if (fileName.includes('api') || fileName.includes('request')) {
103
+ return 'API';
104
+ }
105
+ if (fileName.includes('mobile')) {
106
+ return 'Mobile';
107
+ }
108
+ if (fileName.includes('ssh')) {
109
+ return 'SSH';
110
+ }
111
+ if (fileName.includes('banco') || fileName.includes('database')) {
112
+ return 'Banco';
113
+ }
114
+ if (fileName.includes('scenarios') || fileName.includes('cenarios')) {
115
+ return 'Scenarios';
116
+ }
117
+ return 'Mixed';
118
+ }
119
+ async getStatementTracker() {
120
+ if (this.statementTracker) {
121
+ return this.statementTracker;
122
+ }
123
+ let tracker = globalThis.statementTracker ||
124
+ globalThis.__SIMPLE_STATEMENT_TRACKER__;
125
+ if (!tracker) {
126
+ try {
127
+ tracker = new StatementTracker();
128
+ }
129
+ catch (error) {
130
+ console.log(`⚠️ [CustomReporter] Falha ao carregar StatementTracker dinamicamente: ${String(error)}`);
131
+ return undefined;
132
+ }
133
+ }
134
+ if (tracker && typeof tracker.finalizarCT === 'function') {
135
+ this.statementTracker = tracker;
136
+ globalThis.statementTracker = tracker;
137
+ return tracker;
138
+ }
139
+ return undefined;
140
+ }
141
+ onTestBegin(test) {
142
+ Logger.info(` ${this.completedTests + 1} ${test.location?.file}:${test.location?.line}:${test.location?.column} › ${test.parent?.title} › ${test.title}`);
143
+ const projectType = this.detectProjectType(test);
144
+ // ✅ CRÍTICO: Usar CN (test.parent.title = test.describe) como identificador
145
+ // test.title = CT (test), test.parent.title = CN (test.describe)
146
+ const cnName = test.parent?.title || test.title;
147
+ UnifiedReportManager.setTestContext(cnName, projectType);
148
+ UnifiedReportManager.registrarTeste(cnName, projectType);
149
+ console.log(`🏷️ Teste registrado: ${cnName} (${projectType})`);
150
+ }
151
+ async onTestEnd(test, result) {
152
+ this.completedTests++;
153
+ // ✅ CRÍTICO: Usar CN (test.parent.title = test.describe) como identificador
154
+ // test.title = CT (test), test.parent.title = CN (test.describe)
155
+ const cnName = test.parent?.title || test.title;
156
+ const ctName = test.title;
157
+ // ✅ CRÍTICO: Registrar resultado do teste (mesmo se falhar)
158
+ let status;
159
+ if (result.status === 'passed') {
160
+ status = 'passed';
161
+ }
162
+ else if (result.status === 'failed') {
163
+ status = 'failed';
164
+ }
165
+ else {
166
+ status = 'skipped';
167
+ }
168
+ console.log(`ℹ️ ${this.completedTests} ${test.location?.file}:${test.location?.line}:${test.location?.column} › ${cnName} › ${ctName}`);
169
+ globalThis.__SIMPLE_STATEMENT_CURRENT_TEST_NAME__ = cnName;
170
+ // ✅ CRÍTICO: Finalizar CT individual IMEDIATAMENTE
171
+ // Isso garante que CT001 seja marcado como PASSED antes de CT002 falhar
172
+ const errorMessage = result.errors && result.errors.length > 0
173
+ ? result.errors[0]?.message
174
+ : undefined;
175
+ try {
176
+ const tracker = await this.getStatementTracker();
177
+ if (tracker) {
178
+ // 🆕 CRÍTICO: Forçar carregamento dos dados do arquivo antes de finalizar
179
+ // O Reporter roda em processo separado dos testes, então precisamos
180
+ // garantir que os CTs criados nos testes estejam disponíveis aqui
181
+ if (typeof tracker.forceLoadFromFile === 'function') {
182
+ tracker.forceLoadFromFile();
183
+ }
184
+ tracker.finalizarCT(ctName, status, {
185
+ testName: cnName,
186
+ errorMessage,
187
+ });
188
+ }
189
+ else {
190
+ console.log(`⚠️ [CustomReporter] StatementTracker não disponível para finalizar CT "${ctName}"`);
191
+ }
192
+ }
193
+ catch (error) {
194
+ console.log(`⚠️ [CustomReporter] Erro ao finalizar CT individual:`, error);
195
+ }
196
+ finally {
197
+ // Limpar global
198
+ ;
199
+ globalThis.__SIMPLE_STATEMENT_CURRENT_TEST_NAME__ = undefined;
200
+ }
201
+ // 🔧 NOVO: Rastrear CTs completados por CN
202
+ const cnData = this.ctsByCN.get(cnName);
203
+ if (cnData) {
204
+ cnData.completed++;
205
+ if (status === 'failed') {
206
+ cnData.lastStatus = 'failed'; // Se qualquer CT falhar, CN falha
207
+ }
208
+ // ✅ SÓ FINALIZAR quando TODOS os CTs do CN terminarem
209
+ if (cnData.completed === cnData.total) {
210
+ // ✅ IMPORTANTE: Finalizar o CN apenas quando todos os CTs terminarem
211
+ await UnifiedReportManager.marcarFimTeste(cnName, cnData.lastStatus);
212
+ // ✅ NOVO: Registrar coverage usando CN
213
+ const projectType = this.detectProjectType(test);
214
+ const coverageType = this.mapToCoverageType(projectType);
215
+ const duration = result.duration || 0;
216
+ try {
217
+ await CoverageManager.registerTestCoverage(cnName, coverageType, undefined, // page não disponível no reporter
218
+ duration);
219
+ console.log(`📊 Coverage registrado para: ${cnName} (${coverageType})`);
220
+ }
221
+ catch (error) {
222
+ Logger.warning(`Erro ao registrar coverage: ${String(error)}`);
223
+ }
224
+ // ✅ CONTINUAR COM LÓGICA ORIGINAL usando CN
225
+ UnifiedReportManager.setTestDuration(cnName, result.duration);
226
+ console.log(`📊 Teste ${this.completedTests}/${this.testCount} concluído: ${cnName} [${cnData.lastStatus.toUpperCase()}]`);
227
+ // ✅ IMPORTANTE: Coletar dados mesmo se o teste falhar
228
+ try {
229
+ await UnifiedReportManager.coletarDadosDoTeste();
230
+ await UnifiedReportManager.anexarRelatorioIndividual();
231
+ }
232
+ catch (error) {
233
+ Logger.error(`❌ Erro ao processar teste ${cnName}`, error);
234
+ }
235
+ }
236
+ }
237
+ else {
238
+ // Teste individual sem test.describe - finalizar imediatamente
239
+ console.log(`ℹ️ [CustomReporter] Teste individual sem CN: "${ctName}"`);
240
+ await UnifiedReportManager.marcarFimTeste(ctName, status);
241
+ }
242
+ }
243
+ mapToCoverageType(projectType) {
244
+ switch (projectType) {
245
+ case 'Frontend':
246
+ return 'Frontend';
247
+ case 'API':
248
+ return 'API';
249
+ case 'Mobile':
250
+ return 'Mobile';
251
+ case 'SSH':
252
+ return 'SSH';
253
+ case 'Banco':
254
+ return 'Banco';
255
+ case 'Scenarios':
256
+ return 'Mixed'; // Scenarios mapeia para Mixed
257
+ case 'Mixed':
258
+ return 'Mixed';
259
+ default:
260
+ return 'Mixed';
261
+ }
262
+ }
263
+ async onEnd(_result) {
264
+ console.log('🏁 Finalizando execução dos testes...');
265
+ try {
266
+ // ✅ NOVO: Gerar documentação AutoDocs automaticamente ANTES do teardown
267
+ console.log('📚 Gerando documentação automática do projeto...');
268
+ // ✅ CRÍTICO: Garantir que ExecutionTracker FORCE um save final ANTES da geração
269
+ try {
270
+ // ✅ NOVO: Forçar save final dos dados ANTES de gerar documentação
271
+ console.log('📚 CustomReporter: Salvando dados finais...');
272
+ // Atualizar estatísticas finais
273
+ ExecutionTracker.updateTestStats(this.testCount, this.completedTests - (this.testCount - this.completedTests), this.testCount - this.completedTests);
274
+ // Verificar dados na memória antes da finalização
275
+ const memoryData = ExecutionTracker.getData();
276
+ // Finalizar APENAS para atualizar endTime - NÃO deve apagar dados
277
+ ExecutionTracker.finalize();
278
+ // Aguardar um pouco para garantir que o arquivo foi escrito
279
+ await new Promise((resolve) => setTimeout(resolve, 200));
280
+ // Verificar dados no arquivo após finalize
281
+ const fileData = ExecutionTracker.loadFromFile();
282
+ if (fileData) {
283
+ //Teste
284
+ }
285
+ else {
286
+ console.log('📊 CustomReporter: ⚠️ ERRO - Nenhum arquivo de dados encontrado após finalize!');
287
+ }
288
+ }
289
+ catch (error) {
290
+ console.log(`📊 CustomReporter: Erro ao preparar dados: ${String(error)}`);
291
+ }
292
+ try {
293
+ await AutoDocs.generateDocs();
294
+ console.log('📁 Documentação disponível em: docs/index.html');
295
+ console.log('🌐 Abra o arquivo docs/index.html no browser para visualizar');
296
+ }
297
+ catch (error) {
298
+ Logger.warning(`Erro ao gerar documentação AutoDocs: ${String(error)}`);
299
+ }
300
+ // ✅ IMPORTANTE: Chama UnifiedTeardown APÓS gerar documentação
301
+ // UnifiedTeardown será responsável por todos os relatórios finais para evitar duplicação
302
+ await UnifiedTeardown.run();
303
+ // 📡 NETWORK LOGS: Copiar para playwright-report/evidence/network-logs/
304
+ await this.copyNetworkLogsToReport();
305
+ }
306
+ catch (error) {
307
+ Logger.error('❌ Erro ao processar relatórios finais', error);
308
+ }
309
+ console.log(`📋 Total: ${this.completedTests} testes processados`);
310
+ }
311
+ /**
312
+ * 📡 Copia os network logs de test-results/network-logs/ para playwright-report/evidence/network-logs/
313
+ * Isso acontece APÓS a geração do relatório HTML pelo Playwright
314
+ */
315
+ async copyNetworkLogsToReport() {
316
+ const sourceDir = path.join(this.projectRoot, 'test-results', 'network-logs');
317
+ const destDir = path.join(this.projectRoot, 'playwright-report', 'evidence', 'network-logs');
318
+ if (!fs.existsSync(sourceDir)) {
319
+ return;
320
+ }
321
+ try {
322
+ // Cria pasta destino se não existir
323
+ if (!fs.existsSync(destDir)) {
324
+ fs.mkdirSync(destDir, { recursive: true });
325
+ }
326
+ // Lista arquivos na pasta source
327
+ const files = fs.readdirSync(sourceDir);
328
+ if (files.length === 0) {
329
+ return;
330
+ }
331
+ console.log('');
332
+ console.log('═══════════════════════════════════════════════════════════════════');
333
+ console.log('📡 [AutoCore] Copiando Network Logs para playwright-report/');
334
+ console.log('═══════════════════════════════════════════════════════════════════');
335
+ let copiedCount = 0;
336
+ for (const file of files) {
337
+ const sourcePath = path.join(sourceDir, file);
338
+ const destPath = path.join(destDir, file);
339
+ // Copia o arquivo (mantém original em test-results/)
340
+ fs.copyFileSync(sourcePath, destPath);
341
+ copiedCount++;
342
+ }
343
+ console.log(` ✅ ${copiedCount} arquivo(s) copiado(s) para:`);
344
+ console.log(` ${destDir}`);
345
+ console.log('═══════════════════════════════════════════════════════════════════');
346
+ console.log('');
347
+ }
348
+ catch (err) {
349
+ console.error('❌ [AutoCore] Erro ao copiar network logs:', err);
350
+ }
351
+ }
352
+ }
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Store compartilhado para transferência de dados entre projetos e testes
3
+ *
4
+ * Funcionalidades:
5
+ * - Cache em memória para performance
6
+ * - Persistência em arquivo JSON
7
+ * - Métodos especializados para diferentes tipos de dados
8
+ * - Limpeza automática com TTL
9
+ * - Thread-safe operations
10
+ * - Type-safe getters para evitar erros de null
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // ✅ FORMA CORRETA - Armazenar dados
15
+ * DataStore.set('user_id', '12345')
16
+ * DataStore.set('URL_CLIENTE', 'https://example.com')
17
+ *
18
+ * // ✅ FORMA CORRETA - Recuperar com type safety
19
+ * const userId = DataStore.getString('user_id') // retorna string (nunca null)
20
+ * const url = DataStore.getString('URL_CLIENTE', 'https://default.com') // com fallback
21
+ * const count = DataStore.getNumber('attempts', 0) // retorna number
22
+ * const isActive = DataStore.getBoolean('active') // retorna boolean
23
+ *
24
+ * // ✅ FORMA CORRETA - Quando você TEM CERTEZA que o valor existe
25
+ * const token = DataStore.getOrThrow<string>('ACCESS_TOKEN') // lança erro se null
26
+ *
27
+ * // ❌ EVITE - Pode causar erro TypeScript "Type 'string | null' is not assignable to type 'string'"
28
+ * const url: string = DataStore.get('URL_CLIENTE') // ❌ ERRO!
29
+ * Logger.info(DataStore.get('URL_CLIENTE')) // ❌ ERRO!
30
+ *
31
+ * // ✅ CORRIJA USANDO - Operador de coalescência nula
32
+ * const url: string = DataStore.get('URL_CLIENTE') ?? 'default'
33
+ * Logger.info(DataStore.getString('URL_CLIENTE'))
34
+ *
35
+ * // Armazenar com TTL
36
+ * DataStore.setWithTTL('session_token', 'abc123', 3600) // expira em 1h
37
+ *
38
+ * // Armazenar resultado de query
39
+ * DataStore.storeQueryResult('user_details', userData)
40
+ *
41
+ * // Armazenar screenshot
42
+ * DataStore.storeScreenshot('login_page', screenshotBuffer)
43
+ * ```
44
+ */
45
+ export declare class DataStore {
46
+ private static readonly dataFilePath;
47
+ private static readonly persistEnabled;
48
+ private static cache;
49
+ private static initialized;
50
+ private static lastSaveTime;
51
+ private static readonly SAVE_THROTTLE_MS;
52
+ /**
53
+ * Inicializa o DataStore carregando dados existentes
54
+ */
55
+ private static initialize;
56
+ /**
57
+ * Migra dados do formato antigo para o novo com metadados
58
+ */
59
+ private static migrateOldFormat;
60
+ /**
61
+ * Determina o tipo do item baseado na chave e valor
62
+ */
63
+ private static determineItemType;
64
+ /**
65
+ * Remove itens expirados baseado no TTL
66
+ */
67
+ private static cleanupExpiredItems;
68
+ /**
69
+ * Salva os dados no arquivo com throttling
70
+ */
71
+ private static save;
72
+ /**
73
+ * Armazena um valor com uma chave específica
74
+ */
75
+ static set(key: string, value: any): void;
76
+ /**
77
+ * Armazena um valor com TTL (Time To Live)
78
+ */
79
+ static setWithTTL(key: string, value: any, ttlSeconds: number): void;
80
+ /**
81
+ * Recupera um valor usando sua chave
82
+ */
83
+ static get<T = any>(key: string, defaultValue?: T | null): T | null;
84
+ /**
85
+ * Recupera um valor ou lança erro se não existir
86
+ * Útil quando você tem certeza que o valor existe
87
+ */
88
+ static getOrThrow<T = any>(key: string): T;
89
+ /**
90
+ * Recupera um valor string ou retorna string vazia
91
+ * Útil para evitar problemas com null
92
+ */
93
+ static getString(key: string, defaultValue?: string): string;
94
+ /**
95
+ * Recupera um valor number ou retorna 0
96
+ */
97
+ static getNumber(key: string, defaultValue?: number): number;
98
+ /**
99
+ * Recupera um valor boolean ou retorna false
100
+ */
101
+ static getBoolean(key: string, defaultValue?: boolean): boolean;
102
+ /**
103
+ * Verifica se uma chave existe e não expirou
104
+ */
105
+ static has(key: string): boolean;
106
+ /**
107
+ * Remove um valor específico
108
+ */
109
+ static remove(key: string): boolean;
110
+ /**
111
+ * Limpa todos os valores armazenados
112
+ */
113
+ static clear(): void;
114
+ /**
115
+ * Limpa apenas itens temporários
116
+ */
117
+ static clearTempItems(): void;
118
+ /**
119
+ * Retorna todos os dados armazenados com metadados
120
+ */
121
+ static getAll(): Record<string, any>;
122
+ /**
123
+ * Retorna estatísticas do DataStore
124
+ */
125
+ static getStats(): {
126
+ totalItems: number;
127
+ itemsByType: Record<string, number>;
128
+ expiredItems: number;
129
+ totalSizeKB: number;
130
+ };
131
+ /**
132
+ * Armazena resultado de consulta de banco para uso posterior
133
+ */
134
+ static storeQueryResult(queryName: string, data: any, ttlSeconds?: number): void;
135
+ /**
136
+ * Recupera resultado de consulta de banco
137
+ */
138
+ static getQueryResult<T = any>(queryName: string): T | null;
139
+ /**
140
+ * Armazena screenshot para evidências
141
+ */
142
+ static storeScreenshot(name: string, screenshotData: Buffer | string, metadata?: any): void;
143
+ /**
144
+ * Recupera screenshot
145
+ */
146
+ static getScreenshot(name: string): {
147
+ data: Buffer | string;
148
+ metadata: any;
149
+ timestamp: string;
150
+ } | null;
151
+ /**
152
+ * Armazena dados temporários com TTL curto
153
+ */
154
+ static setTemp(key: string, value: any, ttlSeconds?: number): void;
155
+ /**
156
+ * Recupera dados temporários
157
+ */
158
+ static getTemp<T = any>(key: string): T | null;
159
+ /**
160
+ * Força limpeza completa e remove arquivo
161
+ */
162
+ static cleanup(): void;
163
+ /**
164
+ * Backup dos dados para outro arquivo
165
+ */
166
+ static backup(backupPath?: string): string;
167
+ /**
168
+ * Restaura dados de um backup
169
+ */
170
+ static restore(backupPath: string): void;
171
+ }