2025-04-22 09:02:02 -04:00
|
|
|
|
import type {
|
|
|
|
|
Reporter,
|
|
|
|
|
TestCase,
|
|
|
|
|
TestResult,
|
|
|
|
|
FullResult,
|
|
|
|
|
} from '@playwright/test/reporter'
|
2025-04-11 10:04:13 -04:00
|
|
|
|
|
2025-06-19 20:19:53 -04:00
|
|
|
|
class APIReporter implements Reporter {
|
2025-04-22 09:02:02 -04:00
|
|
|
|
private pendingRequests: Promise<void>[] = []
|
|
|
|
|
private allResults: Record<string, any>[] = []
|
|
|
|
|
private blockingResults: Record<string, any>[] = []
|
|
|
|
|
|
|
|
|
|
async onEnd(result: FullResult): Promise<void> {
|
|
|
|
|
await Promise.all(this.pendingRequests)
|
2025-04-28 19:30:42 -04:00
|
|
|
|
|
|
|
|
|
if (this.allResults.length === 0) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.blockingResults.length === 0) {
|
2025-04-22 09:02:02 -04:00
|
|
|
|
result.status = 'passed'
|
|
|
|
|
if (!process.env.CI) {
|
2025-04-28 19:30:42 -04:00
|
|
|
|
console.log('TAB API - Marked failures as non-blocking')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const response = await fetch(`${process.env.TAB_API_URL}/api/share`, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
headers: new Headers({
|
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
'X-API-Key': process.env.TAB_API_KEY || '',
|
|
|
|
|
}),
|
|
|
|
|
body: JSON.stringify({
|
2025-06-19 20:19:53 -04:00
|
|
|
|
project: `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`,
|
2025-04-28 19:30:42 -04:00
|
|
|
|
branch:
|
|
|
|
|
process.env.GITHUB_HEAD_REF || process.env.GITHUB_REF_NAME || '',
|
|
|
|
|
commit: process.env.CI_COMMIT_SHA || process.env.GITHUB_SHA || '',
|
|
|
|
|
}),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
|
const error = await response.json()
|
|
|
|
|
if (!process.env.CI) {
|
|
|
|
|
console.error('TAB API - Failed to share results:', error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
const message = error instanceof Error ? error.message : String(error)
|
|
|
|
|
if (!process.env.CI) {
|
|
|
|
|
console.error('TAB API - Unable to share results:', message)
|
2025-04-22 09:02:02 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-11 10:04:13 -04:00
|
|
|
|
onTestEnd(test: TestCase, result: TestResult): void {
|
|
|
|
|
if (!process.env.TAB_API_URL || !process.env.TAB_API_KEY) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const payload = {
|
|
|
|
|
// Required information
|
2025-06-19 20:19:53 -04:00
|
|
|
|
project: `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`,
|
2025-05-20 12:56:55 -04:00
|
|
|
|
suite: process.env.CI_SUITE || 'e2e',
|
2025-04-11 11:04:28 -04:00
|
|
|
|
branch: process.env.GITHUB_HEAD_REF || process.env.GITHUB_REF_NAME || '',
|
2025-04-11 10:04:13 -04:00
|
|
|
|
commit: process.env.CI_COMMIT_SHA || process.env.GITHUB_SHA || '',
|
|
|
|
|
test: test.titlePath().slice(2).join(' › '),
|
|
|
|
|
status: result.status,
|
|
|
|
|
// Optional information
|
|
|
|
|
duration: result.duration / 1000,
|
|
|
|
|
message: result.error?.stack,
|
|
|
|
|
target: process.env.TARGET || null,
|
|
|
|
|
platform: process.env.RUNNER_OS || process.platform,
|
|
|
|
|
// Extra test and result data
|
2025-04-14 14:10:47 -04:00
|
|
|
|
annotations: test.annotations.map((a) => a.type), // e.g. 'fail' or 'fixme'
|
2025-04-22 09:02:02 -04:00
|
|
|
|
id: test.id, // computed file/test/project ID used for reruns
|
2025-04-14 09:08:07 -04:00
|
|
|
|
retry: result.retry,
|
2025-04-24 20:50:26 -04:00
|
|
|
|
tags: test.tags, // e.g. '@snapshot' or '@skipLocalEngine'
|
2025-04-11 10:04:13 -04:00
|
|
|
|
// Extra environment variables
|
|
|
|
|
CI_COMMIT_SHA: process.env.CI_COMMIT_SHA || null,
|
|
|
|
|
CI_PR_NUMBER: process.env.CI_PR_NUMBER || null,
|
|
|
|
|
GITHUB_BASE_REF: process.env.GITHUB_BASE_REF || null,
|
|
|
|
|
GITHUB_EVENT_NAME: process.env.GITHUB_EVENT_NAME || null,
|
|
|
|
|
GITHUB_HEAD_REF: process.env.GITHUB_HEAD_REF || null,
|
|
|
|
|
GITHUB_REF_NAME: process.env.GITHUB_REF_NAME || null,
|
|
|
|
|
GITHUB_REF: process.env.GITHUB_REF || null,
|
|
|
|
|
GITHUB_SHA: process.env.GITHUB_SHA || null,
|
|
|
|
|
GITHUB_WORKFLOW: process.env.GITHUB_WORKFLOW || null,
|
|
|
|
|
RUNNER_ARCH: process.env.RUNNER_ARCH || null,
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-22 09:02:02 -04:00
|
|
|
|
const request = (async () => {
|
2025-04-11 10:04:13 -04:00
|
|
|
|
try {
|
|
|
|
|
const response = await fetch(`${process.env.TAB_API_URL}/api/results`, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
headers: new Headers({
|
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
'X-API-Key': process.env.TAB_API_KEY || '',
|
|
|
|
|
}),
|
|
|
|
|
body: JSON.stringify(payload),
|
|
|
|
|
})
|
|
|
|
|
|
2025-04-22 09:02:02 -04:00
|
|
|
|
if (response.ok) {
|
|
|
|
|
const result = await response.json()
|
|
|
|
|
this.allResults.push(result)
|
|
|
|
|
if (result.block) {
|
|
|
|
|
this.blockingResults.push(result)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
const error = await response.json()
|
|
|
|
|
if (!process.env.CI) {
|
|
|
|
|
console.error('TAB API - Failed to send test result:', error)
|
|
|
|
|
}
|
2025-04-11 10:04:13 -04:00
|
|
|
|
}
|
2025-04-22 09:02:02 -04:00
|
|
|
|
} catch (error) {
|
|
|
|
|
const message = error instanceof Error ? error.message : String(error)
|
2025-04-11 10:04:13 -04:00
|
|
|
|
if (!process.env.CI) {
|
2025-04-22 09:02:02 -04:00
|
|
|
|
console.error('TAB API - Unable to send test result:', message)
|
2025-04-11 10:04:13 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})()
|
2025-04-22 09:02:02 -04:00
|
|
|
|
|
|
|
|
|
this.pendingRequests.push(request)
|
2025-04-11 10:04:13 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-19 20:19:53 -04:00
|
|
|
|
export default APIReporter
|