diff --git a/qase-javascript-commons/src/qase.ts b/qase-javascript-commons/src/qase.ts index d4edca9d..21d1f4e9 100644 --- a/qase-javascript-commons/src/qase.ts +++ b/qase-javascript-commons/src/qase.ts @@ -95,11 +95,24 @@ export class QaseReporter extends AbstractReporter { */ private upstreamReporter?: ReporterInterface; + /** + * @type {ReporterInterface} + * @private + */ + private fallbackReporter?: ReporterInterface; + + + /** + * @type {boolean} + * @private + */ + private disabled: boolean = false; + /** * @type {boolean} * @private */ - private disabled = false; + private useFallback: boolean = false; /** * @param {OptionsType} options @@ -112,7 +125,8 @@ export class QaseReporter extends AbstractReporter { super({ debug: composedOptions.debug }, logger); try { - this.upstreamReporter = this.createUpstreamReporter( + this.upstreamReporter = this.createReporter( + composedOptions.mode as ModeEnum || ModeEnum.off, composedOptions, logger, ); @@ -120,7 +134,34 @@ export class QaseReporter extends AbstractReporter { if (error instanceof DisabledException) { this.disabled = true; } else { - throw error; + this.logError('Unable to create upstream reporter:', error); + + if (composedOptions.fallback != undefined) { + this.disabled = true; + return; + } + + this.useFallback = true; + } + } + + try { + this.fallbackReporter = this.createReporter( + composedOptions.fallback as ModeEnum || ModeEnum.off, + composedOptions, + logger, + ); + } catch (error) { + if (error instanceof DisabledException) { + if (this.useFallback) { + this.disabled = true; + } + } else { + this.logError('Unable to create fallback reporter:', error); + + if (this.useFallback && this.upstreamReporter === undefined) { + this.disabled = true; + } } } } @@ -130,32 +171,90 @@ export class QaseReporter extends AbstractReporter { */ public addTestResult(result: TestResultType) { if (!this.disabled) { + this.logTestItem(result); + + if (this.useFallback) { + this.addTestResultToFallback(result); + return; + } + try { - this.logTestItem(result); this.upstreamReporter?.addTestResult(result); - } catch (error) { - this.logError('Unable to process result:', error); + } + catch (error) { + this.logError('Unable to add the result to the upstream reporter:', error); - this.disabled = true; + if (this.fallbackReporter == undefined) { + this.disabled = true; + return; + } + + if (!this.useFallback) { + this.fallbackReporter?.setTestResults(this.upstreamReporter?.getTestResults() ?? []); + this.useFallback = true; + } + + this.addTestResultToFallback(result); } } } + /** + * @param {TestResultType} result + * @private + */ + private addTestResultToFallback(result: TestResultType): void { + try { + this.fallbackReporter?.addTestResult(result); + } + catch (error) { + this.logError('Unable to add the result to the fallback reporter:', error); + this.disabled = true; + } + } + /** * @returns {Promise} */ - public async publish() { + public async publish(): Promise { if (!this.disabled) { + if (this.useFallback) { + await this.publishFallback(); + } + try { await this.upstreamReporter?.publish(); } catch (error) { - this.logError('Unable to publish run results:', error); + this.logError('Unable to publish the run results to the upstream reporter:', error); - this.disabled = true; + if (this.fallbackReporter == undefined) { + this.disabled = true; + return; + } + + if (!this.useFallback) { + this.fallbackReporter?.setTestResults(this.upstreamReporter?.getTestResults() ?? []); + this.useFallback = true; + } + + await this.publishFallback(); } } } + /** + * @returns {Promise} + */ + private async publishFallback(): Promise { + try { + await this.fallbackReporter?.publish(); + } + catch (error) { + this.logError('Unable to publish the run results to the fallback reporter:', error); + this.disabled = true; + } + } + /** * @todo implement mode registry * @param {OptionsType} options @@ -163,7 +262,8 @@ export class QaseReporter extends AbstractReporter { * @returns {ReporterInterface} * @private */ - private createUpstreamReporter( + private createReporter( + mode: ModeEnum, options: OptionsType, logger?: LoggerInterface, ): ReporterInterface { @@ -171,7 +271,6 @@ export class QaseReporter extends AbstractReporter { frameworkPackage, frameworkName, reporterName, - mode = ModeEnum.off, environment, report = {}, testops = {}, diff --git a/qase-javascript-commons/src/reporters/abstract-reporter.ts b/qase-javascript-commons/src/reporters/abstract-reporter.ts index f1fc108e..5fe328e0 100644 --- a/qase-javascript-commons/src/reporters/abstract-reporter.ts +++ b/qase-javascript-commons/src/reporters/abstract-reporter.ts @@ -19,6 +19,8 @@ export type ReporterOptionsType = { export interface ReporterInterface { addTestResult(result: TestResultType): void; publish(): Promise; + getTestResults(): TestResultType[]; + setTestResults(results: TestResultType[]): void; } /** @@ -33,6 +35,8 @@ export abstract class AbstractReporter implements ReporterInterface { */ private debug: boolean | undefined; + protected results: TestResultType[] = []; + /** * @param {TestResultType} result */ @@ -57,6 +61,20 @@ export abstract class AbstractReporter implements ReporterInterface { this.debug = debug; } + /** + * @returns {TestResultType[]} + */ + public getTestResults(): TestResultType[] { + return this.results; + } + + /** + * @param {TestResultType[]} results + */ + public setTestResults(results: TestResultType[]): void { + this.results = results; + } + /** * @param {string} message * @protected diff --git a/qase-javascript-commons/src/reporters/report-reporter.ts b/qase-javascript-commons/src/reporters/report-reporter.ts index 54d46a66..49d4146a 100644 --- a/qase-javascript-commons/src/reporters/report-reporter.ts +++ b/qase-javascript-commons/src/reporters/report-reporter.ts @@ -12,11 +12,6 @@ import { WriterInterface } from '../writer'; * @extends AbstractReporter */ export class ReportReporter extends AbstractReporter { - /** - * @type {TestResultType[]} - * @private - */ - private results: TestResultType[] = []; /** * @param {ReporterOptionsType} options diff --git a/qase-javascript-commons/src/reporters/testops-reporter.ts b/qase-javascript-commons/src/reporters/testops-reporter.ts index 04416609..3dd3eba4 100644 --- a/qase-javascript-commons/src/reporters/testops-reporter.ts +++ b/qase-javascript-commons/src/reporters/testops-reporter.ts @@ -103,11 +103,6 @@ export class TestOpsReporter extends AbstractReporter { */ private environment: number | undefined; - /** - * @type {TestResultType[]} - * @private - */ - private results: TestResultType[] = []; /** * @type {Record} * @private diff --git a/qase-javascript-commons/src/writer/driver-enum.ts b/qase-javascript-commons/src/writer/driver-enum.ts index c310dd1d..1b842eb6 100644 --- a/qase-javascript-commons/src/writer/driver-enum.ts +++ b/qase-javascript-commons/src/writer/driver-enum.ts @@ -11,5 +11,5 @@ export enum DriverEnum { */ export enum FormatEnum { json = 'json', - jsonb = 'jsonb', + jsonb = 'jsonp', }