Skip to content

Commit 9e08d85

Browse files
authored
test: log last request body/query/response on test or hook failure (#40345)
1 parent aed3c5d commit 9e08d85

3 files changed

Lines changed: 45 additions & 12 deletions

File tree

apps/meteor/.mocharc.api.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ module.exports = /** @satisfies {import('mocha').MochaOptions} */ ({
1010
bail: false,
1111
retries: 0,
1212
file: 'tests/end-to-end/teardown.ts',
13+
reporter: 'tests/end-to-end/reporter.ts',
1314
spec: ['tests/end-to-end/api/*.ts', 'tests/end-to-end/api/helpers/**/*', 'tests/end-to-end/api/methods/**/*', 'tests/end-to-end/apps/*'],
1415
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import Mocha from 'mocha';
2+
3+
import { getLastRequest } from './teardown';
4+
5+
const { EVENT_TEST_FAIL } = Mocha.Runner.constants;
6+
7+
module.exports = class FailDumpReporter extends Mocha.reporters.Spec {
8+
constructor(runner: Mocha.Runner, options: Mocha.MochaOptions) {
9+
super(runner, options);
10+
runner.on(EVENT_TEST_FAIL, (runnable) => {
11+
const { lastUrl, lastMethod, lastBody, lastQuery, lastResponse } = getLastRequest();
12+
console.log({
13+
where: runnable.fullTitle(),
14+
type: runnable.type,
15+
lastUrl,
16+
lastMethod,
17+
lastBody,
18+
lastQuery,
19+
lastResponse: lastResponse?.text,
20+
});
21+
});
22+
}
23+
};
Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { afterEach } from 'mocha';
21
import type { Response } from 'supertest';
32

43
import { request } from '../data/api-data';
@@ -7,25 +6,35 @@ const methods = ['get', 'post', 'put', 'del', 'delete'] as const;
76

87
let lastUrl: string;
98
let lastMethod: string;
10-
let lastResponse: Response;
9+
let lastBody: unknown;
10+
let lastQuery: unknown;
11+
let lastResponse: Response | undefined;
1112

1213
methods.forEach((method) => {
1314
const original = request[method];
1415
request[method] = function (url) {
1516
lastUrl = url;
1617
lastMethod = method;
17-
return original(url).expect((res) => {
18+
lastBody = undefined;
19+
lastQuery = undefined;
20+
lastResponse = undefined;
21+
22+
const test = original(url);
23+
const originalSend = test.send.bind(test);
24+
const originalQuery = test.query.bind(test);
25+
test.send = (data) => {
26+
lastBody = data;
27+
return originalSend(data);
28+
};
29+
test.query = (data) => {
30+
lastQuery = data;
31+
return originalQuery(data);
32+
};
33+
34+
return test.expect((res) => {
1835
lastResponse = res;
1936
});
2037
};
2138
});
2239

23-
afterEach(async function () {
24-
if (this.currentTest?.state === 'failed') {
25-
console.log({
26-
lastUrl,
27-
lastMethod,
28-
lastResponse: lastResponse.text,
29-
});
30-
}
31-
});
40+
export const getLastRequest = () => ({ lastUrl, lastMethod, lastBody, lastQuery, lastResponse });

0 commit comments

Comments
 (0)