qagentic-reporter 0.1.21 → 0.1.23
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 +9 -1
- package/dist/cypress/index.js.map +1 -1
- package/dist/cypress/index.mjs +9 -1
- package/dist/cypress/index.mjs.map +1 -1
- package/dist/cypress/simple-setup.js +9 -1
- package/dist/cypress/simple-setup.js.map +1 -1
- package/dist/cypress/simple-setup.mjs +9 -1
- package/dist/cypress/simple-setup.mjs.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -1
- package/dist/index.mjs.map +1 -1
- package/dist/jest/index.js +6 -1
- package/dist/jest/index.js.map +1 -1
- package/dist/jest/index.mjs +6 -1
- package/dist/jest/index.mjs.map +1 -1
- package/dist/playwright/index.js +6 -1
- package/dist/playwright/index.js.map +1 -1
- package/dist/playwright/index.mjs +6 -1
- package/dist/playwright/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/core/step.ts","../../src/core/severity.ts","../../src/core/decorators.ts","../../src/core/attachments.ts","../../src/playwright/index.ts"],"names":["fs","path","Status","fs2","path2","step","axios","uuidv4","Severity","fs3"],"mappings":"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","file":"index.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 // Flush remaining batch\r\n await this.flushBatch();\r\n\r\n try {\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 },\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 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 ...t,\r\n startTime: t.startTime?.toISOString(),\r\n endTime: t.endTime?.toISOString(),\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 * Step context manager for defining test steps.\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { Status } from './status';\r\nimport type { StepResult, Attachment } from './types';\r\n\r\n// Current step stack (thread-local equivalent for Node.js)\r\nlet currentSteps: Step[] = [];\r\n\r\n/**\r\n * Get the current step stack.\r\n */\r\nexport function getCurrentSteps(): Step[] {\r\n return currentSteps;\r\n}\r\n\r\n/**\r\n * Get the current active step.\r\n */\r\nexport function getCurrentStep(): Step | undefined {\r\n return currentSteps[currentSteps.length - 1];\r\n}\r\n\r\n/**\r\n * Clear the step stack.\r\n */\r\nexport function clearSteps(): void {\r\n currentSteps = [];\r\n}\r\n\r\n/**\r\n * Represents a test step with timing and status tracking.\r\n */\r\nexport class Step {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly description?: string;\r\n status: Status = Status.PENDING;\r\n startTime?: Date;\r\n endTime?: Date;\r\n durationMs: number = 0;\r\n error?: string;\r\n errorTrace?: string;\r\n attachments: Attachment[] = [];\r\n children: Step[] = [];\r\n parameters: Record<string, unknown> = {};\r\n\r\n constructor(name: string, description?: string, parameters?: Record<string, unknown>) {\r\n this.id = uuidv4();\r\n this.name = name;\r\n this.description = description;\r\n this.parameters = parameters || {};\r\n }\r\n\r\n /**\r\n * Start the step.\r\n */\r\n start(): this {\r\n this.startTime = new Date();\r\n this.status = Status.RUNNING;\r\n currentSteps.push(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * End the step.\r\n */\r\n end(error?: Error): this {\r\n this.endTime = new Date();\r\n if (this.startTime) {\r\n this.durationMs = this.endTime.getTime() - this.startTime.getTime();\r\n }\r\n\r\n // Remove from stack\r\n const index = currentSteps.indexOf(this);\r\n if (index > -1) {\r\n currentSteps.splice(index, 1);\r\n }\r\n\r\n // Add to parent if exists\r\n const parent = getCurrentStep();\r\n if (parent) {\r\n parent.children.push(this);\r\n }\r\n\r\n if (error) {\r\n this.status = Status.FAILED;\r\n this.error = error.message;\r\n this.errorTrace = error.stack;\r\n } else {\r\n this.status = Status.PASSED;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach data to this step.\r\n */\r\n attach(data: string | Buffer, name: string, type: string = 'text/plain'): this {\r\n const content = typeof data === 'string' ? data : data.toString('base64');\r\n this.attachments.push({\r\n id: uuidv4(),\r\n name,\r\n type,\r\n content,\r\n size: typeof data === 'string' ? data.length : data.length,\r\n timestamp: new Date().toISOString(),\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach a screenshot.\r\n */\r\n attachScreenshot(path: string, name: string = 'Screenshot'): this {\r\n return this.attach(path, name, 'image/png');\r\n }\r\n\r\n /**\r\n * Attach JSON data.\r\n */\r\n attachJson(data: unknown, name: string = 'JSON Data'): this {\r\n return this.attach(JSON.stringify(data, null, 2), name, 'application/json');\r\n }\r\n\r\n /**\r\n * Set a step parameter.\r\n */\r\n setParameter(name: string, value: unknown): this {\r\n this.parameters[name] = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Convert to result object.\r\n */\r\n toResult(): StepResult {\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n status: this.status,\r\n startTime: this.startTime,\r\n endTime: this.endTime,\r\n durationMs: this.durationMs,\r\n error: this.error,\r\n errorTrace: this.errorTrace,\r\n attachments: this.attachments,\r\n children: this.children.map((c) => c.toResult()),\r\n parameters: this.parameters,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute a function within a step context.\r\n *\r\n * @example\r\n * ```typescript\r\n * step('Login to application', () => {\r\n * // test code\r\n * });\r\n *\r\n * await step('Async operation', async () => {\r\n * await someAsyncOperation();\r\n * });\r\n * ```\r\n */\r\nexport function step<T>(name: string, fn: () => T): T;\r\nexport function step<T>(name: string, description: string, fn: () => T): T;\r\nexport function step<T>(\r\n name: string,\r\n descriptionOrFn: string | (() => T),\r\n fn?: () => T\r\n): T {\r\n const description = typeof descriptionOrFn === 'string' ? descriptionOrFn : undefined;\r\n const callback = typeof descriptionOrFn === 'function' ? descriptionOrFn : fn!;\r\n\r\n const s = new Step(name, description);\r\n s.start();\r\n\r\n try {\r\n const result = callback();\r\n\r\n // Handle promises\r\n if (result instanceof Promise) {\r\n return result\r\n .then((value) => {\r\n s.end();\r\n return value;\r\n })\r\n .catch((error) => {\r\n s.end(error);\r\n throw error;\r\n }) as T;\r\n }\r\n\r\n s.end();\r\n return result;\r\n } catch (error) {\r\n s.end(error as Error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Create a step without executing (for manual control).\r\n */\r\nexport function createStep(name: string, description?: string): Step {\r\n return new Step(name, description);\r\n}\r\n","/**\r\n * Test severity levels - compatible with Allure.\r\n */\r\n\r\nexport enum Severity {\r\n BLOCKER = 'blocker',\r\n CRITICAL = 'critical',\r\n NORMAL = 'normal',\r\n MINOR = 'minor',\r\n TRIVIAL = 'trivial',\r\n}\r\n\r\n/**\r\n * Convert string to Severity enum.\r\n */\r\nexport function parseSeverity(value: string): Severity {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'blocker':\r\n return Severity.BLOCKER;\r\n case 'critical':\r\n return Severity.CRITICAL;\r\n case 'minor':\r\n return Severity.MINOR;\r\n case 'trivial':\r\n return Severity.TRIVIAL;\r\n default:\r\n return Severity.NORMAL;\r\n }\r\n}\r\n","/**\r\n * Decorators for annotating tests with metadata.\r\n * Compatible with Allure-style annotations.\r\n */\r\n\r\nimport { Severity, parseSeverity } from './severity';\r\n\r\n// Metadata storage key\r\nconst QAGENTIC_METADATA = Symbol('qagentic_metadata');\r\n\r\n/**\r\n * Test metadata structure.\r\n */\r\nexport interface TestMetadata {\r\n labels: Record<string, unknown>;\r\n links: Array<{ url: string; name: string; type: string }>;\r\n attachments: unknown[];\r\n}\r\n\r\n/**\r\n * Get or create metadata for a test.\r\n */\r\nfunction getMetadata(target: unknown): TestMetadata {\r\n const obj = target as Record<symbol, TestMetadata>;\r\n if (!obj[QAGENTIC_METADATA]) {\r\n obj[QAGENTIC_METADATA] = {\r\n labels: {},\r\n links: [],\r\n attachments: [],\r\n };\r\n }\r\n return obj[QAGENTIC_METADATA];\r\n}\r\n\r\n/**\r\n * Add a label to test metadata.\r\n */\r\nfunction addLabel(name: string, value: unknown) {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n metadata.labels[name] = value;\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Mark test with a feature label.\r\n */\r\nexport function feature(name: string) {\r\n return addLabel('feature', name);\r\n}\r\n\r\n/**\r\n * Mark test with a user story label.\r\n */\r\nexport function story(name: string) {\r\n return addLabel('story', name);\r\n}\r\n\r\n/**\r\n * Mark test with an epic label.\r\n */\r\nexport function epic(name: string) {\r\n return addLabel('epic', name);\r\n}\r\n\r\n/**\r\n * Mark test with a severity level.\r\n */\r\nexport function severity(level: Severity | string) {\r\n const sev = typeof level === 'string' ? parseSeverity(level) : level;\r\n return addLabel('severity', sev);\r\n}\r\n\r\n/**\r\n * Add tags to a test.\r\n */\r\nexport function tag(...tags: string[]) {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n const existingTags = (metadata.labels['tags'] as string[]) || [];\r\n metadata.labels['tags'] = [...existingTags, ...tags];\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Add a custom label to a test.\r\n */\r\nexport function label(name: string, value: string) {\r\n return addLabel(name, value);\r\n}\r\n\r\n/**\r\n * Add a link to a test.\r\n */\r\nexport function link(url: string, name?: string, type: string = 'link') {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n metadata.links.push({\r\n url,\r\n name: name || url,\r\n type,\r\n });\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Link test to an issue tracker.\r\n */\r\nexport function issue(url: string, name?: string) {\r\n return link(url, name, 'issue');\r\n}\r\n\r\n/**\r\n * Link test to a test management system.\r\n */\r\nexport function testcase(url: string, name?: string) {\r\n return link(url, name, 'tms');\r\n}\r\n\r\n/**\r\n * Add a description to a test.\r\n */\r\nexport function description(text: string) {\r\n return addLabel('description', text);\r\n}\r\n\r\n/**\r\n * Set a custom title for the test.\r\n */\r\nexport function title(name: string) {\r\n return addLabel('title', name);\r\n}\r\n\r\n/**\r\n * Set the test owner.\r\n */\r\nexport function owner(name: string) {\r\n return addLabel('owner', name);\r\n}\r\n\r\n/**\r\n * Set the test layer.\r\n */\r\nexport function layer(name: string) {\r\n return addLabel('layer', name);\r\n}\r\n\r\n/**\r\n * Set the suite name.\r\n */\r\nexport function suite(name: string) {\r\n return addLabel('suite', name);\r\n}\r\n\r\n/**\r\n * Set the sub-suite name.\r\n */\r\nexport function subSuite(name: string) {\r\n return addLabel('subSuite', name);\r\n}\r\n\r\n/**\r\n * Set the parent suite name.\r\n */\r\nexport function parentSuite(name: string) {\r\n return addLabel('parentSuite', name);\r\n}\r\n\r\n/**\r\n * Get all metadata for a test.\r\n */\r\nexport function getTestMetadata(target: unknown): TestMetadata {\r\n return getMetadata(target);\r\n}\r\n","/**\r\n * Attachment utilities for adding files, screenshots, and data to test reports.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getCurrentStep } from './step';\r\nimport type { Attachment } from './types';\r\n\r\n// Global attachment storage for current test\r\nlet testAttachments: Attachment[] = [];\r\n\r\n/**\r\n * Get current test attachments.\r\n */\r\nexport function getAttachments(): Attachment[] {\r\n return testAttachments;\r\n}\r\n\r\n/**\r\n * Clear attachments for new test.\r\n */\r\nexport function clearAttachments(): void {\r\n testAttachments = [];\r\n}\r\n\r\n/**\r\n * Attach data to the current test or step.\r\n */\r\nexport function attach(\r\n data: string | Buffer,\r\n name: string,\r\n type: string = 'text/plain',\r\n extension?: string\r\n): string {\r\n const attachmentId = uuidv4();\r\n\r\n let content: string;\r\n let size: number;\r\n\r\n if (Buffer.isBuffer(data)) {\r\n content = data.toString('base64');\r\n size = data.length;\r\n } else {\r\n content = data;\r\n size = data.length;\r\n }\r\n\r\n const attachment: Attachment = {\r\n id: attachmentId,\r\n name,\r\n type,\r\n extension,\r\n content,\r\n size,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n // Add to current step if in step context\r\n const currentStep = getCurrentStep();\r\n if (currentStep) {\r\n currentStep.attachments.push(attachment);\r\n } else {\r\n // Add to test-level attachments\r\n testAttachments.push(attachment);\r\n }\r\n\r\n return attachmentId;\r\n}\r\n\r\n/**\r\n * Attach a file to the current test.\r\n */\r\nexport function attachFile(filePath: string, name?: string): string {\r\n const resolvedPath = path.resolve(filePath);\r\n const displayName = name || path.basename(filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n // If file doesn't exist, attach the path as text\r\n return attach(filePath, displayName, 'text/plain');\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath);\r\n const ext = path.extname(filePath).slice(1);\r\n const mimeType = getMimeType(ext);\r\n\r\n return attach(content, displayName, mimeType, ext);\r\n}\r\n\r\n/**\r\n * Attach a screenshot to the current test.\r\n */\r\nexport function attachScreenshot(\r\n data: string | Buffer,\r\n name: string = 'Screenshot'\r\n): string {\r\n if (typeof data === 'string' && fs.existsSync(data)) {\r\n const content = fs.readFileSync(data);\r\n return attach(content, name, 'image/png', 'png');\r\n }\r\n return attach(data, name, 'image/png', 'png');\r\n}\r\n\r\n/**\r\n * Attach JSON data to the current test.\r\n */\r\nexport function attachJson(\r\n data: unknown,\r\n name: string = 'JSON Data'\r\n): string {\r\n const jsonStr = JSON.stringify(data, null, 2);\r\n return attach(jsonStr, name, 'application/json', 'json');\r\n}\r\n\r\n/**\r\n * Attach plain text to the current test.\r\n */\r\nexport function attachText(text: string, name: string = 'Text'): string {\r\n return attach(text, name, 'text/plain', 'txt');\r\n}\r\n\r\n/**\r\n * Attach HTML content to the current test.\r\n */\r\nexport function attachHtml(html: string, name: string = 'HTML'): string {\r\n return attach(html, name, 'text/html', 'html');\r\n}\r\n\r\n/**\r\n * Attach a video to the current test.\r\n */\r\nexport function attachVideo(filePath: string, name: string = 'Video'): string {\r\n const resolvedPath = path.resolve(filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n return attach(filePath, name, 'video/mp4', 'mp4');\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath);\r\n const ext = path.extname(filePath).slice(1);\r\n const mimeType = ext === 'webm' ? 'video/webm' : 'video/mp4';\r\n\r\n return attach(content, name, mimeType, ext);\r\n}\r\n\r\n/**\r\n * Get MIME type from file extension.\r\n */\r\nfunction getMimeType(ext: string): string {\r\n const mimeTypes: Record<string, string> = {\r\n png: 'image/png',\r\n jpg: 'image/jpeg',\r\n jpeg: 'image/jpeg',\r\n gif: 'image/gif',\r\n webp: 'image/webp',\r\n svg: 'image/svg+xml',\r\n pdf: 'application/pdf',\r\n json: 'application/json',\r\n xml: 'application/xml',\r\n html: 'text/html',\r\n txt: 'text/plain',\r\n csv: 'text/csv',\r\n mp4: 'video/mp4',\r\n webm: 'video/webm',\r\n log: 'text/plain',\r\n };\r\n\r\n return mimeTypes[ext.toLowerCase()] || 'application/octet-stream';\r\n}\r\n","/**\r\n * QAagentic Playwright Reporter\r\n *\r\n * Custom Playwright reporter that sends test results to QAagentic.\r\n *\r\n * @example\r\n * ```typescript\r\n * // playwright.config.ts\r\n * import { defineConfig } from '@playwright/test';\r\n * import { qagenticReporter } from '@qagentic/reporter/playwright';\r\n *\r\n * export default defineConfig({\r\n * reporter: [\r\n * ['html'],\r\n * qagenticReporter({\r\n * projectName: 'my-project',\r\n * apiUrl: 'http://localhost:8080',\r\n * }),\r\n * ],\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { configure, getConfig } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { Status } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n// Re-export core utilities\r\nexport { step, Step } from '../core/step';\r\nexport { Severity } from '../core/severity';\r\nexport { Status } from '../core/status';\r\nexport {\r\n feature,\r\n story,\r\n epic,\r\n severity,\r\n tag,\r\n label,\r\n} from '../core/decorators';\r\nexport {\r\n attach,\r\n attachScreenshot,\r\n attachJson,\r\n attachText,\r\n} from '../core/attachments';\r\n\r\n/**\r\n * Playwright reporter options.\r\n */\r\nexport interface PlaywrightReporterOptions {\r\n projectName?: string;\r\n environment?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n}\r\n\r\n/**\r\n * Playwright Reporter class.\r\n */\r\nexport class QAgenticPlaywrightReporter {\r\n private options: PlaywrightReporterOptions;\r\n private reporter: QAgenticReporter;\r\n private currentRun: TestRunResult | null = null;\r\n\r\n constructor(options: PlaywrightReporterOptions = {}) {\r\n this.options = options;\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName: options.projectName || 'playwright-project',\r\n environment: options.environment || 'local',\r\n apiUrl: options.apiUrl,\r\n apiKey: options.apiKey,\r\n outputDir: options.outputDir || './qagentic-results',\r\n });\r\n\r\n this.reporter = QAgenticReporter.getInstance();\r\n }\r\n\r\n async onBegin(config: unknown, suite: unknown): Promise<void> {\r\n this.currentRun = await this.reporter.startRun({\r\n name: `playwright_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: this.options.projectName || 'playwright-project',\r\n environment: this.options.environment || 'local',\r\n branch: process.env.GITHUB_REF_NAME || process.env.CI_COMMIT_REF_NAME,\r\n commitHash: process.env.GITHUB_SHA || process.env.CI_COMMIT_SHA,\r\n });\r\n }\r\n\r\n async onTestEnd(test: PlaywrightTest, result: PlaywrightTestResult): Promise<void> {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title,\r\n fullName: test.titlePath().join(' > '),\r\n description: test.annotations?.find((a: Annotation) => a.type === 'description')?.description,\r\n status: this.mapStatus(result.status),\r\n startTime: new Date(result.startTime),\r\n endTime: new Date(result.startTime.getTime() + result.duration),\r\n durationMs: result.duration,\r\n labels: this.extractLabels(test),\r\n links: [],\r\n parameters: {},\r\n steps: this.mapSteps(result.steps),\r\n attachments: this.mapAttachments(result.attachments),\r\n filePath: test.location?.file,\r\n lineNumber: test.location?.line,\r\n retryCount: result.retry,\r\n isRetry: result.retry > 0,\r\n isFlaky: result.status === 'passed' && result.retry > 0,\r\n };\r\n\r\n if (result.error) {\r\n testResult.errorMessage = result.error.message;\r\n testResult.stackTrace = result.error.stack;\r\n testResult.errorType = result.error.name || 'Error';\r\n }\r\n\r\n await this.reporter.reportTest(testResult);\r\n }\r\n\r\n async onEnd(result: { status: string }): Promise<void> {\r\n await this.reporter.endRun();\r\n }\r\n\r\n private mapStatus(status: string): Status {\r\n switch (status) {\r\n case 'passed':\r\n return Status.PASSED;\r\n case 'failed':\r\n return Status.FAILED;\r\n case 'timedOut':\r\n return Status.BROKEN;\r\n case 'skipped':\r\n return Status.SKIPPED;\r\n case 'interrupted':\r\n return Status.BROKEN;\r\n default:\r\n return Status.UNKNOWN;\r\n }\r\n }\r\n\r\n private extractLabels(test: PlaywrightTest): Record<string, unknown> {\r\n const labels: Record<string, unknown> = {\r\n suite: test.parent?.title,\r\n };\r\n\r\n for (const annotation of test.annotations || []) {\r\n if (annotation.type === 'feature') labels.feature = annotation.description;\r\n if (annotation.type === 'story') labels.story = annotation.description;\r\n if (annotation.type === 'severity') labels.severity = annotation.description;\r\n if (annotation.type === 'tag') {\r\n const tags = (labels.tags as string[]) || [];\r\n tags.push(annotation.description || '');\r\n labels.tags = tags;\r\n }\r\n }\r\n\r\n return labels;\r\n }\r\n\r\n private mapSteps(steps: PlaywrightStep[]): TestResult['steps'] {\r\n return (steps || []).map((step) => ({\r\n id: uuidv4(),\r\n name: step.title,\r\n status: step.error ? Status.FAILED : Status.PASSED,\r\n startTime: new Date(step.startTime),\r\n endTime: new Date(step.startTime.getTime() + step.duration),\r\n durationMs: step.duration,\r\n error: step.error?.message,\r\n errorTrace: step.error?.stack,\r\n attachments: [],\r\n children: this.mapSteps(step.steps || []),\r\n parameters: {},\r\n }));\r\n }\r\n\r\n private mapAttachments(attachments: PlaywrightAttachment[]): TestResult['attachments'] {\r\n return (attachments || []).map((att) => ({\r\n id: uuidv4(),\r\n name: att.name,\r\n type: att.contentType,\r\n content: att.path || '',\r\n size: 0,\r\n timestamp: new Date().toISOString(),\r\n }));\r\n }\r\n}\r\n\r\n// Type definitions for Playwright objects\r\ninterface Annotation {\r\n type: string;\r\n description?: string;\r\n}\r\n\r\ninterface PlaywrightTest {\r\n title: string;\r\n titlePath(): string[];\r\n annotations?: Annotation[];\r\n location?: { file: string; line: number };\r\n parent?: { title: string };\r\n}\r\n\r\ninterface PlaywrightTestResult {\r\n status: string;\r\n startTime: Date;\r\n duration: number;\r\n retry: number;\r\n error?: { message: string; stack?: string; name?: string };\r\n steps: PlaywrightStep[];\r\n attachments: PlaywrightAttachment[];\r\n}\r\n\r\ninterface PlaywrightStep {\r\n title: string;\r\n startTime: Date;\r\n duration: number;\r\n error?: { message: string; stack?: string };\r\n steps?: PlaywrightStep[];\r\n}\r\n\r\ninterface PlaywrightAttachment {\r\n name: string;\r\n contentType: string;\r\n path?: string;\r\n body?: Buffer;\r\n}\r\n\r\n/**\r\n * Create a Playwright reporter configuration.\r\n */\r\nexport function qagenticReporter(\r\n options: PlaywrightReporterOptions = {}\r\n): [string, PlaywrightReporterOptions] {\r\n return ['@qagentic/reporter/playwright', options];\r\n}\r\n\r\n// Default export\r\nexport default QAgenticPlaywrightReporter;\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/core/step.ts","../../src/core/severity.ts","../../src/core/decorators.ts","../../src/core/attachments.ts","../../src/playwright/index.ts"],"names":["fs","path","Status","fs2","path2","step","axios","uuidv4","Severity","fs3"],"mappings":"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","file":"index.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 // Flush remaining batch\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] Waiting for test results to be processed...');\r\n await new Promise((resolve) => setTimeout(resolve, 1000));\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 },\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 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 ...t,\r\n startTime: t.startTime?.toISOString(),\r\n endTime: t.endTime?.toISOString(),\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 * Step context manager for defining test steps.\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { Status } from './status';\r\nimport type { StepResult, Attachment } from './types';\r\n\r\n// Current step stack (thread-local equivalent for Node.js)\r\nlet currentSteps: Step[] = [];\r\n\r\n/**\r\n * Get the current step stack.\r\n */\r\nexport function getCurrentSteps(): Step[] {\r\n return currentSteps;\r\n}\r\n\r\n/**\r\n * Get the current active step.\r\n */\r\nexport function getCurrentStep(): Step | undefined {\r\n return currentSteps[currentSteps.length - 1];\r\n}\r\n\r\n/**\r\n * Clear the step stack.\r\n */\r\nexport function clearSteps(): void {\r\n currentSteps = [];\r\n}\r\n\r\n/**\r\n * Represents a test step with timing and status tracking.\r\n */\r\nexport class Step {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly description?: string;\r\n status: Status = Status.PENDING;\r\n startTime?: Date;\r\n endTime?: Date;\r\n durationMs: number = 0;\r\n error?: string;\r\n errorTrace?: string;\r\n attachments: Attachment[] = [];\r\n children: Step[] = [];\r\n parameters: Record<string, unknown> = {};\r\n\r\n constructor(name: string, description?: string, parameters?: Record<string, unknown>) {\r\n this.id = uuidv4();\r\n this.name = name;\r\n this.description = description;\r\n this.parameters = parameters || {};\r\n }\r\n\r\n /**\r\n * Start the step.\r\n */\r\n start(): this {\r\n this.startTime = new Date();\r\n this.status = Status.RUNNING;\r\n currentSteps.push(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * End the step.\r\n */\r\n end(error?: Error): this {\r\n this.endTime = new Date();\r\n if (this.startTime) {\r\n this.durationMs = this.endTime.getTime() - this.startTime.getTime();\r\n }\r\n\r\n // Remove from stack\r\n const index = currentSteps.indexOf(this);\r\n if (index > -1) {\r\n currentSteps.splice(index, 1);\r\n }\r\n\r\n // Add to parent if exists\r\n const parent = getCurrentStep();\r\n if (parent) {\r\n parent.children.push(this);\r\n }\r\n\r\n if (error) {\r\n this.status = Status.FAILED;\r\n this.error = error.message;\r\n this.errorTrace = error.stack;\r\n } else {\r\n this.status = Status.PASSED;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach data to this step.\r\n */\r\n attach(data: string | Buffer, name: string, type: string = 'text/plain'): this {\r\n const content = typeof data === 'string' ? data : data.toString('base64');\r\n this.attachments.push({\r\n id: uuidv4(),\r\n name,\r\n type,\r\n content,\r\n size: typeof data === 'string' ? data.length : data.length,\r\n timestamp: new Date().toISOString(),\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach a screenshot.\r\n */\r\n attachScreenshot(path: string, name: string = 'Screenshot'): this {\r\n return this.attach(path, name, 'image/png');\r\n }\r\n\r\n /**\r\n * Attach JSON data.\r\n */\r\n attachJson(data: unknown, name: string = 'JSON Data'): this {\r\n return this.attach(JSON.stringify(data, null, 2), name, 'application/json');\r\n }\r\n\r\n /**\r\n * Set a step parameter.\r\n */\r\n setParameter(name: string, value: unknown): this {\r\n this.parameters[name] = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Convert to result object.\r\n */\r\n toResult(): StepResult {\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n status: this.status,\r\n startTime: this.startTime,\r\n endTime: this.endTime,\r\n durationMs: this.durationMs,\r\n error: this.error,\r\n errorTrace: this.errorTrace,\r\n attachments: this.attachments,\r\n children: this.children.map((c) => c.toResult()),\r\n parameters: this.parameters,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute a function within a step context.\r\n *\r\n * @example\r\n * ```typescript\r\n * step('Login to application', () => {\r\n * // test code\r\n * });\r\n *\r\n * await step('Async operation', async () => {\r\n * await someAsyncOperation();\r\n * });\r\n * ```\r\n */\r\nexport function step<T>(name: string, fn: () => T): T;\r\nexport function step<T>(name: string, description: string, fn: () => T): T;\r\nexport function step<T>(\r\n name: string,\r\n descriptionOrFn: string | (() => T),\r\n fn?: () => T\r\n): T {\r\n const description = typeof descriptionOrFn === 'string' ? descriptionOrFn : undefined;\r\n const callback = typeof descriptionOrFn === 'function' ? descriptionOrFn : fn!;\r\n\r\n const s = new Step(name, description);\r\n s.start();\r\n\r\n try {\r\n const result = callback();\r\n\r\n // Handle promises\r\n if (result instanceof Promise) {\r\n return result\r\n .then((value) => {\r\n s.end();\r\n return value;\r\n })\r\n .catch((error) => {\r\n s.end(error);\r\n throw error;\r\n }) as T;\r\n }\r\n\r\n s.end();\r\n return result;\r\n } catch (error) {\r\n s.end(error as Error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Create a step without executing (for manual control).\r\n */\r\nexport function createStep(name: string, description?: string): Step {\r\n return new Step(name, description);\r\n}\r\n","/**\r\n * Test severity levels - compatible with Allure.\r\n */\r\n\r\nexport enum Severity {\r\n BLOCKER = 'blocker',\r\n CRITICAL = 'critical',\r\n NORMAL = 'normal',\r\n MINOR = 'minor',\r\n TRIVIAL = 'trivial',\r\n}\r\n\r\n/**\r\n * Convert string to Severity enum.\r\n */\r\nexport function parseSeverity(value: string): Severity {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'blocker':\r\n return Severity.BLOCKER;\r\n case 'critical':\r\n return Severity.CRITICAL;\r\n case 'minor':\r\n return Severity.MINOR;\r\n case 'trivial':\r\n return Severity.TRIVIAL;\r\n default:\r\n return Severity.NORMAL;\r\n }\r\n}\r\n","/**\r\n * Decorators for annotating tests with metadata.\r\n * Compatible with Allure-style annotations.\r\n */\r\n\r\nimport { Severity, parseSeverity } from './severity';\r\n\r\n// Metadata storage key\r\nconst QAGENTIC_METADATA = Symbol('qagentic_metadata');\r\n\r\n/**\r\n * Test metadata structure.\r\n */\r\nexport interface TestMetadata {\r\n labels: Record<string, unknown>;\r\n links: Array<{ url: string; name: string; type: string }>;\r\n attachments: unknown[];\r\n}\r\n\r\n/**\r\n * Get or create metadata for a test.\r\n */\r\nfunction getMetadata(target: unknown): TestMetadata {\r\n const obj = target as Record<symbol, TestMetadata>;\r\n if (!obj[QAGENTIC_METADATA]) {\r\n obj[QAGENTIC_METADATA] = {\r\n labels: {},\r\n links: [],\r\n attachments: [],\r\n };\r\n }\r\n return obj[QAGENTIC_METADATA];\r\n}\r\n\r\n/**\r\n * Add a label to test metadata.\r\n */\r\nfunction addLabel(name: string, value: unknown) {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n metadata.labels[name] = value;\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Mark test with a feature label.\r\n */\r\nexport function feature(name: string) {\r\n return addLabel('feature', name);\r\n}\r\n\r\n/**\r\n * Mark test with a user story label.\r\n */\r\nexport function story(name: string) {\r\n return addLabel('story', name);\r\n}\r\n\r\n/**\r\n * Mark test with an epic label.\r\n */\r\nexport function epic(name: string) {\r\n return addLabel('epic', name);\r\n}\r\n\r\n/**\r\n * Mark test with a severity level.\r\n */\r\nexport function severity(level: Severity | string) {\r\n const sev = typeof level === 'string' ? parseSeverity(level) : level;\r\n return addLabel('severity', sev);\r\n}\r\n\r\n/**\r\n * Add tags to a test.\r\n */\r\nexport function tag(...tags: string[]) {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n const existingTags = (metadata.labels['tags'] as string[]) || [];\r\n metadata.labels['tags'] = [...existingTags, ...tags];\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Add a custom label to a test.\r\n */\r\nexport function label(name: string, value: string) {\r\n return addLabel(name, value);\r\n}\r\n\r\n/**\r\n * Add a link to a test.\r\n */\r\nexport function link(url: string, name?: string, type: string = 'link') {\r\n return function <T extends object>(target: T): T {\r\n const metadata = getMetadata(target);\r\n metadata.links.push({\r\n url,\r\n name: name || url,\r\n type,\r\n });\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Link test to an issue tracker.\r\n */\r\nexport function issue(url: string, name?: string) {\r\n return link(url, name, 'issue');\r\n}\r\n\r\n/**\r\n * Link test to a test management system.\r\n */\r\nexport function testcase(url: string, name?: string) {\r\n return link(url, name, 'tms');\r\n}\r\n\r\n/**\r\n * Add a description to a test.\r\n */\r\nexport function description(text: string) {\r\n return addLabel('description', text);\r\n}\r\n\r\n/**\r\n * Set a custom title for the test.\r\n */\r\nexport function title(name: string) {\r\n return addLabel('title', name);\r\n}\r\n\r\n/**\r\n * Set the test owner.\r\n */\r\nexport function owner(name: string) {\r\n return addLabel('owner', name);\r\n}\r\n\r\n/**\r\n * Set the test layer.\r\n */\r\nexport function layer(name: string) {\r\n return addLabel('layer', name);\r\n}\r\n\r\n/**\r\n * Set the suite name.\r\n */\r\nexport function suite(name: string) {\r\n return addLabel('suite', name);\r\n}\r\n\r\n/**\r\n * Set the sub-suite name.\r\n */\r\nexport function subSuite(name: string) {\r\n return addLabel('subSuite', name);\r\n}\r\n\r\n/**\r\n * Set the parent suite name.\r\n */\r\nexport function parentSuite(name: string) {\r\n return addLabel('parentSuite', name);\r\n}\r\n\r\n/**\r\n * Get all metadata for a test.\r\n */\r\nexport function getTestMetadata(target: unknown): TestMetadata {\r\n return getMetadata(target);\r\n}\r\n","/**\r\n * Attachment utilities for adding files, screenshots, and data to test reports.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getCurrentStep } from './step';\r\nimport type { Attachment } from './types';\r\n\r\n// Global attachment storage for current test\r\nlet testAttachments: Attachment[] = [];\r\n\r\n/**\r\n * Get current test attachments.\r\n */\r\nexport function getAttachments(): Attachment[] {\r\n return testAttachments;\r\n}\r\n\r\n/**\r\n * Clear attachments for new test.\r\n */\r\nexport function clearAttachments(): void {\r\n testAttachments = [];\r\n}\r\n\r\n/**\r\n * Attach data to the current test or step.\r\n */\r\nexport function attach(\r\n data: string | Buffer,\r\n name: string,\r\n type: string = 'text/plain',\r\n extension?: string\r\n): string {\r\n const attachmentId = uuidv4();\r\n\r\n let content: string;\r\n let size: number;\r\n\r\n if (Buffer.isBuffer(data)) {\r\n content = data.toString('base64');\r\n size = data.length;\r\n } else {\r\n content = data;\r\n size = data.length;\r\n }\r\n\r\n const attachment: Attachment = {\r\n id: attachmentId,\r\n name,\r\n type,\r\n extension,\r\n content,\r\n size,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n // Add to current step if in step context\r\n const currentStep = getCurrentStep();\r\n if (currentStep) {\r\n currentStep.attachments.push(attachment);\r\n } else {\r\n // Add to test-level attachments\r\n testAttachments.push(attachment);\r\n }\r\n\r\n return attachmentId;\r\n}\r\n\r\n/**\r\n * Attach a file to the current test.\r\n */\r\nexport function attachFile(filePath: string, name?: string): string {\r\n const resolvedPath = path.resolve(filePath);\r\n const displayName = name || path.basename(filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n // If file doesn't exist, attach the path as text\r\n return attach(filePath, displayName, 'text/plain');\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath);\r\n const ext = path.extname(filePath).slice(1);\r\n const mimeType = getMimeType(ext);\r\n\r\n return attach(content, displayName, mimeType, ext);\r\n}\r\n\r\n/**\r\n * Attach a screenshot to the current test.\r\n */\r\nexport function attachScreenshot(\r\n data: string | Buffer,\r\n name: string = 'Screenshot'\r\n): string {\r\n if (typeof data === 'string' && fs.existsSync(data)) {\r\n const content = fs.readFileSync(data);\r\n return attach(content, name, 'image/png', 'png');\r\n }\r\n return attach(data, name, 'image/png', 'png');\r\n}\r\n\r\n/**\r\n * Attach JSON data to the current test.\r\n */\r\nexport function attachJson(\r\n data: unknown,\r\n name: string = 'JSON Data'\r\n): string {\r\n const jsonStr = JSON.stringify(data, null, 2);\r\n return attach(jsonStr, name, 'application/json', 'json');\r\n}\r\n\r\n/**\r\n * Attach plain text to the current test.\r\n */\r\nexport function attachText(text: string, name: string = 'Text'): string {\r\n return attach(text, name, 'text/plain', 'txt');\r\n}\r\n\r\n/**\r\n * Attach HTML content to the current test.\r\n */\r\nexport function attachHtml(html: string, name: string = 'HTML'): string {\r\n return attach(html, name, 'text/html', 'html');\r\n}\r\n\r\n/**\r\n * Attach a video to the current test.\r\n */\r\nexport function attachVideo(filePath: string, name: string = 'Video'): string {\r\n const resolvedPath = path.resolve(filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n return attach(filePath, name, 'video/mp4', 'mp4');\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath);\r\n const ext = path.extname(filePath).slice(1);\r\n const mimeType = ext === 'webm' ? 'video/webm' : 'video/mp4';\r\n\r\n return attach(content, name, mimeType, ext);\r\n}\r\n\r\n/**\r\n * Get MIME type from file extension.\r\n */\r\nfunction getMimeType(ext: string): string {\r\n const mimeTypes: Record<string, string> = {\r\n png: 'image/png',\r\n jpg: 'image/jpeg',\r\n jpeg: 'image/jpeg',\r\n gif: 'image/gif',\r\n webp: 'image/webp',\r\n svg: 'image/svg+xml',\r\n pdf: 'application/pdf',\r\n json: 'application/json',\r\n xml: 'application/xml',\r\n html: 'text/html',\r\n txt: 'text/plain',\r\n csv: 'text/csv',\r\n mp4: 'video/mp4',\r\n webm: 'video/webm',\r\n log: 'text/plain',\r\n };\r\n\r\n return mimeTypes[ext.toLowerCase()] || 'application/octet-stream';\r\n}\r\n","/**\r\n * QAagentic Playwright Reporter\r\n *\r\n * Custom Playwright reporter that sends test results to QAagentic.\r\n *\r\n * @example\r\n * ```typescript\r\n * // playwright.config.ts\r\n * import { defineConfig } from '@playwright/test';\r\n * import { qagenticReporter } from '@qagentic/reporter/playwright';\r\n *\r\n * export default defineConfig({\r\n * reporter: [\r\n * ['html'],\r\n * qagenticReporter({\r\n * projectName: 'my-project',\r\n * apiUrl: 'http://localhost:8080',\r\n * }),\r\n * ],\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { configure, getConfig } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { Status } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n// Re-export core utilities\r\nexport { step, Step } from '../core/step';\r\nexport { Severity } from '../core/severity';\r\nexport { Status } from '../core/status';\r\nexport {\r\n feature,\r\n story,\r\n epic,\r\n severity,\r\n tag,\r\n label,\r\n} from '../core/decorators';\r\nexport {\r\n attach,\r\n attachScreenshot,\r\n attachJson,\r\n attachText,\r\n} from '../core/attachments';\r\n\r\n/**\r\n * Playwright reporter options.\r\n */\r\nexport interface PlaywrightReporterOptions {\r\n projectName?: string;\r\n environment?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n}\r\n\r\n/**\r\n * Playwright Reporter class.\r\n */\r\nexport class QAgenticPlaywrightReporter {\r\n private options: PlaywrightReporterOptions;\r\n private reporter: QAgenticReporter;\r\n private currentRun: TestRunResult | null = null;\r\n\r\n constructor(options: PlaywrightReporterOptions = {}) {\r\n this.options = options;\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName: options.projectName || 'playwright-project',\r\n environment: options.environment || 'local',\r\n apiUrl: options.apiUrl,\r\n apiKey: options.apiKey,\r\n outputDir: options.outputDir || './qagentic-results',\r\n });\r\n\r\n this.reporter = QAgenticReporter.getInstance();\r\n }\r\n\r\n async onBegin(config: unknown, suite: unknown): Promise<void> {\r\n this.currentRun = await this.reporter.startRun({\r\n name: `playwright_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: this.options.projectName || 'playwright-project',\r\n environment: this.options.environment || 'local',\r\n branch: process.env.GITHUB_REF_NAME || process.env.CI_COMMIT_REF_NAME,\r\n commitHash: process.env.GITHUB_SHA || process.env.CI_COMMIT_SHA,\r\n });\r\n }\r\n\r\n async onTestEnd(test: PlaywrightTest, result: PlaywrightTestResult): Promise<void> {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title,\r\n fullName: test.titlePath().join(' > '),\r\n description: test.annotations?.find((a: Annotation) => a.type === 'description')?.description,\r\n status: this.mapStatus(result.status),\r\n startTime: new Date(result.startTime),\r\n endTime: new Date(result.startTime.getTime() + result.duration),\r\n durationMs: result.duration,\r\n labels: this.extractLabels(test),\r\n links: [],\r\n parameters: {},\r\n steps: this.mapSteps(result.steps),\r\n attachments: this.mapAttachments(result.attachments),\r\n filePath: test.location?.file,\r\n lineNumber: test.location?.line,\r\n retryCount: result.retry,\r\n isRetry: result.retry > 0,\r\n isFlaky: result.status === 'passed' && result.retry > 0,\r\n };\r\n\r\n if (result.error) {\r\n testResult.errorMessage = result.error.message;\r\n testResult.stackTrace = result.error.stack;\r\n testResult.errorType = result.error.name || 'Error';\r\n }\r\n\r\n await this.reporter.reportTest(testResult);\r\n }\r\n\r\n async onEnd(result: { status: string }): Promise<void> {\r\n await this.reporter.endRun();\r\n }\r\n\r\n private mapStatus(status: string): Status {\r\n switch (status) {\r\n case 'passed':\r\n return Status.PASSED;\r\n case 'failed':\r\n return Status.FAILED;\r\n case 'timedOut':\r\n return Status.BROKEN;\r\n case 'skipped':\r\n return Status.SKIPPED;\r\n case 'interrupted':\r\n return Status.BROKEN;\r\n default:\r\n return Status.UNKNOWN;\r\n }\r\n }\r\n\r\n private extractLabels(test: PlaywrightTest): Record<string, unknown> {\r\n const labels: Record<string, unknown> = {\r\n suite: test.parent?.title,\r\n };\r\n\r\n for (const annotation of test.annotations || []) {\r\n if (annotation.type === 'feature') labels.feature = annotation.description;\r\n if (annotation.type === 'story') labels.story = annotation.description;\r\n if (annotation.type === 'severity') labels.severity = annotation.description;\r\n if (annotation.type === 'tag') {\r\n const tags = (labels.tags as string[]) || [];\r\n tags.push(annotation.description || '');\r\n labels.tags = tags;\r\n }\r\n }\r\n\r\n return labels;\r\n }\r\n\r\n private mapSteps(steps: PlaywrightStep[]): TestResult['steps'] {\r\n return (steps || []).map((step) => ({\r\n id: uuidv4(),\r\n name: step.title,\r\n status: step.error ? Status.FAILED : Status.PASSED,\r\n startTime: new Date(step.startTime),\r\n endTime: new Date(step.startTime.getTime() + step.duration),\r\n durationMs: step.duration,\r\n error: step.error?.message,\r\n errorTrace: step.error?.stack,\r\n attachments: [],\r\n children: this.mapSteps(step.steps || []),\r\n parameters: {},\r\n }));\r\n }\r\n\r\n private mapAttachments(attachments: PlaywrightAttachment[]): TestResult['attachments'] {\r\n return (attachments || []).map((att) => ({\r\n id: uuidv4(),\r\n name: att.name,\r\n type: att.contentType,\r\n content: att.path || '',\r\n size: 0,\r\n timestamp: new Date().toISOString(),\r\n }));\r\n }\r\n}\r\n\r\n// Type definitions for Playwright objects\r\ninterface Annotation {\r\n type: string;\r\n description?: string;\r\n}\r\n\r\ninterface PlaywrightTest {\r\n title: string;\r\n titlePath(): string[];\r\n annotations?: Annotation[];\r\n location?: { file: string; line: number };\r\n parent?: { title: string };\r\n}\r\n\r\ninterface PlaywrightTestResult {\r\n status: string;\r\n startTime: Date;\r\n duration: number;\r\n retry: number;\r\n error?: { message: string; stack?: string; name?: string };\r\n steps: PlaywrightStep[];\r\n attachments: PlaywrightAttachment[];\r\n}\r\n\r\ninterface PlaywrightStep {\r\n title: string;\r\n startTime: Date;\r\n duration: number;\r\n error?: { message: string; stack?: string };\r\n steps?: PlaywrightStep[];\r\n}\r\n\r\ninterface PlaywrightAttachment {\r\n name: string;\r\n contentType: string;\r\n path?: string;\r\n body?: Buffer;\r\n}\r\n\r\n/**\r\n * Create a Playwright reporter configuration.\r\n */\r\nexport function qagenticReporter(\r\n options: PlaywrightReporterOptions = {}\r\n): [string, PlaywrightReporterOptions] {\r\n return ['@qagentic/reporter/playwright', options];\r\n}\r\n\r\n// Default export\r\nexport default QAgenticPlaywrightReporter;\r\n"]}
|
|
@@ -402,8 +402,13 @@ var APIReporter = class {
|
|
|
402
402
|
}
|
|
403
403
|
async endRun(run) {
|
|
404
404
|
if (!this.config.api.enabled) return;
|
|
405
|
-
await this.flushBatch();
|
|
406
405
|
try {
|
|
406
|
+
if (this.batch.length > 0) {
|
|
407
|
+
console.log("[APIReporter] Flushing remaining", this.batch.length, "test results");
|
|
408
|
+
await this.flushBatch();
|
|
409
|
+
console.log("[APIReporter] Waiting for test results to be processed...");
|
|
410
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
411
|
+
}
|
|
407
412
|
console.log("[APIReporter] Finalizing run with test counts:", {
|
|
408
413
|
total: run.total,
|
|
409
414
|
passed: run.passed,
|