qagentic-reporter 0.1.35 → 0.1.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cypress/index.js +21 -5
- package/dist/cypress/index.js.map +1 -1
- package/dist/cypress/index.mjs +21 -5
- package/dist/cypress/index.mjs.map +1 -1
- package/dist/cypress/simple-setup.js +21 -5
- package/dist/cypress/simple-setup.js.map +1 -1
- package/dist/cypress/simple-setup.mjs +21 -5
- package/dist/cypress/simple-setup.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -694,6 +694,7 @@ var QAgenticCypressReporter = class {
|
|
|
694
694
|
duration: 0
|
|
695
695
|
};
|
|
696
696
|
this.failedTestResults = [];
|
|
697
|
+
this.pendingTests = [];
|
|
697
698
|
this.projectName = process.env.QAGENTIC_PROJECT_NAME || config.projectId || "Cypress E2E Tests";
|
|
698
699
|
this.environment = process.env.QAGENTIC_ENVIRONMENT || process.env.NODE_ENV || "e2e";
|
|
699
700
|
const apiUrl = process.env.QAGENTIC_API_URL || "http://localhost:8080";
|
|
@@ -787,13 +788,13 @@ var QAgenticCypressReporter = class {
|
|
|
787
788
|
if (test.state === "passed") this.stats.passes++;
|
|
788
789
|
if (test.state === "failed") this.stats.failures++;
|
|
789
790
|
if (test.state === "pending") this.stats.pending++;
|
|
790
|
-
|
|
791
|
+
this.pendingTests.push(testResult);
|
|
791
792
|
} catch (error) {
|
|
792
793
|
console.warn("[QAagentic] Failed to report test:", error);
|
|
793
794
|
}
|
|
794
795
|
}
|
|
795
796
|
async attachScreenshots() {
|
|
796
|
-
console.log("[QAagentic] Attaching screenshots to failed tests");
|
|
797
|
+
console.log("[QAagentic] Attaching screenshots to failed tests, count:", this.failedTestResults.length);
|
|
797
798
|
for (const { testResult, test } of this.failedTestResults) {
|
|
798
799
|
if (test.invocationDetails?.relativeFile) {
|
|
799
800
|
const testFileName = test.invocationDetails.relativeFile.replace(/\.ts$/, "");
|
|
@@ -827,7 +828,7 @@ var QAgenticCypressReporter = class {
|
|
|
827
828
|
if (fs2__namespace.existsSync(screenshotPath)) {
|
|
828
829
|
try {
|
|
829
830
|
const screenshotContent = fs2__namespace.readFileSync(screenshotPath);
|
|
830
|
-
|
|
831
|
+
const attachment = {
|
|
831
832
|
id: uuid.v4(),
|
|
832
833
|
name: "screenshot",
|
|
833
834
|
type: "image/png",
|
|
@@ -835,7 +836,8 @@ var QAgenticCypressReporter = class {
|
|
|
835
836
|
content: screenshotContent.toString("base64"),
|
|
836
837
|
size: screenshotContent.length,
|
|
837
838
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
838
|
-
}
|
|
839
|
+
};
|
|
840
|
+
testResult.attachments.push(attachment);
|
|
839
841
|
console.log("[QAagentic] Added screenshot attachment:", screenshotPath);
|
|
840
842
|
screenshotFound = true;
|
|
841
843
|
break;
|
|
@@ -851,6 +853,13 @@ var QAgenticCypressReporter = class {
|
|
|
851
853
|
}
|
|
852
854
|
this.failedTestResults = [];
|
|
853
855
|
}
|
|
856
|
+
async sendPendingTests() {
|
|
857
|
+
console.log("[QAagentic] Sending", this.pendingTests.length, "pending tests to API");
|
|
858
|
+
for (const testResult of this.pendingTests) {
|
|
859
|
+
await this.reporter.reportTest(testResult);
|
|
860
|
+
}
|
|
861
|
+
this.pendingTests = [];
|
|
862
|
+
}
|
|
854
863
|
async finalizeRun() {
|
|
855
864
|
if (this.runFinalized || !this.currentRun) return;
|
|
856
865
|
this.runFinalized = true;
|
|
@@ -883,11 +892,18 @@ function setupQAgentic(on, config) {
|
|
|
883
892
|
return (async () => {
|
|
884
893
|
if (!results?.tests) return;
|
|
885
894
|
try {
|
|
886
|
-
await
|
|
895
|
+
await reporter.ensureRunStarted();
|
|
896
|
+
console.log("[QAagentic] Waiting for screenshots to be written...");
|
|
897
|
+
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
898
|
+
console.log("[QAagentic] Processing", results.tests.length, "tests");
|
|
887
899
|
for (const test of results.tests) {
|
|
888
900
|
await reporter.onTestEnd(test);
|
|
889
901
|
}
|
|
902
|
+
console.log("[QAagentic] Attaching screenshots...");
|
|
890
903
|
await reporter.attachScreenshots();
|
|
904
|
+
console.log("[QAagentic] Sending tests with screenshots to API...");
|
|
905
|
+
await reporter.sendPendingTests();
|
|
906
|
+
console.log("[QAagentic] Finalizing run...");
|
|
891
907
|
await reporter.finalizeRun();
|
|
892
908
|
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
893
909
|
} 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","fs2","path2","axios","uuidv4","path3","fs3"],"mappings":"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","file":"simple-setup.js","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, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"');\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/cypress/simple-setup.ts"],"names":["fs","path","fs2","path2","axios","uuidv4","path3","fs3"],"mappings":"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","file":"simple-setup.js","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, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"');\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 // Collect test result - don't send yet (screenshots will be added later)\r\n this.pendingTests.push(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 private pendingTests: TestResult[] = [];\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, count:', this.failedTestResults.length);\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 const attachment = {\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 testResult.attachments.push(attachment);\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 sendPendingTests() {\r\n // Send all collected tests to the API\r\n console.log('[QAagentic] Sending', this.pendingTests.length, 'pending tests to API');\r\n \r\n for (const testResult of this.pendingTests) {\r\n await this.reporter.reportTest(testResult);\r\n }\r\n \r\n // Clear pending tests after sending\r\n this.pendingTests = [];\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 // Ensure run is started\r\n await reporter.ensureRunStarted();\r\n \r\n // Wait for mochawesome to write screenshots and reports\r\n console.log('[QAagentic] Waiting for screenshots to be written...');\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n \r\n // Process all tests from this spec - this collects them but doesn't send yet\r\n console.log('[QAagentic] Processing', results.tests.length, 'tests');\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 console.log('[QAagentic] Attaching screenshots...');\r\n await reporter.attachScreenshots();\r\n \r\n // Now send all tests with screenshots to the API\r\n console.log('[QAagentic] Sending tests with screenshots to API...');\r\n await reporter.sendPendingTests();\r\n \r\n // Finalize run after all tests are processed\r\n console.log('[QAagentic] Finalizing run...');\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"]}
|
|
@@ -668,6 +668,7 @@ var QAgenticCypressReporter = class {
|
|
|
668
668
|
duration: 0
|
|
669
669
|
};
|
|
670
670
|
this.failedTestResults = [];
|
|
671
|
+
this.pendingTests = [];
|
|
671
672
|
this.projectName = process.env.QAGENTIC_PROJECT_NAME || config.projectId || "Cypress E2E Tests";
|
|
672
673
|
this.environment = process.env.QAGENTIC_ENVIRONMENT || process.env.NODE_ENV || "e2e";
|
|
673
674
|
const apiUrl = process.env.QAGENTIC_API_URL || "http://localhost:8080";
|
|
@@ -761,13 +762,13 @@ var QAgenticCypressReporter = class {
|
|
|
761
762
|
if (test.state === "passed") this.stats.passes++;
|
|
762
763
|
if (test.state === "failed") this.stats.failures++;
|
|
763
764
|
if (test.state === "pending") this.stats.pending++;
|
|
764
|
-
|
|
765
|
+
this.pendingTests.push(testResult);
|
|
765
766
|
} catch (error) {
|
|
766
767
|
console.warn("[QAagentic] Failed to report test:", error);
|
|
767
768
|
}
|
|
768
769
|
}
|
|
769
770
|
async attachScreenshots() {
|
|
770
|
-
console.log("[QAagentic] Attaching screenshots to failed tests");
|
|
771
|
+
console.log("[QAagentic] Attaching screenshots to failed tests, count:", this.failedTestResults.length);
|
|
771
772
|
for (const { testResult, test } of this.failedTestResults) {
|
|
772
773
|
if (test.invocationDetails?.relativeFile) {
|
|
773
774
|
const testFileName = test.invocationDetails.relativeFile.replace(/\.ts$/, "");
|
|
@@ -801,7 +802,7 @@ var QAgenticCypressReporter = class {
|
|
|
801
802
|
if (fs2.existsSync(screenshotPath)) {
|
|
802
803
|
try {
|
|
803
804
|
const screenshotContent = fs2.readFileSync(screenshotPath);
|
|
804
|
-
|
|
805
|
+
const attachment = {
|
|
805
806
|
id: v4(),
|
|
806
807
|
name: "screenshot",
|
|
807
808
|
type: "image/png",
|
|
@@ -809,7 +810,8 @@ var QAgenticCypressReporter = class {
|
|
|
809
810
|
content: screenshotContent.toString("base64"),
|
|
810
811
|
size: screenshotContent.length,
|
|
811
812
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
812
|
-
}
|
|
813
|
+
};
|
|
814
|
+
testResult.attachments.push(attachment);
|
|
813
815
|
console.log("[QAagentic] Added screenshot attachment:", screenshotPath);
|
|
814
816
|
screenshotFound = true;
|
|
815
817
|
break;
|
|
@@ -825,6 +827,13 @@ var QAgenticCypressReporter = class {
|
|
|
825
827
|
}
|
|
826
828
|
this.failedTestResults = [];
|
|
827
829
|
}
|
|
830
|
+
async sendPendingTests() {
|
|
831
|
+
console.log("[QAagentic] Sending", this.pendingTests.length, "pending tests to API");
|
|
832
|
+
for (const testResult of this.pendingTests) {
|
|
833
|
+
await this.reporter.reportTest(testResult);
|
|
834
|
+
}
|
|
835
|
+
this.pendingTests = [];
|
|
836
|
+
}
|
|
828
837
|
async finalizeRun() {
|
|
829
838
|
if (this.runFinalized || !this.currentRun) return;
|
|
830
839
|
this.runFinalized = true;
|
|
@@ -857,11 +866,18 @@ function setupQAgentic(on, config) {
|
|
|
857
866
|
return (async () => {
|
|
858
867
|
if (!results?.tests) return;
|
|
859
868
|
try {
|
|
860
|
-
await
|
|
869
|
+
await reporter.ensureRunStarted();
|
|
870
|
+
console.log("[QAagentic] Waiting for screenshots to be written...");
|
|
871
|
+
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
872
|
+
console.log("[QAagentic] Processing", results.tests.length, "tests");
|
|
861
873
|
for (const test of results.tests) {
|
|
862
874
|
await reporter.onTestEnd(test);
|
|
863
875
|
}
|
|
876
|
+
console.log("[QAagentic] Attaching screenshots...");
|
|
864
877
|
await reporter.attachScreenshots();
|
|
878
|
+
console.log("[QAagentic] Sending tests with screenshots to API...");
|
|
879
|
+
await reporter.sendPendingTests();
|
|
880
|
+
console.log("[QAagentic] Finalizing run...");
|
|
865
881
|
await reporter.finalizeRun();
|
|
866
882
|
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
867
883
|
} catch (error) {
|