5

I want to print or console log below details on failure for Supertest expect failure for the below request on success no need to print any thing on success

const result = await request(dummy_url).get("repos/Microsoft/TypeScript/pulls")
      .set("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) Gecko/20100101 Firefox/87.0")
      .expect(200)
      .then(response => {
        console.log("success");
        console.log(response);
        return response;
      }).catch(error => {
        console.log("error");
        // console.log(error);
        return 2;
      })
    console.log(result)
    done();

on failure lets say I modify the url as dummy instead of pull, I need to know the request url, path parma and request body if any,

currenly on trying to add it in the above way it only gives the below error

Error: expected 200 "OK", got 404 "Not Found"
        at Object.<anonymous> (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/__tests__/github-routes/jest.test.ts:40:8)
        at /Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/jest-jasmine2/build/queueRunner.js:45:12
        at new Promise (<anonymous>)
        at mapper (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
        at /Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/jest-jasmine2/build/queueRunner.js:75:41
        at processTicksAndRejections (node:internal/process/task_queues:96:5)
    ----
        at Test.Object.<anonymous>.Test._assertStatus (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/supertest/lib/test.js:296:12)
        at /Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/supertest/lib/test.js:80:15
        at Test.Object.<anonymous>.Test._assertFunction (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/supertest/lib/test.js:311:11)
        at Test.Object.<anonymous>.Test.assert (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/supertest/lib/test.js:201:21)
        at localAssert (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/supertest/lib/test.js:159:12)
        at fn (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/supertest/lib/test.js:156:5)
        at Test.callback (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/superagent/src/node/index.js:902:3)
        at fn (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/superagent/src/node/index.js:1130:18)
        at IncomingMessage.<anonymous> (/Users/thoughtworks/projects/api-test-supertest-jest-typescript/node_modules/superagent/src/node/parsers/json.js:19:7)
        at Stream.emit (node:events:365:28)

things to note, I am using this in Typescript, inside the async function, thought this is not a blocker for now.

Bharathan Kumaran
  • 981
  • 10
  • 22

1 Answers1

4

After multiple try and attempts, I was able to come up with a function that logs the request details, I pass on the response from supertest along with the expected status code. On failure, the function will log the details of request and response like path parm, query parm, req body

import SuperTest from "supertest";
export const checkStatusCode = (res: any, expectedStatus: any = 200): SuperTest.Response => {
  if (res.status === expectedStatus) {
    return res
  };
  const error = res.error;
  const reqData = JSON.parse(JSON.stringify(res)).req;
  throw new Error(` 
  request-method  : ${JSON.stringify(reqData.method)} 
  request-url     : ${JSON.stringify(reqData.url)}
  request-data    : ${JSON.stringify(reqData.data)}
  request-headers : ${JSON.stringify(reqData.headers)}
  reponse-status  : ${JSON.stringify(res.status)}
  reponse-body    : ${JSON.stringify(res.body)}
  `
  );
};

usage in jest test file


describe("Jest - Api - user", () => {
  it("Verify POST ", async () => {
    const res = await request(url.someurl)
      .post("/dummy")
      .set("Authorization", authToken)
      .send(updateThirdParty)
    checkStatusCode(res, 200)
  })
})

The solution is inspired from one of the suggestion in supertest github issue. Thanks to sakovias. Note: this is function that logs the data, we can still have this as wrapper to the expect itself, which I will post as separate thread.

Bharathan Kumaran
  • 981
  • 10
  • 22