qagentic-reporter 0.1.33 → 0.1.35

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.
@@ -667,6 +667,7 @@ var QAgenticCypressReporter = class {
667
667
  end: /* @__PURE__ */ new Date(),
668
668
  duration: 0
669
669
  };
670
+ this.failedTestResults = [];
670
671
  this.projectName = process.env.QAGENTIC_PROJECT_NAME || config.projectId || "Cypress E2E Tests";
671
672
  this.environment = process.env.QAGENTIC_ENVIRONMENT || process.env.NODE_ENV || "e2e";
672
673
  const apiUrl = process.env.QAGENTIC_API_URL || "http://localhost:8080";
@@ -734,10 +735,13 @@ var QAgenticCypressReporter = class {
734
735
  const displayError = test.displayError;
735
736
  if (errorInfo) {
736
737
  testResult.errorMessage = errorInfo.message || "Test failed";
737
- testResult.stackTrace = errorInfo.stack || errorInfo.toString();
738
+ testResult.stackTrace = errorInfo.stack || errorInfo.codeFrame || errorInfo.toString() || displayError || "";
738
739
  testResult.errorType = errorInfo.name || "AssertionError";
739
740
  } else if (displayError) {
740
741
  testResult.errorMessage = displayError;
742
+ if (displayError.includes("\n")) {
743
+ testResult.stackTrace = displayError;
744
+ }
741
745
  testResult.errorType = "AssertionError";
742
746
  } else {
743
747
  testResult.errorMessage = "Test assertion failed";
@@ -748,58 +752,10 @@ var QAgenticCypressReporter = class {
748
752
  type: testResult.errorType,
749
753
  hasStackTrace: !!testResult.stackTrace
750
754
  });
751
- if (test.invocationDetails?.relativeFile) {
752
- const testFileName = test.invocationDetails.relativeFile.replace(/\.ts$/, "");
753
- const testName = test.title[test.title.length - 1];
754
- const screenshotPaths = [
755
- // Mochawesome report assets location
756
- path2.join(
757
- process.cwd(),
758
- "cypress/reports/assets",
759
- testFileName,
760
- `${test.title.join(", ")} -- ${testName} (failed).png`
761
- ),
762
- // Alternative: without full title path
763
- path2.join(
764
- process.cwd(),
765
- "cypress/reports/assets",
766
- testFileName,
767
- `${testName} (failed).png`
768
- ),
769
- // Legacy cypress/screenshots location
770
- path2.join(
771
- process.cwd(),
772
- "cypress/screenshots",
773
- `${testFileName} -- ${testName} (failed).png`
774
- )
775
- ];
776
- let screenshotFound = false;
777
- for (const screenshotPath of screenshotPaths) {
778
- console.log("[QAagentic] Looking for screenshot at:", screenshotPath);
779
- if (fs2.existsSync(screenshotPath)) {
780
- try {
781
- const screenshotContent = fs2.readFileSync(screenshotPath);
782
- testResult.attachments.push({
783
- id: v4(),
784
- name: "screenshot",
785
- type: "image/png",
786
- extension: "png",
787
- content: screenshotContent.toString("base64"),
788
- size: screenshotContent.length,
789
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
790
- });
791
- console.log("[QAagentic] Added screenshot attachment:", screenshotPath);
792
- screenshotFound = true;
793
- break;
794
- } catch (err) {
795
- console.warn("[QAagentic] Failed to read screenshot:", err);
796
- }
797
- }
798
- }
799
- if (!screenshotFound) {
800
- console.log("[QAagentic] No screenshots found for test:", testName);
801
- }
802
- }
755
+ this.failedTestResults.push({
756
+ testResult,
757
+ test
758
+ });
803
759
  }
804
760
  this.stats.tests++;
805
761
  if (test.state === "passed") this.stats.passes++;
@@ -810,6 +766,65 @@ var QAgenticCypressReporter = class {
810
766
  console.warn("[QAagentic] Failed to report test:", error);
811
767
  }
812
768
  }
769
+ async attachScreenshots() {
770
+ console.log("[QAagentic] Attaching screenshots to failed tests");
771
+ for (const { testResult, test } of this.failedTestResults) {
772
+ if (test.invocationDetails?.relativeFile) {
773
+ const testFileName = test.invocationDetails.relativeFile.replace(/\.ts$/, "");
774
+ const testName = test.title[test.title.length - 1];
775
+ const fullTestTitle = test.title.join(", ");
776
+ const screenshotPaths = [
777
+ // Mochawesome report assets location with full title
778
+ path2.join(
779
+ process.cwd(),
780
+ "cypress/reports/assets",
781
+ testFileName,
782
+ `${fullTestTitle} -- ${testName} (failed).png`
783
+ ),
784
+ // Alternative: without full title path
785
+ path2.join(
786
+ process.cwd(),
787
+ "cypress/reports/assets",
788
+ testFileName,
789
+ `${testName} (failed).png`
790
+ ),
791
+ // Legacy cypress/screenshots location
792
+ path2.join(
793
+ process.cwd(),
794
+ "cypress/screenshots",
795
+ `${testFileName} -- ${testName} (failed).png`
796
+ )
797
+ ];
798
+ let screenshotFound = false;
799
+ for (const screenshotPath of screenshotPaths) {
800
+ console.log("[QAagentic] Looking for screenshot at:", screenshotPath);
801
+ if (fs2.existsSync(screenshotPath)) {
802
+ try {
803
+ const screenshotContent = fs2.readFileSync(screenshotPath);
804
+ testResult.attachments.push({
805
+ id: v4(),
806
+ name: "screenshot",
807
+ type: "image/png",
808
+ extension: "png",
809
+ content: screenshotContent.toString("base64"),
810
+ size: screenshotContent.length,
811
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
812
+ });
813
+ console.log("[QAagentic] Added screenshot attachment:", screenshotPath);
814
+ screenshotFound = true;
815
+ break;
816
+ } catch (err) {
817
+ console.warn("[QAagentic] Failed to read screenshot:", err);
818
+ }
819
+ }
820
+ }
821
+ if (!screenshotFound) {
822
+ console.log("[QAagentic] No screenshots found for test:", testName);
823
+ }
824
+ }
825
+ }
826
+ this.failedTestResults = [];
827
+ }
813
828
  async finalizeRun() {
814
829
  if (this.runFinalized || !this.currentRun) return;
815
830
  this.runFinalized = true;
@@ -842,9 +857,11 @@ function setupQAgentic(on, config) {
842
857
  return (async () => {
843
858
  if (!results?.tests) return;
844
859
  try {
860
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
845
861
  for (const test of results.tests) {
846
862
  await reporter.onTestEnd(test);
847
863
  }
864
+ await reporter.attachScreenshots();
848
865
  await reporter.finalizeRun();
849
866
  await new Promise((resolve) => setTimeout(resolve, 2e3));
850
867
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/cypress/simple-setup.ts"],"names":["fs","path","uuidv4","path3","fs3"],"mappings":"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","file":"simple-setup.mjs","sourcesContent":["/**\r\n * Configuration management for QAagentic SDK.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * API reporting configuration.\r\n */\r\nexport interface APIConfig {\r\n enabled: boolean;\r\n url: string;\r\n key?: string;\r\n timeout: number;\r\n retryCount: number;\r\n batchSize: number;\r\n}\r\n\r\n/**\r\n * Local file reporting configuration.\r\n */\r\nexport interface LocalConfig {\r\n enabled: boolean;\r\n outputDir: string;\r\n formats: ('json' | 'html' | 'junit')[];\r\n cleanOnStart: boolean;\r\n}\r\n\r\n/**\r\n * Feature flags configuration.\r\n */\r\nexport interface FeaturesConfig {\r\n aiAnalysis: boolean;\r\n failureClustering: boolean;\r\n flakyDetection: boolean;\r\n screenshots: 'always' | 'on_failure' | 'never';\r\n videos: 'always' | 'on_failure' | 'never';\r\n consoleOutput: boolean;\r\n}\r\n\r\n/**\r\n * Labels configuration.\r\n */\r\nexport interface LabelsConfig {\r\n team?: string;\r\n component?: string;\r\n environment?: string;\r\n custom: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Main configuration for QAagentic SDK.\r\n */\r\nexport interface QAgenticConfig {\r\n projectName: string;\r\n environment: string;\r\n api: APIConfig;\r\n local: LocalConfig;\r\n features: FeaturesConfig;\r\n labels: LabelsConfig;\r\n}\r\n\r\n/**\r\n * Default configuration values.\r\n */\r\nconst defaultConfig: QAgenticConfig = {\r\n projectName: 'default',\r\n environment: 'local',\r\n api: {\r\n enabled: true,\r\n url: 'http://localhost:8080',\r\n timeout: 30000,\r\n retryCount: 3,\r\n batchSize: 100,\r\n },\r\n local: {\r\n enabled: true,\r\n outputDir: './qagentic-results',\r\n formats: ['json', 'html'],\r\n cleanOnStart: true,\r\n },\r\n features: {\r\n aiAnalysis: true,\r\n failureClustering: true,\r\n flakyDetection: true,\r\n screenshots: 'on_failure',\r\n videos: 'on_failure',\r\n consoleOutput: true,\r\n },\r\n labels: {\r\n custom: {},\r\n },\r\n};\r\n\r\n// Global configuration instance\r\nlet globalConfig: QAgenticConfig = { ...defaultConfig };\r\n\r\n/**\r\n * Load configuration from environment variables.\r\n */\r\nfunction loadFromEnv(config: QAgenticConfig): QAgenticConfig {\r\n const env = process.env;\r\n\r\n // Project settings\r\n if (env.QAGENTIC_PROJECT_NAME) {\r\n config.projectName = env.QAGENTIC_PROJECT_NAME;\r\n }\r\n if (env.QAGENTIC_ENVIRONMENT) {\r\n config.environment = env.QAGENTIC_ENVIRONMENT;\r\n }\r\n\r\n // API settings\r\n if (env.QAGENTIC_API_ENABLED !== undefined) {\r\n config.api.enabled = env.QAGENTIC_API_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_API_URL) {\r\n config.api.url = env.QAGENTIC_API_URL;\r\n }\r\n if (env.QAGENTIC_API_KEY) {\r\n config.api.key = env.QAGENTIC_API_KEY;\r\n }\r\n\r\n // Local settings\r\n if (env.QAGENTIC_LOCAL_ENABLED !== undefined) {\r\n config.local.enabled = env.QAGENTIC_LOCAL_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_OUTPUT_DIR) {\r\n config.local.outputDir = env.QAGENTIC_OUTPUT_DIR;\r\n }\r\n if (env.QAGENTIC_OUTPUT_FORMAT) {\r\n config.local.formats = env.QAGENTIC_OUTPUT_FORMAT.split(',').map(\r\n (f) => f.trim() as 'json' | 'html' | 'junit'\r\n );\r\n }\r\n\r\n // Feature flags\r\n if (env.QAGENTIC_AI_ANALYSIS !== undefined) {\r\n config.features.aiAnalysis = env.QAGENTIC_AI_ANALYSIS.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_SCREENSHOTS) {\r\n config.features.screenshots = env.QAGENTIC_SCREENSHOTS as 'always' | 'on_failure' | 'never';\r\n }\r\n if (env.QAGENTIC_VIDEOS) {\r\n config.features.videos = env.QAGENTIC_VIDEOS as 'always' | 'on_failure' | 'never';\r\n }\r\n\r\n // Labels\r\n if (env.QAGENTIC_TEAM) {\r\n config.labels.team = env.QAGENTIC_TEAM;\r\n }\r\n if (env.QAGENTIC_COMPONENT) {\r\n config.labels.component = env.QAGENTIC_COMPONENT;\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Load configuration from YAML file.\r\n */\r\nfunction loadFromFile(filePath: string, config: QAgenticConfig): QAgenticConfig {\r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return config;\r\n }\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n // Simple YAML parsing for common cases\r\n const yaml = require('yaml');\r\n const data = yaml.parse(content);\r\n\r\n if (data.project) {\r\n if (data.project.name) config.projectName = data.project.name;\r\n if (data.project.environment) config.environment = data.project.environment;\r\n }\r\n\r\n if (data.reporting?.api) {\r\n if (data.reporting.api.enabled !== undefined) config.api.enabled = data.reporting.api.enabled;\r\n if (data.reporting.api.url) config.api.url = data.reporting.api.url;\r\n if (data.reporting.api.key) config.api.key = data.reporting.api.key;\r\n }\r\n\r\n if (data.reporting?.local) {\r\n if (data.reporting.local.enabled !== undefined)\r\n config.local.enabled = data.reporting.local.enabled;\r\n if (data.reporting.local.output_dir) config.local.outputDir = data.reporting.local.output_dir;\r\n if (data.reporting.local.formats) config.local.formats = data.reporting.local.formats;\r\n }\r\n\r\n if (data.features) {\r\n if (data.features.ai_analysis !== undefined)\r\n config.features.aiAnalysis = data.features.ai_analysis;\r\n if (data.features.failure_clustering !== undefined)\r\n config.features.failureClustering = data.features.failure_clustering;\r\n if (data.features.flaky_detection !== undefined)\r\n config.features.flakyDetection = data.features.flaky_detection;\r\n if (data.features.screenshots) config.features.screenshots = data.features.screenshots;\r\n if (data.features.videos) config.features.videos = data.features.videos;\r\n }\r\n\r\n if (data.labels) {\r\n if (data.labels.team) config.labels.team = data.labels.team;\r\n if (data.labels.component) config.labels.component = data.labels.component;\r\n config.labels.custom = { ...config.labels.custom, ...data.labels };\r\n }\r\n } catch (error) {\r\n console.warn(`Failed to load config from ${filePath}:`, error);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Auto-discover configuration from common locations.\r\n */\r\nfunction autoDiscover(): QAgenticConfig {\r\n const config = { ...defaultConfig };\r\n const cwd = process.cwd();\r\n\r\n const searchPaths = [\r\n path.join(cwd, 'qagentic.yaml'),\r\n path.join(cwd, 'qagentic.yml'),\r\n path.join(cwd, '.qagentic.yaml'),\r\n path.join(cwd, '.qagentic.yml'),\r\n ];\r\n\r\n for (const filePath of searchPaths) {\r\n if (fs.existsSync(filePath)) {\r\n loadFromFile(filePath, config);\r\n break;\r\n }\r\n }\r\n\r\n return loadFromEnv(config);\r\n}\r\n\r\n/**\r\n * Configure QAagentic SDK.\r\n */\r\nexport function configure(options: Partial<QAgenticConfig> & {\r\n projectName?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n} = {}): QAgenticConfig {\r\n globalConfig = autoDiscover();\r\n\r\n if (options.projectName) {\r\n globalConfig.projectName = options.projectName;\r\n }\r\n if (options.environment) {\r\n globalConfig.environment = options.environment;\r\n }\r\n if (options.apiUrl) {\r\n globalConfig.api.url = options.apiUrl;\r\n }\r\n if (options.apiKey) {\r\n globalConfig.api.key = options.apiKey;\r\n }\r\n if (options.outputDir) {\r\n globalConfig.local.outputDir = options.outputDir;\r\n }\r\n\r\n // Merge nested configs\r\n if (options.api) {\r\n globalConfig.api = { ...globalConfig.api, ...options.api };\r\n }\r\n if (options.local) {\r\n globalConfig.local = { ...globalConfig.local, ...options.local };\r\n }\r\n if (options.features) {\r\n globalConfig.features = { ...globalConfig.features, ...options.features };\r\n }\r\n if (options.labels) {\r\n globalConfig.labels = { ...globalConfig.labels, ...options.labels };\r\n }\r\n\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Get the current configuration.\r\n */\r\nexport function getConfig(): QAgenticConfig {\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults.\r\n */\r\nexport function resetConfig(): void {\r\n globalConfig = { ...defaultConfig };\r\n}\r\n","/**\r\n * Test execution status.\r\n */\r\n\r\nexport enum Status {\r\n PASSED = 'passed',\r\n FAILED = 'failed',\r\n BROKEN = 'broken',\r\n SKIPPED = 'skipped',\r\n PENDING = 'pending',\r\n RUNNING = 'running',\r\n UNKNOWN = 'unknown',\r\n}\r\n\r\n/**\r\n * Check if status represents a successful outcome.\r\n */\r\nexport function isSuccessful(status: Status): boolean {\r\n return status === Status.PASSED;\r\n}\r\n\r\n/**\r\n * Check if status represents a failure.\r\n */\r\nexport function isFailure(status: Status): boolean {\r\n return status === Status.FAILED || status === Status.BROKEN;\r\n}\r\n\r\n/**\r\n * Parse status from string.\r\n */\r\nexport function parseStatus(value: string): Status {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'passed':\r\n case 'pass':\r\n case 'success':\r\n return Status.PASSED;\r\n case 'failed':\r\n case 'fail':\r\n case 'failure':\r\n return Status.FAILED;\r\n case 'broken':\r\n case 'error':\r\n return Status.BROKEN;\r\n case 'skipped':\r\n case 'skip':\r\n case 'pending':\r\n return Status.SKIPPED;\r\n case 'running':\r\n return Status.RUNNING;\r\n default:\r\n return Status.UNKNOWN;\r\n }\r\n}\r\n","/**\r\n * Reporter classes for outputting test results to various destinations.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport axios from 'axios';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getConfig, QAgenticConfig } from './config';\r\nimport { Status } from './status';\r\nimport type { TestResult, TestRunResult, StepResult } from './types';\r\n\r\n/**\r\n * Base reporter interface.\r\n */\r\nexport interface BaseReporter {\r\n startRun(run: TestRunResult): void | Promise<void>;\r\n endRun(run: TestRunResult): void | Promise<void>;\r\n reportTest(test: TestResult): void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Console reporter with colored output.\r\n */\r\nexport class ConsoleReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`🚀 QAagentic Test Run - ${run.projectName}`);\r\n console.log(`Environment: ${run.environment}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n const icon = run.failed === 0 ? '✅' : '❌';\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`${icon} Test Run Complete - ${run.passRate.toFixed(1)}% Pass Rate`);\r\n console.log(`Passed: ${run.passed} | Failed: ${run.failed} | Skipped: ${run.skipped}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n reportTest(test: TestResult): void {\r\n if (!this.config.features.consoleOutput) return;\r\n\r\n const symbols: Record<Status, string> = {\r\n [Status.PASSED]: '✓',\r\n [Status.FAILED]: '✗',\r\n [Status.BROKEN]: '!',\r\n [Status.SKIPPED]: '○',\r\n [Status.PENDING]: '…',\r\n [Status.RUNNING]: '→',\r\n [Status.UNKNOWN]: '?',\r\n };\r\n\r\n const symbol = symbols[test.status as Status] || '?';\r\n console.log(` ${symbol} ${test.name}`);\r\n\r\n if (test.errorMessage) {\r\n console.log(` Error: ${test.errorMessage.slice(0, 100)}...`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * JSON file reporter.\r\n */\r\nexport class JSONReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n // Create output directory\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n\r\n // Clean previous results if configured\r\n if (this.config.local.cleanOnStart) {\r\n const files = fs.readdirSync(this.outputDir);\r\n for (const file of files) {\r\n if (file.endsWith('.json')) {\r\n fs.unlinkSync(path.join(this.outputDir, file));\r\n }\r\n }\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('json')) {\r\n return;\r\n }\r\n\r\n // Write run summary\r\n const runFile = path.join(this.outputDir, 'run.json');\r\n fs.writeFileSync(runFile, JSON.stringify(this.serializeRun(run), null, 2));\r\n\r\n // Write individual test results\r\n const testsDir = path.join(this.outputDir, 'tests');\r\n if (!fs.existsSync(testsDir)) {\r\n fs.mkdirSync(testsDir, { recursive: true });\r\n }\r\n\r\n for (const test of run.tests) {\r\n const testFile = path.join(testsDir, `${test.id}.json`);\r\n fs.writeFileSync(testFile, JSON.stringify(this.serializeTest(test), null, 2));\r\n }\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private serializeRun(run: TestRunResult): Record<string, unknown> {\r\n return {\r\n ...run,\r\n startTime: run.startTime?.toISOString(),\r\n endTime: run.endTime?.toISOString(),\r\n tests: run.tests.map((t) => this.serializeTest(t)),\r\n };\r\n }\r\n\r\n private serializeTest(test: TestResult): Record<string, unknown> {\r\n return {\r\n ...test,\r\n startTime: test.startTime?.toISOString(),\r\n endTime: test.endTime?.toISOString(),\r\n steps: test.steps.map((s) => this.serializeStep(s)),\r\n };\r\n }\r\n\r\n private serializeStep(step: StepResult): Record<string, unknown> {\r\n return {\r\n ...step,\r\n startTime: step.startTime?.toISOString(),\r\n endTime: step.endTime?.toISOString(),\r\n children: step.children.map((c) => this.serializeStep(c)),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * JUnit XML reporter for CI/CD compatibility.\r\n */\r\nexport class JUnitReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(_run: TestRunResult): void {\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('junit')) {\r\n return;\r\n }\r\n\r\n const xml = this.generateXml(run);\r\n const junitFile = path.join(this.outputDir, 'junit.xml');\r\n fs.writeFileSync(junitFile, xml);\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private generateXml(run: TestRunResult): string {\r\n const escape = (str: string) =>\r\n str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;');\r\n\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n xml += `<testsuite name=\"${escape(run.projectName)}\" `;\r\n xml += `tests=\"${run.total}\" `;\r\n xml += `failures=\"${run.failed}\" `;\r\n xml += `errors=\"${run.broken}\" `;\r\n xml += `skipped=\"${run.skipped}\" `;\r\n xml += `time=\"${(run.durationMs / 1000).toFixed(3)}\" `;\r\n xml += `timestamp=\"${run.startTime?.toISOString() || ''}\">\\n`;\r\n\r\n for (const test of run.tests) {\r\n xml += ` <testcase name=\"${escape(test.name)}\" `;\r\n xml += `classname=\"${escape(test.fullName)}\" `;\r\n xml += `time=\"${(test.durationMs / 1000).toFixed(3)}\"`;\r\n\r\n if (test.status === Status.PASSED) {\r\n xml += '/>\\n';\r\n } else if (test.status === Status.FAILED) {\r\n xml += '>\\n';\r\n xml += ` <failure message=\"${escape(test.errorMessage || 'Test failed')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'AssertionError')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</failure>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.BROKEN) {\r\n xml += '>\\n';\r\n xml += ` <error message=\"${escape(test.errorMessage || 'Test error')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'Error')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</error>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.SKIPPED) {\r\n xml += '>\\n';\r\n xml += ` <skipped${test.errorMessage ? ` message=\"${escape(test.errorMessage)}\"` : ''}/>\\n`;\r\n xml += ' </testcase>\\n';\r\n } else {\r\n xml += '/>\\n';\r\n }\r\n }\r\n\r\n xml += '</testsuite>\\n';\r\n return xml;\r\n }\r\n}\r\n\r\n/**\r\n * API reporter that sends results to QAagentic server.\r\n */\r\nexport class APIReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private batch: TestResult[] = [];\r\n private currentRun?: TestRunResult;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n async startRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled');\r\n return;\r\n }\r\n\r\n this.currentRun = run;\r\n this.batch = [];\r\n\r\n try {\r\n console.log('[APIReporter] Starting test run:', run.id);\r\n const url = `${this.config.api.url}/api/v1/runs`;\r\n console.log('[APIReporter] POST to:', url);\r\n \r\n const response = await axios.post(\r\n url,\r\n {\r\n id: run.id,\r\n name: run.name,\r\n project_name: run.projectName,\r\n environment: run.environment,\r\n start_time: run.startTime?.toISOString(),\r\n labels: run.labels,\r\n ci_build_id: run.ciBuildId,\r\n branch: run.branch,\r\n commit_hash: run.commitHash,\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Test run started successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to register run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async endRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) return;\r\n\r\n try {\r\n console.log('[APIReporter] endRun called, batch size:', this.batch.length);\r\n \r\n // Flush remaining batch - ALWAYS flush, even if batch is not full\r\n if (this.batch.length > 0) {\r\n console.log('[APIReporter] Flushing remaining', this.batch.length, 'test results');\r\n await this.flushBatch();\r\n console.log('[APIReporter] Batch flushed, waiting for processing...');\r\n await new Promise((resolve) => setTimeout(resolve, 1500));\r\n }\r\n\r\n console.log('[APIReporter] Finalizing run with test counts:', {\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n });\r\n \r\n const patchData = {\r\n end_time: run.endTime?.toISOString(),\r\n duration_ms: run.durationMs,\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n status: 'completed',\r\n };\r\n \r\n console.log('[APIReporter] PATCH to:', `${this.config.api.url}/api/v1/runs/${run.id}`);\r\n console.log('[APIReporter] PATCH data:', patchData);\r\n \r\n const response = await axios.patch(\r\n `${this.config.api.url}/api/v1/runs/${run.id}`,\r\n patchData,\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Run finalized successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to finalize run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async reportTest(test: TestResult): Promise<void> {\r\n console.log('[APIReporter] reportTest called for:', test.name, 'API enabled:', this.config.api.enabled);\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled, skipping test report');\r\n return;\r\n }\r\n\r\n console.log('[APIReporter] Adding test to batch:', test.name, '- batch size:', this.batch.length + 1);\r\n this.batch.push(test);\r\n\r\n if (this.batch.length >= this.config.api.batchSize) {\r\n console.log('[APIReporter] Batch size reached, flushing batch');\r\n await this.flushBatch();\r\n } else {\r\n console.log('[APIReporter] Batch size:', this.batch.length, '/', this.config.api.batchSize);\r\n }\r\n }\r\n\r\n private async flushBatch(): Promise<void> {\r\n if (this.batch.length === 0 || !this.currentRun) return;\r\n\r\n try {\r\n console.log('[APIReporter] Flushing batch of', this.batch.length, 'test results');\r\n const response = await axios.post(\r\n `${this.config.api.url}/api/v1/runs/${this.currentRun.id}/results`,\r\n this.batch.map((t) => ({\r\n id: t.id,\r\n name: t.name,\r\n full_name: t.fullName,\r\n status: t.status,\r\n duration_ms: t.durationMs,\r\n start_time: t.startTime?.toISOString(),\r\n end_time: t.endTime?.toISOString(),\r\n file_path: t.filePath,\r\n error_message: t.errorMessage,\r\n stack_trace: t.stackTrace,\r\n error_type: t.errorType,\r\n attachments: t.attachments,\r\n })),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Batch flushed successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to send test results to API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n } finally {\r\n this.batch = [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Main reporter that coordinates multiple output destinations.\r\n */\r\nexport class QAgenticReporter {\r\n private static instance: QAgenticReporter | null = null;\r\n private config: QAgenticConfig;\r\n private reporters: BaseReporter[] = [];\r\n private currentRun: TestRunResult | null = null;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n\r\n console.log('[QAgenticReporter] Initializing with config:', {\r\n projectName: this.config.projectName,\r\n environment: this.config.environment,\r\n apiEnabled: this.config.api.enabled,\r\n apiUrl: this.config.api.url,\r\n });\r\n\r\n // Initialize reporters based on config\r\n if (this.config.features.consoleOutput) {\r\n this.reporters.push(new ConsoleReporter(this.config));\r\n console.log('[QAgenticReporter] Added ConsoleReporter');\r\n }\r\n\r\n if (this.config.local.enabled) {\r\n this.reporters.push(new JSONReporter(this.config));\r\n console.log('[QAgenticReporter] Added JSONReporter');\r\n if (this.config.local.formats.includes('junit')) {\r\n this.reporters.push(new JUnitReporter(this.config));\r\n console.log('[QAgenticReporter] Added JUnitReporter');\r\n }\r\n }\r\n\r\n if (this.config.api.enabled) {\r\n this.reporters.push(new APIReporter(this.config));\r\n console.log('[QAgenticReporter] Added APIReporter');\r\n }\r\n\r\n console.log('[QAgenticReporter] Initialization complete with', this.reporters.length, 'reporters');\r\n }\r\n\r\n /**\r\n * Get singleton instance.\r\n */\r\n static getInstance(config?: QAgenticConfig): QAgenticReporter {\r\n if (!QAgenticReporter.instance) {\r\n QAgenticReporter.instance = new QAgenticReporter(config);\r\n }\r\n return QAgenticReporter.instance;\r\n }\r\n\r\n /**\r\n * Reset singleton instance.\r\n */\r\n static reset(): void {\r\n QAgenticReporter.instance = null;\r\n }\r\n\r\n /**\r\n * Start a new test run.\r\n */\r\n async startRun(options: Partial<TestRunResult> = {}): Promise<TestRunResult> {\r\n this.currentRun = {\r\n id: options.id || uuidv4(),\r\n name: options.name || `run_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: options.projectName || this.config.projectName,\r\n environment: options.environment || this.config.environment,\r\n startTime: new Date(),\r\n durationMs: 0,\r\n tests: [],\r\n total: 0,\r\n passed: 0,\r\n failed: 0,\r\n broken: 0,\r\n skipped: 0,\r\n passRate: 0,\r\n labels: { ...this.config.labels.custom, ...options.labels },\r\n parameters: options.parameters || {},\r\n ciBuildId: options.ciBuildId,\r\n ciBuildUrl: options.ciBuildUrl,\r\n branch: options.branch,\r\n commitHash: options.commitHash,\r\n };\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.startRun(this.currentRun);\r\n }\r\n\r\n return this.currentRun;\r\n }\r\n\r\n /**\r\n * End the current test run.\r\n */\r\n async endRun(): Promise<TestRunResult | null> {\r\n if (!this.currentRun) return null;\r\n\r\n this.currentRun.endTime = new Date();\r\n this.currentRun.durationMs =\r\n this.currentRun.endTime.getTime() - (this.currentRun.startTime?.getTime() || 0);\r\n this.currentRun.passRate =\r\n this.currentRun.total > 0 ? (this.currentRun.passed / this.currentRun.total) * 100 : 0;\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.endRun(this.currentRun);\r\n }\r\n\r\n const run = this.currentRun;\r\n this.currentRun = null;\r\n return run;\r\n }\r\n\r\n /**\r\n * Report a test result.\r\n */\r\n async reportTest(test: TestResult): Promise<void> {\r\n if (!this.currentRun) {\r\n console.warn('[QAgenticReporter] No active run to report test');\r\n return;\r\n }\r\n\r\n this.currentRun.tests.push(test);\r\n this.currentRun.total++;\r\n\r\n switch (test.status) {\r\n case 'passed':\r\n this.currentRun.passed++;\r\n break;\r\n case 'failed':\r\n this.currentRun.failed++;\r\n break;\r\n case 'broken':\r\n this.currentRun.broken++;\r\n break;\r\n case 'skipped':\r\n this.currentRun.skipped++;\r\n break;\r\n }\r\n\r\n console.log('[QAgenticReporter] Test counts:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n broken: this.currentRun.broken,\r\n skipped: this.currentRun.skipped,\r\n });\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.reportTest(test);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current test run.\r\n */\r\n getCurrentRun(): TestRunResult | null {\r\n return this.currentRun;\r\n }\r\n}\r\n\r\n/**\r\n * Get the global reporter instance.\r\n */\r\nexport function getReporter(config?: QAgenticConfig): QAgenticReporter {\r\n return QAgenticReporter.getInstance(config);\r\n}\r\n","/**\r\n * QAagentic Cypress - Simplified Setup\r\n * \r\n * One-line integration for Cypress projects\r\n * No complex configuration needed!\r\n * \r\n * @example\r\n * ```typescript\r\n * // cypress.config.ts - Just add this one line!\r\n * import { setupQAgentic } from '@qagentic/reporter/cypress/simple-setup';\r\n * \r\n * export default defineConfig({\r\n * e2e: {\r\n * setupNodeEvents(on, config) {\r\n * setupQAgentic(on, config); // That's it!\r\n * return config;\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { configure } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { parseStatus } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n/**\r\n * Simplified QAagentic setup for Cypress\r\n * Auto-detects configuration from environment variables\r\n * Zero manual configuration needed!\r\n */\r\nclass QAgenticCypressReporter {\r\n private reporter: QAgenticReporter;\r\n private currentRun: TestRunResult | null = null;\r\n private projectName: string;\r\n private environment: string;\r\n private runStarted = false;\r\n private runFinalized = false;\r\n private stats = {\r\n suites: 0,\r\n tests: 0,\r\n passes: 0,\r\n pending: 0,\r\n failures: 0,\r\n start: new Date(),\r\n end: new Date(),\r\n duration: 0\r\n };\r\n\r\n constructor(config: any) {\r\n // Auto-configure from environment or defaults\r\n this.projectName = process.env.QAGENTIC_PROJECT_NAME || \r\n config.projectId || \r\n 'Cypress E2E Tests';\r\n \r\n this.environment = process.env.QAGENTIC_ENVIRONMENT || \r\n process.env.NODE_ENV || \r\n 'e2e';\r\n \r\n const apiUrl = process.env.QAGENTIC_API_URL || \r\n 'http://localhost:8080';\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n apiUrl,\r\n outputDir: './qagentic-results',\r\n });\r\n\r\n this.reporter = QAgenticReporter.getInstance();\r\n this.stats.start = new Date();\r\n }\r\n\r\n async onRunBegin() {\r\n try {\r\n console.log('[QAagentic] onRunBegin called, calling reporter.startRun()');\r\n this.currentRun = await this.reporter.startRun({\r\n name: this.projectName,\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n startTime: this.stats.start,\r\n });\r\n console.log('[QAagentic] onRunBegin completed, currentRun:', this.currentRun?.id);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async ensureRunStarted() {\r\n if (this.runStarted) return;\r\n \r\n this.runStarted = true;\r\n console.log('[QAagentic] Ensuring run is started');\r\n try {\r\n await this.onRunBegin();\r\n console.log('[QAagentic] Run started successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async onTestEnd(test: any) {\r\n // Ensure run is started before processing tests\r\n await this.ensureRunStarted();\r\n \r\n if (!this.currentRun) return;\r\n\r\n try {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title[test.title.length - 1],\r\n fullName: test.title.join(' > '),\r\n status: parseStatus(test.state),\r\n durationMs: test.duration,\r\n startTime: new Date(Date.now() - test.duration),\r\n endTime: new Date(),\r\n labels: {\r\n suite: test.title.slice(0, -1).join(' > '),\r\n feature: test.title[0],\r\n },\r\n links: [],\r\n parameters: {},\r\n steps: [],\r\n attachments: [],\r\n filePath: test.invocationDetails?.relativeFile || '',\r\n retryCount: 0,\r\n isRetry: false,\r\n isFlaky: false,\r\n };\r\n\r\n // Capture error details for failed tests\r\n if (test.state === 'failed') {\r\n // Try multiple ways to get error information\r\n const errorInfo = test.err || test.error || test.failure;\r\n const displayError = test.displayError;\r\n \r\n if (errorInfo) {\r\n testResult.errorMessage = errorInfo.message || 'Test failed';\r\n testResult.stackTrace = errorInfo.stack || errorInfo.toString();\r\n testResult.errorType = errorInfo.name || 'AssertionError';\r\n } else if (displayError) {\r\n // Use displayError from Cypress test object\r\n testResult.errorMessage = displayError;\r\n testResult.errorType = 'AssertionError';\r\n } else {\r\n // Fallback: create error from test state\r\n testResult.errorMessage = 'Test assertion failed';\r\n testResult.errorType = 'AssertionError';\r\n }\r\n \r\n console.log('[QAagentic] Test failed - Error:', {\r\n message: testResult.errorMessage,\r\n type: testResult.errorType,\r\n hasStackTrace: !!testResult.stackTrace,\r\n });\r\n\r\n // Capture screenshots if available (from Cypress reports assets folder)\r\n if (test.invocationDetails?.relativeFile) {\r\n const testFileName = test.invocationDetails.relativeFile.replace(/\\.ts$/, '');\r\n const testName = test.title[test.title.length - 1];\r\n \r\n // Try multiple screenshot locations\r\n const screenshotPaths = [\r\n // Mochawesome report assets location\r\n path.join(\r\n process.cwd(),\r\n 'cypress/reports/assets',\r\n testFileName,\r\n `${test.title.join(', ')} -- ${testName} (failed).png`\r\n ),\r\n // Alternative: without full title path\r\n path.join(\r\n process.cwd(),\r\n 'cypress/reports/assets',\r\n testFileName,\r\n `${testName} (failed).png`\r\n ),\r\n // Legacy cypress/screenshots location\r\n path.join(\r\n process.cwd(),\r\n 'cypress/screenshots',\r\n `${testFileName} -- ${testName} (failed).png`\r\n ),\r\n ];\r\n \r\n let screenshotFound = false;\r\n for (const screenshotPath of screenshotPaths) {\r\n console.log('[QAagentic] Looking for screenshot at:', screenshotPath);\r\n \r\n if (fs.existsSync(screenshotPath)) {\r\n try {\r\n const screenshotContent = fs.readFileSync(screenshotPath);\r\n testResult.attachments.push({\r\n id: uuidv4(),\r\n name: 'screenshot',\r\n type: 'image/png',\r\n extension: 'png',\r\n content: screenshotContent.toString('base64'),\r\n size: screenshotContent.length,\r\n timestamp: new Date().toISOString(),\r\n });\r\n console.log('[QAagentic] Added screenshot attachment:', screenshotPath);\r\n screenshotFound = true;\r\n break;\r\n } catch (err) {\r\n console.warn('[QAagentic] Failed to read screenshot:', err);\r\n }\r\n }\r\n }\r\n \r\n if (!screenshotFound) {\r\n console.log('[QAagentic] No screenshots found for test:', testName);\r\n }\r\n }\r\n }\r\n\r\n // Update stats\r\n this.stats.tests++;\r\n if (test.state === 'passed') this.stats.passes++;\r\n if (test.state === 'failed') this.stats.failures++;\r\n if (test.state === 'pending') this.stats.pending++;\r\n\r\n await this.reporter.reportTest(testResult);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to report test:', error);\r\n }\r\n }\r\n\r\n async finalizeRun() {\r\n if (this.runFinalized || !this.currentRun) return;\r\n \r\n this.runFinalized = true;\r\n console.log('[QAagentic] Finalizing run');\r\n \r\n try {\r\n this.stats.end = new Date();\r\n this.stats.duration = this.stats.end.getTime() - this.stats.start.getTime();\r\n\r\n // Update run with final stats\r\n this.currentRun.endTime = this.stats.end;\r\n this.currentRun.durationMs = this.stats.duration;\r\n this.currentRun.total = this.stats.tests;\r\n this.currentRun.passed = this.stats.passes;\r\n this.currentRun.failed = this.stats.failures;\r\n this.currentRun.skipped = this.stats.pending;\r\n\r\n console.log('[QAagentic] Calling reporter.endRun with stats:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n skipped: this.currentRun.skipped,\r\n });\r\n \r\n await this.reporter.endRun();\r\n console.log('[QAagentic] Run finalized successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to finalize run:', error);\r\n }\r\n }\r\n\r\n}\r\n\r\nexport function setupQAgentic(on: any, config: any): void {\r\n const reporter = new QAgenticCypressReporter(config);\r\n\r\n // Simple approach: Process tests in after:spec and finalize immediately\r\n on('after:spec', (_spec: any, results: any) => {\r\n return (async () => {\r\n if (!results?.tests) return;\r\n \r\n try {\r\n // Process all tests from this spec\r\n for (const test of results.tests) {\r\n await reporter.onTestEnd(test);\r\n }\r\n \r\n // Finalize run after all tests are processed\r\n await reporter.finalizeRun();\r\n \r\n // Wait for API calls to complete\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Error processing spec:', error);\r\n }\r\n })();\r\n });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/cypress/simple-setup.ts"],"names":["fs","path","uuidv4","path3","fs3"],"mappings":"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","file":"simple-setup.mjs","sourcesContent":["/**\r\n * Configuration management for QAagentic SDK.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * API reporting configuration.\r\n */\r\nexport interface APIConfig {\r\n enabled: boolean;\r\n url: string;\r\n key?: string;\r\n timeout: number;\r\n retryCount: number;\r\n batchSize: number;\r\n}\r\n\r\n/**\r\n * Local file reporting configuration.\r\n */\r\nexport interface LocalConfig {\r\n enabled: boolean;\r\n outputDir: string;\r\n formats: ('json' | 'html' | 'junit')[];\r\n cleanOnStart: boolean;\r\n}\r\n\r\n/**\r\n * Feature flags configuration.\r\n */\r\nexport interface FeaturesConfig {\r\n aiAnalysis: boolean;\r\n failureClustering: boolean;\r\n flakyDetection: boolean;\r\n screenshots: 'always' | 'on_failure' | 'never';\r\n videos: 'always' | 'on_failure' | 'never';\r\n consoleOutput: boolean;\r\n}\r\n\r\n/**\r\n * Labels configuration.\r\n */\r\nexport interface LabelsConfig {\r\n team?: string;\r\n component?: string;\r\n environment?: string;\r\n custom: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Main configuration for QAagentic SDK.\r\n */\r\nexport interface QAgenticConfig {\r\n projectName: string;\r\n environment: string;\r\n api: APIConfig;\r\n local: LocalConfig;\r\n features: FeaturesConfig;\r\n labels: LabelsConfig;\r\n}\r\n\r\n/**\r\n * Default configuration values.\r\n */\r\nconst defaultConfig: QAgenticConfig = {\r\n projectName: 'default',\r\n environment: 'local',\r\n api: {\r\n enabled: true,\r\n url: 'http://localhost:8080',\r\n timeout: 30000,\r\n retryCount: 3,\r\n batchSize: 100,\r\n },\r\n local: {\r\n enabled: true,\r\n outputDir: './qagentic-results',\r\n formats: ['json', 'html'],\r\n cleanOnStart: true,\r\n },\r\n features: {\r\n aiAnalysis: true,\r\n failureClustering: true,\r\n flakyDetection: true,\r\n screenshots: 'on_failure',\r\n videos: 'on_failure',\r\n consoleOutput: true,\r\n },\r\n labels: {\r\n custom: {},\r\n },\r\n};\r\n\r\n// Global configuration instance\r\nlet globalConfig: QAgenticConfig = { ...defaultConfig };\r\n\r\n/**\r\n * Load configuration from environment variables.\r\n */\r\nfunction loadFromEnv(config: QAgenticConfig): QAgenticConfig {\r\n const env = process.env;\r\n\r\n // Project settings\r\n if (env.QAGENTIC_PROJECT_NAME) {\r\n config.projectName = env.QAGENTIC_PROJECT_NAME;\r\n }\r\n if (env.QAGENTIC_ENVIRONMENT) {\r\n config.environment = env.QAGENTIC_ENVIRONMENT;\r\n }\r\n\r\n // API settings\r\n if (env.QAGENTIC_API_ENABLED !== undefined) {\r\n config.api.enabled = env.QAGENTIC_API_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_API_URL) {\r\n config.api.url = env.QAGENTIC_API_URL;\r\n }\r\n if (env.QAGENTIC_API_KEY) {\r\n config.api.key = env.QAGENTIC_API_KEY;\r\n }\r\n\r\n // Local settings\r\n if (env.QAGENTIC_LOCAL_ENABLED !== undefined) {\r\n config.local.enabled = env.QAGENTIC_LOCAL_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_OUTPUT_DIR) {\r\n config.local.outputDir = env.QAGENTIC_OUTPUT_DIR;\r\n }\r\n if (env.QAGENTIC_OUTPUT_FORMAT) {\r\n config.local.formats = env.QAGENTIC_OUTPUT_FORMAT.split(',').map(\r\n (f) => f.trim() as 'json' | 'html' | 'junit'\r\n );\r\n }\r\n\r\n // Feature flags\r\n if (env.QAGENTIC_AI_ANALYSIS !== undefined) {\r\n config.features.aiAnalysis = env.QAGENTIC_AI_ANALYSIS.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_SCREENSHOTS) {\r\n config.features.screenshots = env.QAGENTIC_SCREENSHOTS as 'always' | 'on_failure' | 'never';\r\n }\r\n if (env.QAGENTIC_VIDEOS) {\r\n config.features.videos = env.QAGENTIC_VIDEOS as 'always' | 'on_failure' | 'never';\r\n }\r\n\r\n // Labels\r\n if (env.QAGENTIC_TEAM) {\r\n config.labels.team = env.QAGENTIC_TEAM;\r\n }\r\n if (env.QAGENTIC_COMPONENT) {\r\n config.labels.component = env.QAGENTIC_COMPONENT;\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Load configuration from YAML file.\r\n */\r\nfunction loadFromFile(filePath: string, config: QAgenticConfig): QAgenticConfig {\r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return config;\r\n }\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n // Simple YAML parsing for common cases\r\n const yaml = require('yaml');\r\n const data = yaml.parse(content);\r\n\r\n if (data.project) {\r\n if (data.project.name) config.projectName = data.project.name;\r\n if (data.project.environment) config.environment = data.project.environment;\r\n }\r\n\r\n if (data.reporting?.api) {\r\n if (data.reporting.api.enabled !== undefined) config.api.enabled = data.reporting.api.enabled;\r\n if (data.reporting.api.url) config.api.url = data.reporting.api.url;\r\n if (data.reporting.api.key) config.api.key = data.reporting.api.key;\r\n }\r\n\r\n if (data.reporting?.local) {\r\n if (data.reporting.local.enabled !== undefined)\r\n config.local.enabled = data.reporting.local.enabled;\r\n if (data.reporting.local.output_dir) config.local.outputDir = data.reporting.local.output_dir;\r\n if (data.reporting.local.formats) config.local.formats = data.reporting.local.formats;\r\n }\r\n\r\n if (data.features) {\r\n if (data.features.ai_analysis !== undefined)\r\n config.features.aiAnalysis = data.features.ai_analysis;\r\n if (data.features.failure_clustering !== undefined)\r\n config.features.failureClustering = data.features.failure_clustering;\r\n if (data.features.flaky_detection !== undefined)\r\n config.features.flakyDetection = data.features.flaky_detection;\r\n if (data.features.screenshots) config.features.screenshots = data.features.screenshots;\r\n if (data.features.videos) config.features.videos = data.features.videos;\r\n }\r\n\r\n if (data.labels) {\r\n if (data.labels.team) config.labels.team = data.labels.team;\r\n if (data.labels.component) config.labels.component = data.labels.component;\r\n config.labels.custom = { ...config.labels.custom, ...data.labels };\r\n }\r\n } catch (error) {\r\n console.warn(`Failed to load config from ${filePath}:`, error);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Auto-discover configuration from common locations.\r\n */\r\nfunction autoDiscover(): QAgenticConfig {\r\n const config = { ...defaultConfig };\r\n const cwd = process.cwd();\r\n\r\n const searchPaths = [\r\n path.join(cwd, 'qagentic.yaml'),\r\n path.join(cwd, 'qagentic.yml'),\r\n path.join(cwd, '.qagentic.yaml'),\r\n path.join(cwd, '.qagentic.yml'),\r\n ];\r\n\r\n for (const filePath of searchPaths) {\r\n if (fs.existsSync(filePath)) {\r\n loadFromFile(filePath, config);\r\n break;\r\n }\r\n }\r\n\r\n return loadFromEnv(config);\r\n}\r\n\r\n/**\r\n * Configure QAagentic SDK.\r\n */\r\nexport function configure(options: Partial<QAgenticConfig> & {\r\n projectName?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n} = {}): QAgenticConfig {\r\n globalConfig = autoDiscover();\r\n\r\n if (options.projectName) {\r\n globalConfig.projectName = options.projectName;\r\n }\r\n if (options.environment) {\r\n globalConfig.environment = options.environment;\r\n }\r\n if (options.apiUrl) {\r\n globalConfig.api.url = options.apiUrl;\r\n }\r\n if (options.apiKey) {\r\n globalConfig.api.key = options.apiKey;\r\n }\r\n if (options.outputDir) {\r\n globalConfig.local.outputDir = options.outputDir;\r\n }\r\n\r\n // Merge nested configs\r\n if (options.api) {\r\n globalConfig.api = { ...globalConfig.api, ...options.api };\r\n }\r\n if (options.local) {\r\n globalConfig.local = { ...globalConfig.local, ...options.local };\r\n }\r\n if (options.features) {\r\n globalConfig.features = { ...globalConfig.features, ...options.features };\r\n }\r\n if (options.labels) {\r\n globalConfig.labels = { ...globalConfig.labels, ...options.labels };\r\n }\r\n\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Get the current configuration.\r\n */\r\nexport function getConfig(): QAgenticConfig {\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults.\r\n */\r\nexport function resetConfig(): void {\r\n globalConfig = { ...defaultConfig };\r\n}\r\n","/**\r\n * Test execution status.\r\n */\r\n\r\nexport enum Status {\r\n PASSED = 'passed',\r\n FAILED = 'failed',\r\n BROKEN = 'broken',\r\n SKIPPED = 'skipped',\r\n PENDING = 'pending',\r\n RUNNING = 'running',\r\n UNKNOWN = 'unknown',\r\n}\r\n\r\n/**\r\n * Check if status represents a successful outcome.\r\n */\r\nexport function isSuccessful(status: Status): boolean {\r\n return status === Status.PASSED;\r\n}\r\n\r\n/**\r\n * Check if status represents a failure.\r\n */\r\nexport function isFailure(status: Status): boolean {\r\n return status === Status.FAILED || status === Status.BROKEN;\r\n}\r\n\r\n/**\r\n * Parse status from string.\r\n */\r\nexport function parseStatus(value: string): Status {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'passed':\r\n case 'pass':\r\n case 'success':\r\n return Status.PASSED;\r\n case 'failed':\r\n case 'fail':\r\n case 'failure':\r\n return Status.FAILED;\r\n case 'broken':\r\n case 'error':\r\n return Status.BROKEN;\r\n case 'skipped':\r\n case 'skip':\r\n case 'pending':\r\n return Status.SKIPPED;\r\n case 'running':\r\n return Status.RUNNING;\r\n default:\r\n return Status.UNKNOWN;\r\n }\r\n}\r\n","/**\r\n * Reporter classes for outputting test results to various destinations.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport axios from 'axios';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getConfig, QAgenticConfig } from './config';\r\nimport { Status } from './status';\r\nimport type { TestResult, TestRunResult, StepResult } from './types';\r\n\r\n/**\r\n * Base reporter interface.\r\n */\r\nexport interface BaseReporter {\r\n startRun(run: TestRunResult): void | Promise<void>;\r\n endRun(run: TestRunResult): void | Promise<void>;\r\n reportTest(test: TestResult): void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Console reporter with colored output.\r\n */\r\nexport class ConsoleReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`🚀 QAagentic Test Run - ${run.projectName}`);\r\n console.log(`Environment: ${run.environment}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n const icon = run.failed === 0 ? '✅' : '❌';\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`${icon} Test Run Complete - ${run.passRate.toFixed(1)}% Pass Rate`);\r\n console.log(`Passed: ${run.passed} | Failed: ${run.failed} | Skipped: ${run.skipped}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n reportTest(test: TestResult): void {\r\n if (!this.config.features.consoleOutput) return;\r\n\r\n const symbols: Record<Status, string> = {\r\n [Status.PASSED]: '✓',\r\n [Status.FAILED]: '✗',\r\n [Status.BROKEN]: '!',\r\n [Status.SKIPPED]: '○',\r\n [Status.PENDING]: '…',\r\n [Status.RUNNING]: '→',\r\n [Status.UNKNOWN]: '?',\r\n };\r\n\r\n const symbol = symbols[test.status as Status] || '?';\r\n console.log(` ${symbol} ${test.name}`);\r\n\r\n if (test.errorMessage) {\r\n console.log(` Error: ${test.errorMessage.slice(0, 100)}...`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * JSON file reporter.\r\n */\r\nexport class JSONReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n // Create output directory\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n\r\n // Clean previous results if configured\r\n if (this.config.local.cleanOnStart) {\r\n const files = fs.readdirSync(this.outputDir);\r\n for (const file of files) {\r\n if (file.endsWith('.json')) {\r\n fs.unlinkSync(path.join(this.outputDir, file));\r\n }\r\n }\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('json')) {\r\n return;\r\n }\r\n\r\n // Write run summary\r\n const runFile = path.join(this.outputDir, 'run.json');\r\n fs.writeFileSync(runFile, JSON.stringify(this.serializeRun(run), null, 2));\r\n\r\n // Write individual test results\r\n const testsDir = path.join(this.outputDir, 'tests');\r\n if (!fs.existsSync(testsDir)) {\r\n fs.mkdirSync(testsDir, { recursive: true });\r\n }\r\n\r\n for (const test of run.tests) {\r\n const testFile = path.join(testsDir, `${test.id}.json`);\r\n fs.writeFileSync(testFile, JSON.stringify(this.serializeTest(test), null, 2));\r\n }\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private serializeRun(run: TestRunResult): Record<string, unknown> {\r\n return {\r\n ...run,\r\n startTime: run.startTime?.toISOString(),\r\n endTime: run.endTime?.toISOString(),\r\n tests: run.tests.map((t) => this.serializeTest(t)),\r\n };\r\n }\r\n\r\n private serializeTest(test: TestResult): Record<string, unknown> {\r\n return {\r\n ...test,\r\n startTime: test.startTime?.toISOString(),\r\n endTime: test.endTime?.toISOString(),\r\n steps: test.steps.map((s) => this.serializeStep(s)),\r\n };\r\n }\r\n\r\n private serializeStep(step: StepResult): Record<string, unknown> {\r\n return {\r\n ...step,\r\n startTime: step.startTime?.toISOString(),\r\n endTime: step.endTime?.toISOString(),\r\n children: step.children.map((c) => this.serializeStep(c)),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * JUnit XML reporter for CI/CD compatibility.\r\n */\r\nexport class JUnitReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(_run: TestRunResult): void {\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('junit')) {\r\n return;\r\n }\r\n\r\n const xml = this.generateXml(run);\r\n const junitFile = path.join(this.outputDir, 'junit.xml');\r\n fs.writeFileSync(junitFile, xml);\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private generateXml(run: TestRunResult): string {\r\n const escape = (str: string) =>\r\n str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;');\r\n\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n xml += `<testsuite name=\"${escape(run.projectName)}\" `;\r\n xml += `tests=\"${run.total}\" `;\r\n xml += `failures=\"${run.failed}\" `;\r\n xml += `errors=\"${run.broken}\" `;\r\n xml += `skipped=\"${run.skipped}\" `;\r\n xml += `time=\"${(run.durationMs / 1000).toFixed(3)}\" `;\r\n xml += `timestamp=\"${run.startTime?.toISOString() || ''}\">\\n`;\r\n\r\n for (const test of run.tests) {\r\n xml += ` <testcase name=\"${escape(test.name)}\" `;\r\n xml += `classname=\"${escape(test.fullName)}\" `;\r\n xml += `time=\"${(test.durationMs / 1000).toFixed(3)}\"`;\r\n\r\n if (test.status === Status.PASSED) {\r\n xml += '/>\\n';\r\n } else if (test.status === Status.FAILED) {\r\n xml += '>\\n';\r\n xml += ` <failure message=\"${escape(test.errorMessage || 'Test failed')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'AssertionError')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</failure>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.BROKEN) {\r\n xml += '>\\n';\r\n xml += ` <error message=\"${escape(test.errorMessage || 'Test error')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'Error')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</error>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.SKIPPED) {\r\n xml += '>\\n';\r\n xml += ` <skipped${test.errorMessage ? ` message=\"${escape(test.errorMessage)}\"` : ''}/>\\n`;\r\n xml += ' </testcase>\\n';\r\n } else {\r\n xml += '/>\\n';\r\n }\r\n }\r\n\r\n xml += '</testsuite>\\n';\r\n return xml;\r\n }\r\n}\r\n\r\n/**\r\n * API reporter that sends results to QAagentic server.\r\n */\r\nexport class APIReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private batch: TestResult[] = [];\r\n private currentRun?: TestRunResult;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n async startRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled');\r\n return;\r\n }\r\n\r\n this.currentRun = run;\r\n this.batch = [];\r\n\r\n try {\r\n console.log('[APIReporter] Starting test run:', run.id);\r\n const url = `${this.config.api.url}/api/v1/runs`;\r\n console.log('[APIReporter] POST to:', url);\r\n \r\n const response = await axios.post(\r\n url,\r\n {\r\n id: run.id,\r\n name: run.name,\r\n project_name: run.projectName,\r\n environment: run.environment,\r\n start_time: run.startTime?.toISOString(),\r\n labels: run.labels,\r\n ci_build_id: run.ciBuildId,\r\n branch: run.branch,\r\n commit_hash: run.commitHash,\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Test run started successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to register run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async endRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) return;\r\n\r\n try {\r\n console.log('[APIReporter] endRun called, batch size:', this.batch.length);\r\n \r\n // Flush remaining batch - ALWAYS flush, even if batch is not full\r\n if (this.batch.length > 0) {\r\n console.log('[APIReporter] Flushing remaining', this.batch.length, 'test results');\r\n await this.flushBatch();\r\n console.log('[APIReporter] Batch flushed, waiting for processing...');\r\n await new Promise((resolve) => setTimeout(resolve, 1500));\r\n }\r\n\r\n console.log('[APIReporter] Finalizing run with test counts:', {\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n });\r\n \r\n const patchData = {\r\n end_time: run.endTime?.toISOString(),\r\n duration_ms: run.durationMs,\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n status: 'completed',\r\n };\r\n \r\n console.log('[APIReporter] PATCH to:', `${this.config.api.url}/api/v1/runs/${run.id}`);\r\n console.log('[APIReporter] PATCH data:', patchData);\r\n \r\n const response = await axios.patch(\r\n `${this.config.api.url}/api/v1/runs/${run.id}`,\r\n patchData,\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Run finalized successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to finalize run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async reportTest(test: TestResult): Promise<void> {\r\n console.log('[APIReporter] reportTest called for:', test.name, 'API enabled:', this.config.api.enabled);\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled, skipping test report');\r\n return;\r\n }\r\n\r\n console.log('[APIReporter] Adding test to batch:', test.name, '- batch size:', this.batch.length + 1);\r\n this.batch.push(test);\r\n\r\n if (this.batch.length >= this.config.api.batchSize) {\r\n console.log('[APIReporter] Batch size reached, flushing batch');\r\n await this.flushBatch();\r\n } else {\r\n console.log('[APIReporter] Batch size:', this.batch.length, '/', this.config.api.batchSize);\r\n }\r\n }\r\n\r\n private async flushBatch(): Promise<void> {\r\n if (this.batch.length === 0 || !this.currentRun) return;\r\n\r\n try {\r\n console.log('[APIReporter] Flushing batch of', this.batch.length, 'test results');\r\n const response = await axios.post(\r\n `${this.config.api.url}/api/v1/runs/${this.currentRun.id}/results`,\r\n this.batch.map((t) => ({\r\n id: t.id,\r\n name: t.name,\r\n full_name: t.fullName,\r\n status: t.status,\r\n duration_ms: t.durationMs,\r\n start_time: t.startTime?.toISOString(),\r\n end_time: t.endTime?.toISOString(),\r\n file_path: t.filePath,\r\n error_message: t.errorMessage,\r\n stack_trace: t.stackTrace,\r\n error_type: t.errorType,\r\n attachments: t.attachments,\r\n })),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Batch flushed successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to send test results to API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n } finally {\r\n this.batch = [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Main reporter that coordinates multiple output destinations.\r\n */\r\nexport class QAgenticReporter {\r\n private static instance: QAgenticReporter | null = null;\r\n private config: QAgenticConfig;\r\n private reporters: BaseReporter[] = [];\r\n private currentRun: TestRunResult | null = null;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n\r\n console.log('[QAgenticReporter] Initializing with config:', {\r\n projectName: this.config.projectName,\r\n environment: this.config.environment,\r\n apiEnabled: this.config.api.enabled,\r\n apiUrl: this.config.api.url,\r\n });\r\n\r\n // Initialize reporters based on config\r\n if (this.config.features.consoleOutput) {\r\n this.reporters.push(new ConsoleReporter(this.config));\r\n console.log('[QAgenticReporter] Added ConsoleReporter');\r\n }\r\n\r\n if (this.config.local.enabled) {\r\n this.reporters.push(new JSONReporter(this.config));\r\n console.log('[QAgenticReporter] Added JSONReporter');\r\n if (this.config.local.formats.includes('junit')) {\r\n this.reporters.push(new JUnitReporter(this.config));\r\n console.log('[QAgenticReporter] Added JUnitReporter');\r\n }\r\n }\r\n\r\n if (this.config.api.enabled) {\r\n this.reporters.push(new APIReporter(this.config));\r\n console.log('[QAgenticReporter] Added APIReporter');\r\n }\r\n\r\n console.log('[QAgenticReporter] Initialization complete with', this.reporters.length, 'reporters');\r\n }\r\n\r\n /**\r\n * Get singleton instance.\r\n */\r\n static getInstance(config?: QAgenticConfig): QAgenticReporter {\r\n if (!QAgenticReporter.instance) {\r\n QAgenticReporter.instance = new QAgenticReporter(config);\r\n }\r\n return QAgenticReporter.instance;\r\n }\r\n\r\n /**\r\n * Reset singleton instance.\r\n */\r\n static reset(): void {\r\n QAgenticReporter.instance = null;\r\n }\r\n\r\n /**\r\n * Start a new test run.\r\n */\r\n async startRun(options: Partial<TestRunResult> = {}): Promise<TestRunResult> {\r\n this.currentRun = {\r\n id: options.id || uuidv4(),\r\n name: options.name || `run_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: options.projectName || this.config.projectName,\r\n environment: options.environment || this.config.environment,\r\n startTime: new Date(),\r\n durationMs: 0,\r\n tests: [],\r\n total: 0,\r\n passed: 0,\r\n failed: 0,\r\n broken: 0,\r\n skipped: 0,\r\n passRate: 0,\r\n labels: { ...this.config.labels.custom, ...options.labels },\r\n parameters: options.parameters || {},\r\n ciBuildId: options.ciBuildId,\r\n ciBuildUrl: options.ciBuildUrl,\r\n branch: options.branch,\r\n commitHash: options.commitHash,\r\n };\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.startRun(this.currentRun);\r\n }\r\n\r\n return this.currentRun;\r\n }\r\n\r\n /**\r\n * End the current test run.\r\n */\r\n async endRun(): Promise<TestRunResult | null> {\r\n if (!this.currentRun) return null;\r\n\r\n this.currentRun.endTime = new Date();\r\n this.currentRun.durationMs =\r\n this.currentRun.endTime.getTime() - (this.currentRun.startTime?.getTime() || 0);\r\n this.currentRun.passRate =\r\n this.currentRun.total > 0 ? (this.currentRun.passed / this.currentRun.total) * 100 : 0;\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.endRun(this.currentRun);\r\n }\r\n\r\n const run = this.currentRun;\r\n this.currentRun = null;\r\n return run;\r\n }\r\n\r\n /**\r\n * Report a test result.\r\n */\r\n async reportTest(test: TestResult): Promise<void> {\r\n if (!this.currentRun) {\r\n console.warn('[QAgenticReporter] No active run to report test');\r\n return;\r\n }\r\n\r\n this.currentRun.tests.push(test);\r\n this.currentRun.total++;\r\n\r\n switch (test.status) {\r\n case 'passed':\r\n this.currentRun.passed++;\r\n break;\r\n case 'failed':\r\n this.currentRun.failed++;\r\n break;\r\n case 'broken':\r\n this.currentRun.broken++;\r\n break;\r\n case 'skipped':\r\n this.currentRun.skipped++;\r\n break;\r\n }\r\n\r\n console.log('[QAgenticReporter] Test counts:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n broken: this.currentRun.broken,\r\n skipped: this.currentRun.skipped,\r\n });\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.reportTest(test);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current test run.\r\n */\r\n getCurrentRun(): TestRunResult | null {\r\n return this.currentRun;\r\n }\r\n}\r\n\r\n/**\r\n * Get the global reporter instance.\r\n */\r\nexport function getReporter(config?: QAgenticConfig): QAgenticReporter {\r\n return QAgenticReporter.getInstance(config);\r\n}\r\n","/**\r\n * QAagentic Cypress - Simplified Setup\r\n * \r\n * One-line integration for Cypress projects\r\n * No complex configuration needed!\r\n * \r\n * @example\r\n * ```typescript\r\n * // cypress.config.ts - Just add this one line!\r\n * import { setupQAgentic } from '@qagentic/reporter/cypress/simple-setup';\r\n * \r\n * export default defineConfig({\r\n * e2e: {\r\n * setupNodeEvents(on, config) {\r\n * setupQAgentic(on, config); // That's it!\r\n * return config;\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { configure } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { parseStatus } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n/**\r\n * Simplified QAagentic setup for Cypress\r\n * Auto-detects configuration from environment variables\r\n * Zero manual configuration needed!\r\n */\r\nclass QAgenticCypressReporter {\r\n private reporter: QAgenticReporter;\r\n private currentRun: TestRunResult | null = null;\r\n private projectName: string;\r\n private environment: string;\r\n private runStarted = false;\r\n private runFinalized = false;\r\n private stats = {\r\n suites: 0,\r\n tests: 0,\r\n passes: 0,\r\n pending: 0,\r\n failures: 0,\r\n start: new Date(),\r\n end: new Date(),\r\n duration: 0\r\n };\r\n\r\n constructor(config: any) {\r\n // Auto-configure from environment or defaults\r\n this.projectName = process.env.QAGENTIC_PROJECT_NAME || \r\n config.projectId || \r\n 'Cypress E2E Tests';\r\n \r\n this.environment = process.env.QAGENTIC_ENVIRONMENT || \r\n process.env.NODE_ENV || \r\n 'e2e';\r\n \r\n const apiUrl = process.env.QAGENTIC_API_URL || \r\n 'http://localhost:8080';\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n apiUrl,\r\n outputDir: './qagentic-results',\r\n });\r\n\r\n this.reporter = QAgenticReporter.getInstance();\r\n this.stats.start = new Date();\r\n }\r\n\r\n async onRunBegin() {\r\n try {\r\n console.log('[QAagentic] onRunBegin called, calling reporter.startRun()');\r\n this.currentRun = await this.reporter.startRun({\r\n name: this.projectName,\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n startTime: this.stats.start,\r\n });\r\n console.log('[QAagentic] onRunBegin completed, currentRun:', this.currentRun?.id);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async ensureRunStarted() {\r\n if (this.runStarted) return;\r\n \r\n this.runStarted = true;\r\n console.log('[QAagentic] Ensuring run is started');\r\n try {\r\n await this.onRunBegin();\r\n console.log('[QAagentic] Run started successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async onTestEnd(test: any) {\r\n // Ensure run is started before processing tests\r\n await this.ensureRunStarted();\r\n \r\n if (!this.currentRun) return;\r\n\r\n try {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title[test.title.length - 1],\r\n fullName: test.title.join(' > '),\r\n status: parseStatus(test.state),\r\n durationMs: test.duration,\r\n startTime: new Date(Date.now() - test.duration),\r\n endTime: new Date(),\r\n labels: {\r\n suite: test.title.slice(0, -1).join(' > '),\r\n feature: test.title[0],\r\n },\r\n links: [],\r\n parameters: {},\r\n steps: [],\r\n attachments: [],\r\n filePath: test.invocationDetails?.relativeFile || '',\r\n retryCount: 0,\r\n isRetry: false,\r\n isFlaky: false,\r\n };\r\n\r\n if (test.state === 'failed') {\r\n // Try multiple ways to get error information\r\n const errorInfo = test.err || test.error || test.failure;\r\n const displayError = test.displayError;\r\n \r\n if (errorInfo) {\r\n testResult.errorMessage = errorInfo.message || 'Test failed';\r\n // Extract stack trace from various possible locations\r\n testResult.stackTrace = errorInfo.stack || \r\n errorInfo.codeFrame ||\r\n errorInfo.toString() ||\r\n displayError ||\r\n '';\r\n testResult.errorType = errorInfo.name || 'AssertionError';\r\n } else if (displayError) {\r\n // Use displayError from Cypress test object\r\n testResult.errorMessage = displayError;\r\n // Try to extract stack from displayError if it contains it\r\n if (displayError.includes('\\n')) {\r\n testResult.stackTrace = displayError;\r\n }\r\n testResult.errorType = 'AssertionError';\r\n } else {\r\n // Fallback: create error from test state\r\n testResult.errorMessage = 'Test assertion failed';\r\n testResult.errorType = 'AssertionError';\r\n }\r\n \r\n console.log('[QAagentic] Test failed - Error:', {\r\n message: testResult.errorMessage,\r\n type: testResult.errorType,\r\n hasStackTrace: !!testResult.stackTrace,\r\n });\r\n\r\n // Store test result for later screenshot attachment in after:spec hook\r\n this.failedTestResults.push({\r\n testResult,\r\n test,\r\n });\r\n }\r\n\r\n // Update stats\r\n this.stats.tests++;\r\n if (test.state === 'passed') this.stats.passes++;\r\n if (test.state === 'failed') this.stats.failures++;\r\n if (test.state === 'pending') this.stats.pending++;\r\n\r\n // Report test immediately (screenshots will be added later)\r\n await this.reporter.reportTest(testResult);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to report test:', error);\r\n }\r\n }\r\n\r\n private failedTestResults: Array<{ testResult: TestResult; test: any }> = [];\r\n\r\n async attachScreenshots() {\r\n // This is called after the spec completes, when screenshots have been written\r\n console.log('[QAagentic] Attaching screenshots to failed tests');\r\n \r\n for (const { testResult, test } of this.failedTestResults) {\r\n if (test.invocationDetails?.relativeFile) {\r\n const testFileName = test.invocationDetails.relativeFile.replace(/\\.ts$/, '');\r\n const testName = test.title[test.title.length - 1];\r\n const fullTestTitle = test.title.join(', ');\r\n \r\n // Try multiple screenshot locations\r\n const screenshotPaths = [\r\n // Mochawesome report assets location with full title\r\n path.join(\r\n process.cwd(),\r\n 'cypress/reports/assets',\r\n testFileName,\r\n `${fullTestTitle} -- ${testName} (failed).png`\r\n ),\r\n // Alternative: without full title path\r\n path.join(\r\n process.cwd(),\r\n 'cypress/reports/assets',\r\n testFileName,\r\n `${testName} (failed).png`\r\n ),\r\n // Legacy cypress/screenshots location\r\n path.join(\r\n process.cwd(),\r\n 'cypress/screenshots',\r\n `${testFileName} -- ${testName} (failed).png`\r\n ),\r\n ];\r\n \r\n let screenshotFound = false;\r\n for (const screenshotPath of screenshotPaths) {\r\n console.log('[QAagentic] Looking for screenshot at:', screenshotPath);\r\n \r\n if (fs.existsSync(screenshotPath)) {\r\n try {\r\n const screenshotContent = fs.readFileSync(screenshotPath);\r\n testResult.attachments.push({\r\n id: uuidv4(),\r\n name: 'screenshot',\r\n type: 'image/png',\r\n extension: 'png',\r\n content: screenshotContent.toString('base64'),\r\n size: screenshotContent.length,\r\n timestamp: new Date().toISOString(),\r\n });\r\n console.log('[QAagentic] Added screenshot attachment:', screenshotPath);\r\n screenshotFound = true;\r\n break;\r\n } catch (err) {\r\n console.warn('[QAagentic] Failed to read screenshot:', err);\r\n }\r\n }\r\n }\r\n \r\n if (!screenshotFound) {\r\n console.log('[QAagentic] No screenshots found for test:', testName);\r\n }\r\n }\r\n }\r\n \r\n // Clear the list after processing\r\n this.failedTestResults = [];\r\n }\r\n\r\n async finalizeRun() {\r\n if (this.runFinalized || !this.currentRun) return;\r\n \r\n this.runFinalized = true;\r\n console.log('[QAagentic] Finalizing run');\r\n \r\n try {\r\n this.stats.end = new Date();\r\n this.stats.duration = this.stats.end.getTime() - this.stats.start.getTime();\r\n\r\n // Update run with final stats\r\n this.currentRun.endTime = this.stats.end;\r\n this.currentRun.durationMs = this.stats.duration;\r\n this.currentRun.total = this.stats.tests;\r\n this.currentRun.passed = this.stats.passes;\r\n this.currentRun.failed = this.stats.failures;\r\n this.currentRun.skipped = this.stats.pending;\r\n\r\n console.log('[QAagentic] Calling reporter.endRun with stats:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n skipped: this.currentRun.skipped,\r\n });\r\n \r\n await this.reporter.endRun();\r\n console.log('[QAagentic] Run finalized successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to finalize run:', error);\r\n }\r\n }\r\n\r\n}\r\n\r\nexport function setupQAgentic(on: any, config: any): void {\r\n const reporter = new QAgenticCypressReporter(config);\r\n\r\n // Process all tests after the entire spec completes\r\n on('after:spec', (_spec: any, results: any) => {\r\n return (async () => {\r\n if (!results?.tests) return;\r\n \r\n try {\r\n // Wait a bit for mochawesome to write screenshots\r\n await new Promise((resolve) => setTimeout(resolve, 1000));\r\n \r\n // Process all tests from this spec\r\n for (const test of results.tests) {\r\n await reporter.onTestEnd(test);\r\n }\r\n \r\n // Attach screenshots after they've been written\r\n await reporter.attachScreenshots();\r\n \r\n // Finalize run after all tests are processed\r\n await reporter.finalizeRun();\r\n \r\n // Wait for API calls to complete\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Error processing spec:', error);\r\n }\r\n })();\r\n });\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qagentic-reporter",
3
- "version": "0.1.33",
3
+ "version": "0.1.35",
4
4
  "description": "AI-Powered Test Intelligence SDK for JavaScript/TypeScript - Cypress, Playwright, Jest support with simplified one-line setup",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",