mirror of
https://github.com/dorny/test-reporter.git
synced 2026-03-21 23:52:12 +01:00
Merge pull request #731 from dt-thomas-durand/feat/slug-prefix
This commit is contained in:
commit
540c28072b
7 changed files with 50 additions and 4 deletions
|
|
@ -212,6 +212,7 @@ jobs:
|
||||||
| time | Test execution time [ms] |
|
| time | Test execution time [ms] |
|
||||||
| url | Check run URL |
|
| url | Check run URL |
|
||||||
| url_html | Check run URL HTML |
|
| url_html | Check run URL HTML |
|
||||||
|
| slug_prefix| Random anchor links slug prefix generated for the summary headers |
|
||||||
|
|
||||||
## Supported formats
|
## Supported formats
|
||||||
|
|
||||||
|
|
|
||||||
28
__tests__/utils/slugger.test.ts
Normal file
28
__tests__/utils/slugger.test.ts
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
import {DEFAULT_OPTIONS} from '../../src/report/get-report.js'
|
||||||
|
import {slug} from '../../src/utils/slugger.js'
|
||||||
|
|
||||||
|
describe('slugger', () => {
|
||||||
|
it('adds prefix from report options to generated slug', () => {
|
||||||
|
const result = slug('r0s1', {
|
||||||
|
...DEFAULT_OPTIONS,
|
||||||
|
slugPrefix: 'prefix-'
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
id: 'user-content-prefix-r0s1',
|
||||||
|
link: '#user-content-prefix-r0s1'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('sanitizes custom prefix using existing slug normalization', () => {
|
||||||
|
const result = slug('r0', {
|
||||||
|
...DEFAULT_OPTIONS,
|
||||||
|
slugPrefix: ' my /custom_prefix?.'
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
id: 'user-content-my-customprefix-r0',
|
||||||
|
link: '#user-content-my-customprefix-r0'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
@ -122,6 +122,8 @@ outputs:
|
||||||
description: Check run URL
|
description: Check run URL
|
||||||
url_html:
|
url_html:
|
||||||
description: Check run URL HTML
|
description: Check run URL HTML
|
||||||
|
slug_prefix:
|
||||||
|
description: Random prefix added to generated report anchor slugs for this action run
|
||||||
runs:
|
runs:
|
||||||
using: 'node20'
|
using: 'node20'
|
||||||
main: 'dist/index.js'
|
main: 'dist/index.js'
|
||||||
|
|
|
||||||
12
dist/index.js
generated
vendored
12
dist/index.js
generated
vendored
|
|
@ -55471,6 +55471,8 @@ function getOctokit(token, options, ...additionalPlugins) {
|
||||||
return new GitHubWithPlugins(getOctokitOptions(token, options));
|
return new GitHubWithPlugins(getOctokitOptions(token, options));
|
||||||
}
|
}
|
||||||
//# sourceMappingURL=github.js.map
|
//# sourceMappingURL=github.js.map
|
||||||
|
// EXTERNAL MODULE: external "node:crypto"
|
||||||
|
var external_node_crypto_ = __nccwpck_require__(7598);
|
||||||
// EXTERNAL MODULE: ./node_modules/adm-zip/adm-zip.js
|
// EXTERNAL MODULE: ./node_modules/adm-zip/adm-zip.js
|
||||||
var adm_zip = __nccwpck_require__(1316);
|
var adm_zip = __nccwpck_require__(1316);
|
||||||
// EXTERNAL MODULE: ./node_modules/picomatch/index.js
|
// EXTERNAL MODULE: ./node_modules/picomatch/index.js
|
||||||
|
|
@ -55957,7 +55959,7 @@ function getExceptionSource(stackTrace, trackedFiles, getRelativePath) {
|
||||||
|
|
||||||
;// CONCATENATED MODULE: ./lib/utils/slugger.js
|
;// CONCATENATED MODULE: ./lib/utils/slugger.js
|
||||||
function slug(name, options) {
|
function slug(name, options) {
|
||||||
const slugId = name
|
const slugId = `${options.slugPrefix}${name}`
|
||||||
.trim()
|
.trim()
|
||||||
.replace(/_/g, '')
|
.replace(/_/g, '')
|
||||||
.replace(/[./\\]/g, '-')
|
.replace(/[./\\]/g, '-')
|
||||||
|
|
@ -55979,6 +55981,7 @@ const MAX_ACTIONS_SUMMARY_LENGTH = 1048576;
|
||||||
const DEFAULT_OPTIONS = {
|
const DEFAULT_OPTIONS = {
|
||||||
listSuites: 'all',
|
listSuites: 'all',
|
||||||
listTests: 'all',
|
listTests: 'all',
|
||||||
|
slugPrefix: '',
|
||||||
baseUrl: '',
|
baseUrl: '',
|
||||||
onlySummary: false,
|
onlySummary: false,
|
||||||
useActionsSummary: true,
|
useActionsSummary: true,
|
||||||
|
|
@ -57951,6 +57954,7 @@ class NetteTesterJunitParser {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
try {
|
try {
|
||||||
|
|
@ -57978,6 +57982,7 @@ class TestReporter {
|
||||||
workDirInput = getInput('working-directory', { required: false });
|
workDirInput = getInput('working-directory', { required: false });
|
||||||
onlySummary = getInput('only-summary', { required: false }) === 'true';
|
onlySummary = getInput('only-summary', { required: false }) === 'true';
|
||||||
useActionsSummary = getInput('use-actions-summary', { required: false }) === 'true';
|
useActionsSummary = getInput('use-actions-summary', { required: false }) === 'true';
|
||||||
|
slugPrefix = `tr-${(0,external_node_crypto_.randomBytes)(4).toString('base64url')}-`;
|
||||||
badgeTitle = getInput('badge-title', { required: false });
|
badgeTitle = getInput('badge-title', { required: false });
|
||||||
reportTitle = getInput('report-title', { required: false });
|
reportTitle = getInput('report-title', { required: false });
|
||||||
collapsed = getInput('collapsed', { required: false });
|
collapsed = getInput('collapsed', { required: false });
|
||||||
|
|
@ -58051,6 +58056,7 @@ class TestReporter {
|
||||||
setOutput('failed', failed);
|
setOutput('failed', failed);
|
||||||
setOutput('skipped', skipped);
|
setOutput('skipped', skipped);
|
||||||
setOutput('time', time);
|
setOutput('time', time);
|
||||||
|
setOutput('slug_prefix', this.slugPrefix);
|
||||||
if (this.failOnError && isFailed) {
|
if (this.failOnError && isFailed) {
|
||||||
setFailed(`Failed test were found and 'fail-on-error' option is set to ${this.failOnError}`);
|
setFailed(`Failed test were found and 'fail-on-error' option is set to ${this.failOnError}`);
|
||||||
return;
|
return;
|
||||||
|
|
@ -58077,7 +58083,7 @@ class TestReporter {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const { listSuites, listTests, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed } = this;
|
const { listSuites, listTests, slugPrefix, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed } = this;
|
||||||
const passed = results.reduce((sum, tr) => sum + tr.passed, 0);
|
const passed = results.reduce((sum, tr) => sum + tr.passed, 0);
|
||||||
const failed = results.reduce((sum, tr) => sum + tr.failed, 0);
|
const failed = results.reduce((sum, tr) => sum + tr.failed, 0);
|
||||||
const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0);
|
const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0);
|
||||||
|
|
@ -58087,6 +58093,7 @@ class TestReporter {
|
||||||
const summary = getReport(results, {
|
const summary = getReport(results, {
|
||||||
listSuites,
|
listSuites,
|
||||||
listTests,
|
listTests,
|
||||||
|
slugPrefix,
|
||||||
baseUrl,
|
baseUrl,
|
||||||
onlySummary,
|
onlySummary,
|
||||||
useActionsSummary,
|
useActionsSummary,
|
||||||
|
|
@ -58115,6 +58122,7 @@ class TestReporter {
|
||||||
const summary = getReport(results, {
|
const summary = getReport(results, {
|
||||||
listSuites,
|
listSuites,
|
||||||
listTests,
|
listTests,
|
||||||
|
slugPrefix,
|
||||||
baseUrl,
|
baseUrl,
|
||||||
onlySummary,
|
onlySummary,
|
||||||
useActionsSummary,
|
useActionsSummary,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as github from '@actions/github'
|
import * as github from '@actions/github'
|
||||||
import {GitHub} from '@actions/github/lib/utils'
|
import {GitHub} from '@actions/github/lib/utils'
|
||||||
|
import {randomBytes} from 'node:crypto'
|
||||||
|
|
||||||
import {ArtifactProvider} from './input-providers/artifact-provider.js'
|
import {ArtifactProvider} from './input-providers/artifact-provider.js'
|
||||||
import {LocalFileProvider} from './input-providers/local-file-provider.js'
|
import {LocalFileProvider} from './input-providers/local-file-provider.js'
|
||||||
|
|
@ -49,6 +50,7 @@ class TestReporter {
|
||||||
readonly workDirInput = core.getInput('working-directory', {required: false})
|
readonly workDirInput = core.getInput('working-directory', {required: false})
|
||||||
readonly onlySummary = core.getInput('only-summary', {required: false}) === 'true'
|
readonly onlySummary = core.getInput('only-summary', {required: false}) === 'true'
|
||||||
readonly useActionsSummary = core.getInput('use-actions-summary', {required: false}) === 'true'
|
readonly useActionsSummary = core.getInput('use-actions-summary', {required: false}) === 'true'
|
||||||
|
readonly slugPrefix = `tr-${randomBytes(4).toString('base64url')}-`
|
||||||
readonly badgeTitle = core.getInput('badge-title', {required: false})
|
readonly badgeTitle = core.getInput('badge-title', {required: false})
|
||||||
readonly reportTitle = core.getInput('report-title', {required: false})
|
readonly reportTitle = core.getInput('report-title', {required: false})
|
||||||
readonly collapsed = core.getInput('collapsed', {required: false}) as 'auto' | 'always' | 'never'
|
readonly collapsed = core.getInput('collapsed', {required: false}) as 'auto' | 'always' | 'never'
|
||||||
|
|
@ -144,6 +146,7 @@ class TestReporter {
|
||||||
core.setOutput('failed', failed)
|
core.setOutput('failed', failed)
|
||||||
core.setOutput('skipped', skipped)
|
core.setOutput('skipped', skipped)
|
||||||
core.setOutput('time', time)
|
core.setOutput('time', time)
|
||||||
|
core.setOutput('slug_prefix', this.slugPrefix)
|
||||||
|
|
||||||
if (this.failOnError && isFailed) {
|
if (this.failOnError && isFailed) {
|
||||||
core.setFailed(`Failed test were found and 'fail-on-error' option is set to ${this.failOnError}`)
|
core.setFailed(`Failed test were found and 'fail-on-error' option is set to ${this.failOnError}`)
|
||||||
|
|
@ -174,7 +177,7 @@ class TestReporter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const {listSuites, listTests, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed} = this
|
const {listSuites, listTests, slugPrefix, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed} = this
|
||||||
|
|
||||||
const passed = results.reduce((sum, tr) => sum + tr.passed, 0)
|
const passed = results.reduce((sum, tr) => sum + tr.passed, 0)
|
||||||
const failed = results.reduce((sum, tr) => sum + tr.failed, 0)
|
const failed = results.reduce((sum, tr) => sum + tr.failed, 0)
|
||||||
|
|
@ -188,6 +191,7 @@ class TestReporter {
|
||||||
{
|
{
|
||||||
listSuites,
|
listSuites,
|
||||||
listTests,
|
listTests,
|
||||||
|
slugPrefix,
|
||||||
baseUrl,
|
baseUrl,
|
||||||
onlySummary,
|
onlySummary,
|
||||||
useActionsSummary,
|
useActionsSummary,
|
||||||
|
|
@ -219,6 +223,7 @@ class TestReporter {
|
||||||
const summary = getReport(results, {
|
const summary = getReport(results, {
|
||||||
listSuites,
|
listSuites,
|
||||||
listTests,
|
listTests,
|
||||||
|
slugPrefix,
|
||||||
baseUrl,
|
baseUrl,
|
||||||
onlySummary,
|
onlySummary,
|
||||||
useActionsSummary,
|
useActionsSummary,
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ const MAX_ACTIONS_SUMMARY_LENGTH = 1048576
|
||||||
export interface ReportOptions {
|
export interface ReportOptions {
|
||||||
listSuites: 'all' | 'failed' | 'none'
|
listSuites: 'all' | 'failed' | 'none'
|
||||||
listTests: 'all' | 'failed' | 'none'
|
listTests: 'all' | 'failed' | 'none'
|
||||||
|
slugPrefix: string
|
||||||
baseUrl: string
|
baseUrl: string
|
||||||
onlySummary: boolean
|
onlySummary: boolean
|
||||||
useActionsSummary: boolean
|
useActionsSummary: boolean
|
||||||
|
|
@ -22,6 +23,7 @@ export interface ReportOptions {
|
||||||
export const DEFAULT_OPTIONS: ReportOptions = {
|
export const DEFAULT_OPTIONS: ReportOptions = {
|
||||||
listSuites: 'all',
|
listSuites: 'all',
|
||||||
listTests: 'all',
|
listTests: 'all',
|
||||||
|
slugPrefix: '',
|
||||||
baseUrl: '',
|
baseUrl: '',
|
||||||
onlySummary: false,
|
onlySummary: false,
|
||||||
useActionsSummary: true,
|
useActionsSummary: true,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
import {ReportOptions} from '../report/get-report.js'
|
import {ReportOptions} from '../report/get-report.js'
|
||||||
|
|
||||||
export function slug(name: string, options: ReportOptions): {id: string; link: string} {
|
export function slug(name: string, options: ReportOptions): {id: string; link: string} {
|
||||||
const slugId = name
|
const slugId = `${options.slugPrefix}${name}`
|
||||||
.trim()
|
.trim()
|
||||||
.replace(/_/g, '')
|
.replace(/_/g, '')
|
||||||
.replace(/[./\\]/g, '-')
|
.replace(/[./\\]/g, '-')
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue