mirror of
https://github.com/dorny/test-reporter.git
synced 2025-12-17 06:47:09 +01:00
107 lines
2.7 KiB
TypeScript
107 lines
2.7 KiB
TypeScript
import {ellipsis, fixEol} from '../utils/markdown-utils'
|
|
import {TestRunResult} from '../test-results'
|
|
import {getFirstNonEmptyLine} from '../utils/parse-utils'
|
|
|
|
export type Annotation = {
|
|
path: string
|
|
start_line: number
|
|
end_line: number
|
|
start_column?: number
|
|
end_column?: number
|
|
annotation_level: 'notice' | 'warning' | 'failure'
|
|
message: string
|
|
title?: string
|
|
raw_details?: string
|
|
}
|
|
|
|
interface TestError {
|
|
testRunPaths: string[]
|
|
suiteName: string
|
|
testName: string
|
|
path: string
|
|
line: number
|
|
message: string
|
|
details: string
|
|
}
|
|
|
|
export function getAnnotations(results: TestRunResult[], maxCount: number): Annotation[] {
|
|
if (maxCount === 0) {
|
|
return []
|
|
}
|
|
|
|
// Collect errors from TestRunResults
|
|
// Merge duplicates if there are more test results files processed
|
|
const errors: TestError[] = []
|
|
const mergeDup = results.length > 1
|
|
for (const tr of results) {
|
|
for (const ts of tr.suites) {
|
|
for (const tg of ts.groups) {
|
|
for (const tc of tg.tests) {
|
|
const err = tc.error
|
|
if (err === undefined) {
|
|
continue
|
|
}
|
|
const path = err.path ?? tr.path
|
|
const line = err.line ?? 0
|
|
if (mergeDup) {
|
|
const dup = errors.find(e => path === e.path && line === e.line && err.details === e.details)
|
|
if (dup !== undefined) {
|
|
dup.testRunPaths.push(tr.path)
|
|
continue
|
|
}
|
|
}
|
|
|
|
errors.push({
|
|
testRunPaths: [tr.path],
|
|
suiteName: ts.name,
|
|
testName: tg.name ? `${tg.name} ► ${tc.name}` : tc.name,
|
|
details: err.details,
|
|
message: err.message ?? getFirstNonEmptyLine(err.details) ?? 'Test failed',
|
|
path,
|
|
line
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Limit number of created annotations
|
|
errors.splice(maxCount + 1)
|
|
|
|
const annotations = errors.map(e => {
|
|
const message = [
|
|
'Failed test found in:',
|
|
e.testRunPaths.map(p => ` ${p}`).join('\n'),
|
|
'Error:',
|
|
ident(fixEol(e.message), ' ')
|
|
].join('\n')
|
|
|
|
return enforceCheckRunLimits({
|
|
path: e.path,
|
|
start_line: e.line,
|
|
end_line: e.line,
|
|
annotation_level: 'failure',
|
|
title: `${e.suiteName} ► ${e.testName}`,
|
|
raw_details: fixEol(e.details),
|
|
message
|
|
})
|
|
})
|
|
|
|
return annotations
|
|
}
|
|
|
|
function enforceCheckRunLimits(err: Annotation): Annotation {
|
|
err.title = ellipsis(err.title || '', 255)
|
|
err.message = ellipsis(err.message, 65535)
|
|
if (err.raw_details) {
|
|
err.raw_details = ellipsis(err.raw_details, 65535)
|
|
}
|
|
return err
|
|
}
|
|
|
|
function ident(text: string, prefix: string): string {
|
|
return text
|
|
.split(/\n/g)
|
|
.map(line => prefix + line)
|
|
.join('\n')
|
|
}
|