@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,400 @@
1
+ import fs from 'node:fs';
2
+ import path from 'path';
3
+ import { ApiActions } from '../api/ApiActions.js';
4
+ import { MobileConnection } from '../appium/MobileConnection.js';
5
+ import { cleanupEnvLock } from '../config/envLoader.js';
6
+ import { BancoActions } from '../helpers/BancoActions.js';
7
+ import { saveReport, sendReportToOctane } from '../octane/OctaneReporter.js';
8
+ import { SSHActions } from '../ssh/SSHActions.js';
9
+ import { SSHClient } from '../ssh/SSHClient.js';
10
+ import { TestContext } from '../testContext/TestContext.js';
11
+ import { UnifiedReportManager } from '../testContext/UnifiedReportManager.js';
12
+ import { ConfigLogger } from './ConfigLogger.js';
13
+ import { DataStore } from './DataStore.js';
14
+ import { Logger } from './Logger.js';
15
+ import { StatementTracker } from '../hubdocs/StatementTracker.js';
16
+ import { EvidenceReportGenerator } from './EvidenceReportGenerator.js';
17
+ import TestHubReporter from '../testhub/TestHubReporter.js';
18
+ import { teamsFlushAfterExecution } from './TeamsFlushHook.js';
19
+ // 🔒 Flag para controlar se o envio para o Hub foi completado
20
+ let hubSendCompleted = false;
21
+ // Utilitário para log estilo Java
22
+ function javaStyleLog(context, message, level = 'INFO') {
23
+ const now = new Date();
24
+ const date = now
25
+ .toLocaleDateString('en-US', {
26
+ month: 'short',
27
+ day: '2-digit',
28
+ year: 'numeric',
29
+ })
30
+ .replace(',', '');
31
+ const time = now.toLocaleTimeString('en-US', { hour12: true });
32
+ // Exemplo: jul 08, 2025 9:45:44 AM OctaneManager
33
+ Logger.info(`${date} ${time} ${context}\n${level}: ${message}`);
34
+ }
35
+ export class UnifiedTeardown {
36
+ static async run() {
37
+ Logger.info('🏁 Iniciando teardown global...');
38
+ const projectType = process.env.PROJECT_TYPE || 'Desconhecido';
39
+ try {
40
+ // 📋 CRÍTICO: Salvar logs do terminal ANTES de finalizar
41
+ Logger.info('📋 Salvando logs do terminal...');
42
+ try {
43
+ if (globalThis.TerminalLogCapture) {
44
+ const logCapture = globalThis.TerminalLogCapture;
45
+ logCapture.saveToFile();
46
+ const stats = logCapture.getStats();
47
+ Logger.success(`Logs salvos: ${stats.totalLogs} total, ${stats.testsWithLogs} teste(s) com logs`);
48
+ }
49
+ }
50
+ catch (error) {
51
+ Logger.warning(`⚠️ Erro ao salvar logs do terminal: ${error}`);
52
+ }
53
+ // 🆕 CRÍTICO: Apenas salvar dados finais - CustomReporter já finalizou os CTs
54
+ Logger.info('🏁 Finalizando captura de CTs...');
55
+ try {
56
+ // ✅ Apenas salvar - NÃO refinalizar CTs que já foram finalizados pelo CustomReporter
57
+ await StatementTracker.finalize();
58
+ Logger.success('StatementTracker finalizado com sucesso');
59
+ }
60
+ catch (error) {
61
+ Logger.warning(`⚠️ Erro ao finalizar StatementTracker: ${error}`);
62
+ }
63
+ // ✅ APENAS FINALIZAR MÉTRICAS se ainda não foi finalizado
64
+ Logger.info('📊 Finalizando sistema de relatórios unificado...');
65
+ UnifiedReportManager.registrarFimExecucao();
66
+ const metrics = UnifiedReportManager.getMetrics();
67
+ if (metrics.totalTestes > 0) {
68
+ Logger.info(`📋 Execução concluída: ${metrics.totalTestes} teste(s)`);
69
+ // ✅ NOVO: Gerar relatório geral unificado
70
+ Logger.info('📄 Gerando relatório geral unificado...');
71
+ await UnifiedReportManager.anexarRelatorioGeral();
72
+ await EvidenceReportGenerator.generateEvidenceReport();
73
+ }
74
+ else {
75
+ Logger.info('ℹ️ Nenhum teste registrado');
76
+ }
77
+ // 🌐 Enviar resultados para AutoCore Hub
78
+ try {
79
+ Logger.info('🌐 Enviando resultados para AutoCore Hub...');
80
+ const reporter = new TestHubReporter();
81
+ // Enviar todos os resultados coletados em formato batch
82
+ await reporter.sendAllResults();
83
+ // ✅ CRÍTICO: Marcar envio como completado
84
+ hubSendCompleted = true;
85
+ // ✅ CRÍTICO: Aguardar para garantir que o envio HTTP foi completado
86
+ // Isso é especialmente importante no modo UI onde o processo pode terminar rapidamente
87
+ Logger.info('⏳ Aguardando confirmação de envio para o Hub...');
88
+ await new Promise((resolve) => setTimeout(resolve, 3000));
89
+ Logger.success('Envio para AutoCore Hub confirmado!');
90
+ }
91
+ catch (error) {
92
+ Logger.warning(`⚠️ Erro ao enviar resultados para AutoCore Hub: ${error}`);
93
+ Logger.warning(' Os testes foram executados normalmente, mas o envio falhou');
94
+ Logger.warning(' Verifique a conectividade com o backend AutoCore Hub');
95
+ }
96
+ // Envio para Octane/ALM se habilitado e variáveis obrigatórias presentes
97
+ if (process.env.ALM_ENABLE === 'true') {
98
+ const almHost = process.env.ALM_HOST;
99
+ const almDomain = process.env.ALM_DOMAIN;
100
+ const almProject = process.env.ALM_PROJECT;
101
+ const user = process.env.USER;
102
+ const password = process.env.PASSWORD;
103
+ const almTestRootPath = process.env.ALM_TEST_ROOT_PATH || '';
104
+ // Log estilo Java
105
+ Logger.info('########################################');
106
+ Logger.info('#');
107
+ Logger.info('#');
108
+ javaStyleLog('OctaneManager', 'INICIANDO API DO OCTANE');
109
+ Logger.info('#');
110
+ Logger.info('#');
111
+ Logger.info('########################################');
112
+ javaStyleLog('OctaneManager', `SERVER OCTANE: https://${almHost}`);
113
+ javaStyleLog('OctaneManager', `SHAREDSPACE OCTANE: ${almDomain}`);
114
+ javaStyleLog('OctaneManager', `WORKSPACE OCTANE: ${almProject}`);
115
+ if (almHost && almDomain && almProject && user && password) {
116
+ try {
117
+ javaStyleLog('OctaneManager', '[SUCCESS] Informações de conexão capturadas');
118
+ const octaneUrl = `https://${almHost}/api/shared_spaces/${almDomain}/workspaces/${encodeURIComponent(almProject)}/test-results${almTestRootPath ? `?rootPath=${encodeURIComponent(almTestRootPath)}` : ''}`;
119
+ saveReport();
120
+ const decodedPassword = Buffer.from(password, 'base64').toString('utf-8');
121
+ await sendReportToOctane(octaneUrl, user, decodedPassword);
122
+ javaStyleLog('OctaneManager', '[SUCCESS] Relatório enviado ao Octane/ALM');
123
+ }
124
+ catch (error) {
125
+ javaStyleLog('OctaneManager', '[ERROR] Ocorreu um erro ao gerar o relatório', 'ERROR');
126
+ if (error instanceof Error) {
127
+ javaStyleLog('OctaneManager', error.stack || error.message, 'ERROR');
128
+ }
129
+ else {
130
+ javaStyleLog('OctaneManager', String(error), 'ERROR');
131
+ }
132
+ javaStyleLog('OctaneManager', `❌ Falha ao enviar relatório ao Octane/ALM: ${String(error)}`, 'ERROR');
133
+ }
134
+ }
135
+ else {
136
+ javaStyleLog('OctaneManager', '⚠️ Variáveis de ambiente obrigatórias para ALM/Octane não preenchidas. Envio não realizado.', 'ERROR');
137
+ }
138
+ }
139
+ else {
140
+ javaStyleLog('controllers.OctaneManager', 'Integração ALM/Octane desabilitada (ALM_ENABLE=false)');
141
+ }
142
+ await projectSpecificCleanup(projectType);
143
+ await globalCleanup();
144
+ }
145
+ catch (error) {
146
+ javaStyleLog('controllers.OctaneManager', `❌ Erro durante teardown global: ${String(error)}`, 'ERROR');
147
+ }
148
+ finally {
149
+ // 📨 Teams relay flush obrigatório no fim de cada execução (v2.7.44 - item 13)
150
+ // Sempre roda em finally (passou/falhou) para garantir envio de notificações
151
+ try {
152
+ await teamsFlushAfterExecution(50);
153
+ }
154
+ catch (flushErr) {
155
+ Logger.warning(`[UnifiedTeardown] ⚠️ Teams flush falhou: ${String(flushErr)}`);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ async function projectSpecificCleanup(projectType) {
161
+ switch (projectType) {
162
+ case 'Mobile':
163
+ await cleanupMobile();
164
+ break;
165
+ case 'API':
166
+ await cleanupAPI();
167
+ break;
168
+ case 'Frontend':
169
+ await cleanupFrontend();
170
+ break;
171
+ case 'SSH':
172
+ await cleanupSSH();
173
+ break;
174
+ case 'Banco':
175
+ await cleanupBanco();
176
+ break;
177
+ case 'Mixed':
178
+ await cleanupMixed();
179
+ break;
180
+ case 'Cenários':
181
+ await cleanupCenarios();
182
+ break;
183
+ default:
184
+ await cleanupGeneric();
185
+ }
186
+ }
187
+ async function cleanupMobile() {
188
+ try {
189
+ await MobileConnection.closeSession();
190
+ }
191
+ catch (error) {
192
+ Logger.warning(`Erro ao fechar sessão mobile: ${String(error)}`);
193
+ }
194
+ try {
195
+ const hasActiveSession = TestContext.appiumDriver;
196
+ if (hasActiveSession) {
197
+ Logger.info('📱 Detectada sessão mobile ativa, finalizando...');
198
+ await Promise.race([
199
+ TestContext.resetAppiumDriver(),
200
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout na limpeza mobile')), 10_000)),
201
+ ]);
202
+ await MobileConnection.closeSession();
203
+ Logger.success('Sessão mobile finalizada no teardown global');
204
+ }
205
+ Object.keys(global).forEach((key) => {
206
+ if (key.startsWith('mobileCleanup_') ||
207
+ key.startsWith('updateActivity_')) {
208
+ delete global[key];
209
+ }
210
+ });
211
+ }
212
+ catch (error) {
213
+ Logger.warning(`⚠️ Erro ou timeout na limpeza mobile: ${String(error)}`);
214
+ // Forçar encerramento da sessão caso falhe
215
+ try {
216
+ await MobileConnection.closeSession();
217
+ }
218
+ catch (forceError) {
219
+ Logger.warning(`⚠️ Erro na limpeza forçada mobile: ${String(forceError)}`);
220
+ }
221
+ try {
222
+ TestContext.forceCleanup();
223
+ }
224
+ catch (forceError) {
225
+ Logger.warning(`⚠️ Erro na limpeza forçada mobile: ${String(forceError)}`);
226
+ }
227
+ }
228
+ }
229
+ async function cleanupAPI() {
230
+ try {
231
+ const metrics = ApiActions.getMetrics();
232
+ const hasActivity = metrics.totalRequisicoes > 0 ||
233
+ Object.keys(metrics.logsPerTest || {}).length > 0;
234
+ if (hasActivity) {
235
+ Logger.info('📊 Processando relatórios de API...');
236
+ await Promise.race([
237
+ (async () => {
238
+ ApiActions.registrarFimExecucao();
239
+ await new Promise((resolve) => setTimeout(resolve, 500));
240
+ })(),
241
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout nos relatórios API')), 15_000)),
242
+ ]);
243
+ }
244
+ }
245
+ catch (error) {
246
+ Logger.warning(`⚠️ Erro ao processar contextos API: ${String(error)}`);
247
+ }
248
+ }
249
+ async function cleanupFrontend() {
250
+ try {
251
+ await TestContext.finalizeAll();
252
+ }
253
+ catch (error) {
254
+ Logger.warning(`⚠️ Erro na limpeza Frontend: ${String(error)}`);
255
+ }
256
+ }
257
+ async function cleanupSSH() {
258
+ try {
259
+ Logger.info('🔌 Limpeza SSH iniciada...');
260
+ // Desconectar via SSHActions (método principal)
261
+ if (SSHActions.foiUtilizado()) {
262
+ Logger.info('🔌 SSH foi utilizado, desconectando...');
263
+ await SSHActions.desconectar();
264
+ SSHActions.registrarFimExecucao();
265
+ Logger.success('SSH desconectado com sucesso');
266
+ }
267
+ else {
268
+ Logger.info('ℹ️ SSH não foi utilizado');
269
+ }
270
+ // Garantir desconexão de qualquer SSHClient restante
271
+ await SSHClient.disconnectAll();
272
+ }
273
+ catch (error) {
274
+ Logger.warning(`⚠️ Erro na limpeza SSH: ${String(error)}`);
275
+ }
276
+ }
277
+ async function cleanupBanco() {
278
+ try {
279
+ if (BancoActions.foiUtilizado()) {
280
+ BancoActions.registrarFimExecucao();
281
+ }
282
+ else {
283
+ Logger.info('ℹ️ Banco não foi utilizado');
284
+ }
285
+ }
286
+ catch (error) {
287
+ Logger.warning(`⚠️ Erro na limpeza Banco: ${String(error)}`);
288
+ }
289
+ }
290
+ async function cleanupMixed() {
291
+ const cleanupTasks = [
292
+ cleanupAPI(),
293
+ cleanupFrontend(),
294
+ cleanupSSH(),
295
+ cleanupBanco(),
296
+ ];
297
+ if (process.env.USE_MOBILE === 'true') {
298
+ cleanupTasks.push(cleanupMobile());
299
+ }
300
+ try {
301
+ await Promise.allSettled(cleanupTasks);
302
+ }
303
+ catch (error) {
304
+ Logger.warning(`⚠️ Erro na limpeza Mixed: ${String(error)}`);
305
+ }
306
+ }
307
+ async function cleanupCenarios() {
308
+ try {
309
+ await TestContext.finalizeAll();
310
+ }
311
+ catch (error) {
312
+ Logger.warning(`⚠️ Erro na limpeza Cenários: ${String(error)}`);
313
+ }
314
+ }
315
+ async function cleanupGeneric() {
316
+ try {
317
+ await TestContext.finalizeAll();
318
+ }
319
+ catch (error) {
320
+ Logger.warning(`⚠️ Erro na limpeza genérica: ${String(error)}`);
321
+ }
322
+ }
323
+ async function globalCleanup() {
324
+ try {
325
+ await ConfigLogger.cleanup();
326
+ }
327
+ catch (error) {
328
+ Logger.warning(`⚠️ Erro ao limpar ConfigLogger: ${String(error)}`);
329
+ }
330
+ try {
331
+ cleanupEnvLock();
332
+ }
333
+ catch (error) {
334
+ Logger.warning(`⚠️ Erro ao limpar env locks: ${String(error)}`);
335
+ }
336
+ try {
337
+ DataStore.cleanup();
338
+ }
339
+ catch (error) {
340
+ Logger.warning(`⚠️ Erro ao limpar DataStore: ${String(error)}`);
341
+ }
342
+ try {
343
+ const tempFiles = [
344
+ '.test-data-store.json',
345
+ '.env.lock',
346
+ '.configlogger.lock',
347
+ '.autocore/xpaths.generated.ts',
348
+ ];
349
+ // ✅ ATUALIZADO: Remover .rbqa da limpeza automática
350
+ // Preservar para o usuário acessar execution-data.json
351
+ const tempDirs = [
352
+ // '.rbqa' // ❌ REMOVIDO: Manter dados para usuário acessar
353
+ ];
354
+ let cleanedFiles = 0;
355
+ for (const file of tempFiles) {
356
+ const filePath = path.resolve(process.cwd(), file);
357
+ if (fs.existsSync(filePath)) {
358
+ try {
359
+ fs.unlinkSync(filePath);
360
+ cleanedFiles++;
361
+ }
362
+ catch {
363
+ // Ignorar erros de arquivos individuais
364
+ }
365
+ }
366
+ }
367
+ // ✅ NOVO: Limpeza de diretórios temporários
368
+ let cleanedDirs = 0;
369
+ for (const dir of tempDirs) {
370
+ const dirPath = path.resolve(process.cwd(), dir);
371
+ if (fs.existsSync(dirPath)) {
372
+ try {
373
+ fs.rmSync(dirPath, { recursive: true, force: true });
374
+ cleanedDirs++;
375
+ Logger.success(`Pasta ${dir} removida com sucesso (final da execução)`);
376
+ }
377
+ catch (error) {
378
+ Logger.warning(`⚠️ Erro ao remover pasta ${dir}: ${String(error)}`);
379
+ }
380
+ }
381
+ }
382
+ if (cleanedFiles > 0 || cleanedDirs > 0) {
383
+ Logger.info(`🧹 Limpeza final: ${cleanedFiles} arquivo(s) e ${cleanedDirs} pasta(s) removidos`);
384
+ }
385
+ }
386
+ catch (error) {
387
+ Logger.warning(`⚠️ Erro na limpeza de arquivos temporários: ${String(error)}`);
388
+ }
389
+ }
390
+ // 🆕 Exportação padrão para uso como globalTeardown do Playwright
391
+ export default async function playwrightTeardown() {
392
+ await UnifiedTeardown.run();
393
+ // ✅ CRÍTICO: Garantir que o processo não termine antes do envio
394
+ // Isso é especialmente importante no modo UI onde o Playwright pode terminar rapidamente
395
+ if (!hubSendCompleted) {
396
+ Logger.info('⏳ Aguardando finalização de operações pendentes...');
397
+ await new Promise((resolve) => setTimeout(resolve, 5000));
398
+ }
399
+ Logger.info('🏁 Teardown global finalizado!');
400
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * XPath Catalog (v2.7.44 - items 17, 18, 19 & 21)
3
+ *
4
+ * Mantém catálogo de XPaths por página, atualizado via `extract_page_structure`,
5
+ * e oferece resolução inteligente para métodos de ação (click, fill, select…).
6
+ *
7
+ * Item 17 — `extractPageStructure` como base para catálogo
8
+ * Item 18 — `getCurrentXPathCatalog` + resolver interno
9
+ * Item 19 — Geração de `.autocore/xpaths.generated.ts` para IntelliSense
10
+ * Item 21 — `pushToBackend` para execuções Azure sem agente de IA
11
+ */
12
+ export interface XPathCatalogItem {
13
+ xpath: string;
14
+ tag?: string;
15
+ text?: string;
16
+ id?: string;
17
+ name?: string;
18
+ placeholder?: string;
19
+ ariaLabel?: string;
20
+ title?: string;
21
+ role?: string;
22
+ className?: string;
23
+ dataTestId?: string;
24
+ type?: string;
25
+ href?: string;
26
+ /** Score de relevância (quanto maior, melhor match) */
27
+ score?: number;
28
+ }
29
+ export interface CatalogGetOptions {
30
+ /** URL / página alvo. Sem informar usa currentPageUrl. */
31
+ page?: string;
32
+ /** Filtro de texto livre (ex: "catalogo de ofertas"). */
33
+ filter?: string;
34
+ /** Se true, força recarregar a estrutura da página. */
35
+ refresh?: boolean;
36
+ /** default true — usar somente XPaths desta página */
37
+ strictPage?: boolean;
38
+ /** Máximo de itens retornados */
39
+ maxItems?: number;
40
+ }
41
+ /** Formato do retorno bruto da estrutura de página (MCP / extractBasicPageStructure) */
42
+ export interface RawPageStructure {
43
+ title?: string;
44
+ url?: string;
45
+ buttons?: XPathCatalogItem[];
46
+ inputs?: XPathCatalogItem[];
47
+ links?: XPathCatalogItem[];
48
+ headings?: XPathCatalogItem[];
49
+ elements?: XPathCatalogItem[];
50
+ }
51
+ /** Payload enviado pelo framework ao backend quando MCP não está disponível */
52
+ export interface CatalogExtractRequest {
53
+ url: string;
54
+ pageHtml?: string;
55
+ pageStructure?: RawPageStructure;
56
+ filter?: string;
57
+ strictPage?: boolean;
58
+ xpaths?: string[];
59
+ /** Nome do arquivo Page Object (item 21 v2.7.44) */
60
+ pageFileName?: string;
61
+ /** Nome legível da página (item 21 v2.7.44) */
62
+ pageName?: string;
63
+ /** Nome da classe Page Object (item 21 v2.7.44) */
64
+ pageObjectName?: string;
65
+ /** Contexto de sessão (item 21 v2.7.44) */
66
+ context?: {
67
+ currentUrl?: string;
68
+ sessionId?: string;
69
+ };
70
+ /** Estado de runtime capturado (item 21 v2.7.44) */
71
+ runtimeState?: {
72
+ cookies?: unknown[];
73
+ localStorage?: Record<string, string>;
74
+ sessionStorage?: Record<string, string>;
75
+ };
76
+ }
77
+ /** Resposta do backend para push de DOM */
78
+ export interface CatalogExtractResponse {
79
+ success: boolean;
80
+ catalog?: XPathCatalogItem[];
81
+ xpaths?: string[];
82
+ error?: string;
83
+ }
84
+ /**
85
+ * Função que extrai a estrutura da página atual.
86
+ * Deve retornar `RawPageStructure` (format idêntico ao MCP extract_page_structure).
87
+ */
88
+ export type PageStructureExtractor = (pageUrl?: string) => Promise<RawPageStructure>;
89
+ export declare class XPathCatalog {
90
+ /** Injeta extrator de estrutura de página (obrigatório antes de usar) */
91
+ static setExtractor(fn: PageStructureExtractor): void;
92
+ /**
93
+ * Obtém catálogo de XPaths para a página fornecida (ou a página atual).
94
+ *
95
+ * @param currentPageUrl URL da página atual (usada quando opts.page não informado)
96
+ * @param opts Opções de consulta
97
+ */
98
+ static getCatalog(currentPageUrl: string, opts?: CatalogGetOptions): Promise<XPathCatalogItem[]>;
99
+ /**
100
+ * Recarrega a estrutura da página e atualiza o cache.
101
+ */
102
+ static refresh(pageUrl: string): Promise<XPathCatalogItem[]>;
103
+ /**
104
+ * Resolve um alvo (texto/xpath/id/name/placeholder) para o melhor XPath do catálogo.
105
+ * Retorna undefined se não encontrar match aceitável.
106
+ */
107
+ static resolveFromCatalog(target: string, pageUrl: string): string | undefined;
108
+ /** Limpa cache de uma página específica ou todo o cache */
109
+ static clearCache(pageUrl?: string): void;
110
+ /**
111
+ * Envia DOM/pageStructure capturado localmente para o backend processar.
112
+ *
113
+ * Usado em execuções Azure/CI onde o backend **não** tem acesso de rede
114
+ * à página alvo. O framework captura `pageHtml` e/ou `pageStructure`
115
+ * e envia para `POST /api/xpath-catalog/extract`.
116
+ *
117
+ * O backend enriquece com hints Redis e retorna catálogo + xpaths.
118
+ * O resultado alimenta o cache local por página.
119
+ *
120
+ * @param request Payload com URL, pageHtml/pageStructure e filtro opcional
121
+ * @param authToken JWT ou chave de automação (header Authorization)
122
+ * @returns Resposta do backend com catálogo enriquecido
123
+ *
124
+ * @example
125
+ * ```ts
126
+ * const html = await page.content()
127
+ * const result = await XPathCatalog.pushToBackend({
128
+ * url: page.url(),
129
+ * pageHtml: html,
130
+ * filter: 'cliente',
131
+ * })
132
+ * if (result?.catalog) {
133
+ * // catálogo já está no cache; usar via getCatalog()
134
+ * }
135
+ * ```
136
+ */
137
+ static pushToBackend(request: CatalogExtractRequest, authToken?: string): Promise<CatalogExtractResponse | null>;
138
+ /**
139
+ * Gera arquivo `.autocore/xpaths.generated.ts` com constantes tipadas por tela.
140
+ *
141
+ * @param outputDir Diretório de saída (default: `.autocore` na raiz do projeto)
142
+ */
143
+ static generateIntelliSenseFile(outputDir?: string): void;
144
+ /** Converte estrutura bruta em lista flat de XPathCatalogItem */
145
+ private static flatten;
146
+ /** Aplica filtro textual e ordena por relevância */
147
+ private static applyFilter;
148
+ /** Converte pageKey em nome de constante TypeScript */
149
+ private static pageKeyToConstName;
150
+ /** Converte item em nome de propriedade para IntelliSense */
151
+ private static itemToPropName;
152
+ }