From 659d6539a2d41f1ad3999b167d7c40b988858665 Mon Sep 17 00:00:00 2001 From: Matthieu ROBIN Date: Fri, 24 Nov 2023 10:37:44 +0100 Subject: [PATCH] (fix): mark test as broken when a request error occurs (fixes #649, via #806) --- packages/newman-reporter-allure/src/index.ts | 25 +++++--- .../test/mocks/handlers.ts | 3 + .../test/specs/requestError.ts | 60 +++++++++++++++++++ 3 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 packages/newman-reporter-allure/test/specs/requestError.ts diff --git a/packages/newman-reporter-allure/src/index.ts b/packages/newman-reporter-allure/src/index.ts index b348c2635..36cd00560 100644 --- a/packages/newman-reporter-allure/src/index.ts +++ b/packages/newman-reporter-allure/src/index.ts @@ -35,6 +35,7 @@ interface PmItem { name: string; passed: boolean; failedAssertions: string[]; + requestError?: string; consoleLogs: string[]; requestData?: PmRequestData; responseData?: PmResponseData; @@ -381,6 +382,7 @@ class AllureReporter { } const failedAssertions = this.currentRunningItem?.pmItem.failedAssertions; + const requestError = this.currentRunningItem?.pmItem.requestError; if (response && failedAssertions?.length) { const msg = this.escape(failedAssertions.join(", ")); @@ -402,6 +404,11 @@ class AllureReporter { if (this.currentRunningItem) { this.endTest(this.currentRunningItem.allureTest, status, { message: error.message }); } + } else if (requestError) { + const errorMsg = this.escape(requestError); + if (this.currentRunningItem) { + this.endTest(this.currentRunningItem?.allureTest, Status.BROKEN, { message: errorMsg }); + } } else if (this.currentRunningItem) { this.endTest(this.currentRunningItem?.allureTest, Status.PASSED); } @@ -440,25 +447,29 @@ class AllureReporter { response: Response; }, ) { - if (err) { - return; - } - const req = args.request; const url = `${ req.url.protocol || "" }://${args.request.url.getHost()}${req.url.getPathWithQuery()}`; - const respStream = args.response.stream; - const respBody = (respStream && Buffer.from(respStream).toString()) || ""; - this.runningItems[this.runningItems.length - 1].pmItem.requestData = { url: url, method: req.method, body: req.body, }; + if (err) { + if (this.currentRunningItem) { + this.currentRunningItem.pmItem.passed = false; + this.currentRunningItem.pmItem.requestError = err.message; + } + return; + } + + const respStream = args.response.stream; + const respBody = (respStream && Buffer.from(respStream).toString()) || ""; + this.runningItems[this.runningItems.length - 1].pmItem.responseData = { status: args.response.status, code: args.response.code, diff --git a/packages/newman-reporter-allure/test/mocks/handlers.ts b/packages/newman-reporter-allure/test/mocks/handlers.ts index 31aabf874..6fcff5b96 100644 --- a/packages/newman-reporter-allure/test/mocks/handlers.ts +++ b/packages/newman-reporter-allure/test/mocks/handlers.ts @@ -4,4 +4,7 @@ export const handlers = [ rest.get("http://example.com/test", (req, res, ctx) => { return res(ctx.status(200)); }), + rest.get("http://example.com/timeout", (req, res, ctx) => { + return res.networkError("Timeout"); + }), ]; diff --git a/packages/newman-reporter-allure/test/specs/requestError.ts b/packages/newman-reporter-allure/test/specs/requestError.ts new file mode 100644 index 000000000..fd95a7840 --- /dev/null +++ b/packages/newman-reporter-allure/test/specs/requestError.ts @@ -0,0 +1,60 @@ +/* eslint-disable @typescript-eslint/quotes */ +import { Status } from "allure-js-commons"; +import { expect } from "expect"; +import { after, before, afterEach, test } from "mocha"; +import { runNewman } from "../helpers/runNewman"; +import { server } from "../mocks/server"; + +before(() => server.listen()); +afterEach(() => server.resetHandlers()); +after(() => server.close()); + +test("Mark test as failed when a request error occurs", async () => { + const [result] = await runNewman({ + item: [ + { + name: "testReq", + event: [ + { + listen: "test", + script: { + exec: [ + 'pm.test("Status code is 200", function () {', + " pm.response.to.have.status(200);", + "});", + ], + type: "text/javascript", + }, + }, + ], + request: { + method: "GET", + header: [], + url: { + host: ["example", "com"], + path: ["timeout"], + }, + }, + response: [], + }, + ], + }); + expect(result.status).toBe(Status.BROKEN); + expect(result.parameters).toEqual([ + { name: "Request", value: "GET - http://example.com/timeout" }, + ]); + expect(result.steps).toEqual([ + { + status: "failed" as any, + stage: "finished" as any, + statusDetails: {}, + steps: [], + attachments: [], + parameters: [], + name: "Status code is 200", + start: expect.any(Number), + stop: expect.any(Number), + }, + ]); + expect(result.statusDetails.message).toBe("Timeout"); +});