UNPKG

@stryker-mutator/core

Version:

The extendable JavaScript mutation testing framework

79 lines (68 loc) 2.78 kB
import { StrykerOptions, ReportType, schema } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; import { MutationTestMetricsResult } from 'mutation-testing-metrics'; import { CIProvider } from '../ci/provider.js'; import { DashboardReporterClient } from './dashboard-reporter-client.js'; import { dashboardReporterTokens } from './tokens.js'; import { Report } from './report.js'; export class DashboardReporter implements Reporter { public static readonly inject = tokens( commonTokens.logger, dashboardReporterTokens.dashboardReporterClient, commonTokens.options, dashboardReporterTokens.ciProvider, ); constructor( private readonly log: Logger, private readonly dashboardReporterClient: DashboardReporterClient, private readonly options: StrykerOptions, private readonly ciProvider: CIProvider | null, ) {} private onGoingWork: Promise<void> | undefined; public onMutationTestReportReady(result: schema.MutationTestResult, metrics: MutationTestMetricsResult): void { this.onGoingWork = (async () => { const { projectName, version, moduleName } = this.getContextFromEnvironment(); if (projectName && version) { await this.update(this.toReport(result, metrics), projectName, version, moduleName); } else { this.log.info( 'The report was not send to the dashboard. The dashboard.project and/or dashboard.version values were missing and not detected to be running on a build server.', ); } })(); } public async wrapUp(): Promise<void> { await this.onGoingWork; } private toReport(result: schema.MutationTestResult, metrics: MutationTestMetricsResult): Report { if (this.options.dashboard.reportType === ReportType.Full) { return result; } else { return { mutationScore: metrics.systemUnderTestMetrics.metrics.mutationScore, }; } } private async update(report: Report, projectName: string, version: string, moduleName: string | undefined) { try { const href = await this.dashboardReporterClient.updateReport({ report, moduleName, projectName, version: version, }); this.log.info('Report available at: %s', href); } catch (err) { this.log.error('Could not upload report.', err); } } private getContextFromEnvironment() { return { moduleName: this.options.dashboard.module, projectName: this.options.dashboard.project ?? this.ciProvider?.determineProject(), version: this.options.dashboard.version ?? this.ciProvider?.determineVersion(), }; } }