@eggjs/supertest 9.0.0-beta.20 → 9.0.0-beta.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,28 @@
1
+ import type { Server } from 'node:net';
2
+ import { agent as Agent } from 'superagent';
3
+ import { Test } from './test.ts';
4
+ import type { AgentOptions, App } from './types.ts';
5
+ /**
6
+ * Initialize a new `TestAgent`.
7
+ *
8
+ * @param {Function|Server} app
9
+ * @param {Object} options
10
+ */
11
+ export declare class TestAgent extends Agent {
12
+ #private;
13
+ app: Server | string;
14
+ _host: string;
15
+ constructor(appOrListener: App, options?: AgentOptions);
16
+ host(host: string): this;
17
+ protected _testRequest(method: string, url: string): Test;
18
+ delete(url: string): Test;
19
+ del(url: string): Test;
20
+ get(url: string): Test;
21
+ head(url: string): Test;
22
+ put(url: string): Test;
23
+ post(url: string): Test;
24
+ patch(url: string): Test;
25
+ options(url: string): Test;
26
+ trace(url: string): Test;
27
+ }
28
+ export declare const proxyAgent: typeof TestAgent;
package/dist/agent.js ADDED
@@ -0,0 +1,87 @@
1
+ import http from 'node:http';
2
+ import http2 from 'node:http2';
3
+ import { agent as Agent } from 'superagent';
4
+ import { Test } from "./test.js";
5
+ /**
6
+ * Initialize a new `TestAgent`.
7
+ *
8
+ * @param {Function|Server} app
9
+ * @param {Object} options
10
+ */
11
+ export class TestAgent extends Agent {
12
+ app;
13
+ _host;
14
+ #http2 = false;
15
+ constructor(appOrListener, options = {}) {
16
+ super(options);
17
+ if (typeof appOrListener === 'function') {
18
+ if (options.http2) {
19
+ this.#http2 = true;
20
+ this.app = http2.createServer(appOrListener); // eslint-disable-line no-param-reassign
21
+ }
22
+ else {
23
+ this.app = http.createServer(appOrListener); // eslint-disable-line no-param-reassign
24
+ }
25
+ }
26
+ else {
27
+ this.app = appOrListener;
28
+ }
29
+ }
30
+ // set a host name
31
+ host(host) {
32
+ this._host = host;
33
+ return this;
34
+ }
35
+ // TestAgent.prototype.del = TestAgent.prototype.delete;
36
+ _testRequest(method, url) {
37
+ const req = new Test(this.app, method.toUpperCase(), url);
38
+ if (this.#http2) {
39
+ req.http2();
40
+ }
41
+ if (this._host) {
42
+ req.set('host', this._host);
43
+ }
44
+ const that = this;
45
+ // access not internal methods
46
+ req.on('response', that._saveCookies.bind(this));
47
+ req.on('redirect', that._saveCookies.bind(this));
48
+ req.on('redirect', that._attachCookies.bind(this, req));
49
+ that._setDefaults(req);
50
+ that._attachCookies(req);
51
+ return req;
52
+ }
53
+ delete(url) {
54
+ return this._testRequest('delete', url);
55
+ }
56
+ del(url) {
57
+ return this._testRequest('delete', url);
58
+ }
59
+ get(url) {
60
+ return this._testRequest('get', url);
61
+ }
62
+ head(url) {
63
+ return this._testRequest('head', url);
64
+ }
65
+ put(url) {
66
+ return this._testRequest('put', url);
67
+ }
68
+ post(url) {
69
+ return this._testRequest('post', url);
70
+ }
71
+ patch(url) {
72
+ return this._testRequest('patch', url);
73
+ }
74
+ options(url) {
75
+ return this._testRequest('options', url);
76
+ }
77
+ trace(url) {
78
+ return this._testRequest('trace', url);
79
+ }
80
+ }
81
+ // allow keep use by `agent()`
82
+ export const proxyAgent = new Proxy(TestAgent, {
83
+ apply(target, _, argumentsList) {
84
+ return new target(argumentsList[0], argumentsList[1]);
85
+ },
86
+ });
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUcvQixPQUFPLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR2pDOzs7OztHQUtHO0FBRUgsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBQ2xDLEdBQUcsQ0FBa0I7SUFDckIsS0FBSyxDQUFTO0lBQ2QsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUVmLFlBQVksYUFBa0IsRUFBRSxVQUF3QixFQUFFO1FBQ3hELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksT0FBTyxhQUFhLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBa0MsQ0FBQyxDQUFDLENBQUMsd0NBQXdDO1lBQzdHLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBa0MsQ0FBQyxDQUFDLENBQUMsd0NBQXdDO1lBQzVHLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxJQUFZO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsd0RBQXdE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
@@ -0,0 +1,5 @@
1
+ export declare class AssertError extends Error {
2
+ expected: any;
3
+ actual: any;
4
+ constructor(message: string, expected: any, actual: any, options?: ErrorOptions);
5
+ }
@@ -0,0 +1,12 @@
1
+ export class AssertError extends Error {
2
+ expected;
3
+ actual;
4
+ constructor(message, expected, actual, options) {
5
+ super(message, options);
6
+ this.name = this.constructor.name;
7
+ this.expected = expected;
8
+ this.actual = actual;
9
+ Error.captureStackTrace(this, this.constructor);
10
+ }
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNzZXJ0RXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3IvQXNzZXJ0RXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVksU0FBUSxLQUFLO0lBQ3BDLFFBQVEsQ0FBTTtJQUNkLE1BQU0sQ0FBTTtJQUVaLFlBQVksT0FBZSxFQUFFLFFBQWEsRUFBRSxNQUFXLEVBQUUsT0FBc0I7UUFDN0UsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRiJ9
package/dist/index.d.ts CHANGED
@@ -1,172 +1,14 @@
1
- import { RequestListener } from "node:http";
2
- import { Http2ServerRequest, Http2ServerResponse } from "node:http2";
3
- import { AgentOptions, Request as Request$1, Response, agent } from "superagent";
4
- import { Server } from "node:net";
5
-
6
- //#region src/types.d.ts
7
- type H2RequestListener = (request: Http2ServerRequest, response: Http2ServerResponse) => void;
8
- type H1RequestListener = RequestListener;
9
- type App = Server | H1RequestListener | H2RequestListener | string;
10
- interface AgentOptions$1 extends AgentOptions {
11
- http2?: boolean;
12
- }
13
- //#endregion
14
- //#region src/error/AssertError.d.ts
15
- declare class AssertError extends Error {
16
- expected: any;
17
- actual: any;
18
- constructor(message: string, expected: any, actual: any, options?: ErrorOptions);
19
- }
20
- //#endregion
21
- //#region src/test.d.ts
22
- type TestApplication = Server | string;
23
- type AssertFunction = (res: Response) => AssertError | void;
24
- type CallbackFunction = (err: AssertError | Error | null, res: Response) => void;
25
- type ResponseError = Error & {
26
- syscall?: string;
27
- code?: string;
28
- status?: number;
29
- };
30
- interface ExpectHeader {
31
- name: string;
32
- value: string | number | RegExp;
33
- }
34
- declare class Test extends Request$1 {
35
- app: TestApplication;
36
- _server: Server;
37
- _asserts: AssertFunction[];
38
- /**
39
- * Initialize a new `Test` with the given `app`,
40
- * request `method` and `path`.
41
- */
42
- constructor(app: TestApplication, method: string, path: string);
43
- /**
44
- * Returns a URL, extracted from a server.
45
- *
46
- * @return {String} URL address
47
- * @private
48
- */
49
- protected serverAddress(app: Server, path: string): string;
50
- /**
51
- * Expectations:
52
- *
53
- * ```js
54
- * .expect(200)
55
- * .expect(200, fn)
56
- * .expect(200, body)
57
- * .expect('Some body')
58
- * .expect('Some body', fn)
59
- * .expect(['json array body', { key: 'val' }])
60
- * .expect('Content-Type', 'application/json')
61
- * .expect('Content-Type', 'application/json', fn)
62
- * .expect(fn)
63
- * .expect([200, 404])
64
- * ```
65
- *
66
- * @return {Test} The current Test instance for chaining.
67
- */
68
- expect(a: number | string | RegExp | object | AssertFunction, b?: string | number | RegExp | CallbackFunction, c?: CallbackFunction): Test;
69
- /**
70
- * UnExpectations:
71
- *
72
- * .unexpectHeader('Content-Type')
73
- * .unexpectHeader('Content-Type', fn)
74
- */
75
- unexpectHeader(name: string, fn?: CallbackFunction): this;
76
- /**
77
- * Expectations:
78
- *
79
- * .expectHeader('Content-Type')
80
- * .expectHeader('Content-Type', fn)
81
- */
82
- expectHeader(name: string, fn?: CallbackFunction): this;
83
- _unexpectHeader(name: string, res: Response): AssertError | undefined;
84
- _expectHeader(name: string, res: Response): AssertError | undefined;
85
- /**
86
- * Defer invoking superagent's `.end()` until
87
- * the server is listening.
88
- */
89
- end(fn: CallbackFunction): this;
90
- /**
91
- * Perform assertions and invoke `fn(err, res)`.
92
- */
93
- assert(resError: ResponseError | null, res: Response, fn: CallbackFunction): void;
94
- /**
95
- * Perform assertions on a response body and return an Error upon failure.
96
- */
97
- _assertBody(body: RegExp | string | number | object | null | undefined, res: Response): AssertError | undefined;
98
- /**
99
- * Perform assertions on a response header and return an Error upon failure.
100
- */
101
- _assertHeader(header: ExpectHeader, res: Response): AssertError | undefined;
102
- /**
103
- * Perform assertions on the response status and return an Error upon failure.
104
- */
105
- _assertStatus(status: number, res: Response): AssertError | undefined;
106
- /**
107
- * Perform assertions on the response status and return an Error upon failure.
108
- */
109
- _assertStatusArray(statusArray: number[], res: Response): AssertError | undefined;
110
- /**
111
- * Performs an assertion by calling a function and return an Error upon failure.
112
- */
113
- _assertFunction(fn: AssertFunction, res: Response): Error | undefined;
114
- }
115
- //#endregion
116
- //#region src/request.d.ts
117
- interface RequestOptions {
118
- http2?: boolean;
119
- }
120
- declare class Request {
121
- #private;
122
- app: string | Server;
123
- constructor(appOrListener: App, options?: RequestOptions);
124
- protected _testRequest(method: string, url: string): Test;
125
- delete(url: string): Test;
126
- del(url: string): Test;
127
- get(url: string): Test;
128
- head(url: string): Test;
129
- put(url: string): Test;
130
- post(url: string): Test;
131
- patch(url: string): Test;
132
- options(url: string): Test;
133
- trace(url: string): Test;
134
- }
135
- //#endregion
136
- //#region src/agent.d.ts
137
- /**
138
- * Initialize a new `TestAgent`.
139
- *
140
- * @param {Function|Server} app
141
- * @param {Object} options
142
- */
143
- declare class TestAgent extends agent {
144
- #private;
145
- app: Server | string;
146
- _host: string;
147
- constructor(appOrListener: App, options?: AgentOptions$1);
148
- host(host: string): this;
149
- protected _testRequest(method: string, url: string): Test;
150
- delete(url: string): Test;
151
- del(url: string): Test;
152
- get(url: string): Test;
153
- head(url: string): Test;
154
- put(url: string): Test;
155
- post(url: string): Test;
156
- patch(url: string): Test;
157
- options(url: string): Test;
158
- trace(url: string): Test;
159
- }
160
- declare const proxyAgent: typeof TestAgent;
161
- //#endregion
162
- //#region src/index.d.ts
1
+ import { Request, type RequestOptions } from './request.ts';
2
+ import { TestAgent, proxyAgent } from './agent.ts';
3
+ import type { App, AgentOptions } from './types.ts';
163
4
  /**
164
5
  * Test against the given `app`,
165
6
  * returning a new `Test`.
166
7
  */
167
- declare function request(app: App, options?: RequestOptions): Request;
8
+ export declare function request(app: App, options?: RequestOptions): Request;
9
+ export { Request, type RequestOptions, TestAgent, proxyAgent as agent, };
10
+ export * from './test.ts';
168
11
  declare const _default: ((app: App, options?: RequestOptions) => Request) & {
169
- agent: (app: App, options?: AgentOptions$1) => TestAgent;
12
+ agent: (app: App, options?: AgentOptions) => TestAgent;
170
13
  };
171
- //#endregion
172
- export { AssertFunction, CallbackFunction, ExpectHeader, Request, type RequestOptions, ResponseError, Test, TestAgent, TestApplication, proxyAgent as agent, _default as default, request };
14
+ export default _default;
package/dist/index.js CHANGED
@@ -1,384 +1,30 @@
1
- import http, { STATUS_CODES } from "node:http";
2
- import http2 from "node:http2";
3
- import { inspect } from "node:util";
4
- import { Server } from "node:tls";
5
- import { deepStrictEqual } from "node:assert";
6
- import { Request as Request$1, agent } from "superagent";
7
-
8
- //#region src/error/AssertError.ts
9
- var AssertError = class extends Error {
10
- expected;
11
- actual;
12
- constructor(message, expected, actual, options) {
13
- super(message, options);
14
- this.name = this.constructor.name;
15
- this.expected = expected;
16
- this.actual = actual;
17
- Error.captureStackTrace(this, this.constructor);
18
- }
19
- };
20
-
21
- //#endregion
22
- //#region src/test.ts
23
- var Test = class extends Request$1 {
24
- app;
25
- _server;
26
- _asserts = [];
27
- /**
28
- * Initialize a new `Test` with the given `app`,
29
- * request `method` and `path`.
30
- */
31
- constructor(app, method, path) {
32
- super(method.toUpperCase(), path);
33
- this.redirects(0);
34
- this.buffer();
35
- this.app = app;
36
- this.url = typeof app === "string" ? app + path : this.serverAddress(app, path);
37
- }
38
- /**
39
- * Returns a URL, extracted from a server.
40
- *
41
- * @return {String} URL address
42
- * @private
43
- */
44
- serverAddress(app, path) {
45
- if (!app.address()) this._server = app.listen(0);
46
- const port = app.address().port;
47
- return `${app instanceof Server || this._server instanceof Server ? "https" : "http"}://127.0.0.1:${port}${path}`;
48
- }
49
- /**
50
- * Expectations:
51
- *
52
- * ```js
53
- * .expect(200)
54
- * .expect(200, fn)
55
- * .expect(200, body)
56
- * .expect('Some body')
57
- * .expect('Some body', fn)
58
- * .expect(['json array body', { key: 'val' }])
59
- * .expect('Content-Type', 'application/json')
60
- * .expect('Content-Type', 'application/json', fn)
61
- * .expect(fn)
62
- * .expect([200, 404])
63
- * ```
64
- *
65
- * @return {Test} The current Test instance for chaining.
66
- */
67
- expect(a, b, c) {
68
- if (typeof a === "function") {
69
- this._asserts.push(wrapAssertFn(a));
70
- return this;
71
- }
72
- if (typeof b === "function") this.end(b);
73
- if (typeof c === "function") this.end(c);
74
- if (typeof a === "number") {
75
- this._asserts.push(wrapAssertFn(this._assertStatus.bind(this, a)));
76
- if (typeof b !== "function" && arguments.length > 1) this._asserts.push(wrapAssertFn(this._assertBody.bind(this, b)));
77
- return this;
78
- }
79
- if (Array.isArray(a) && a.length > 0 && a.every((val) => typeof val === "number")) {
80
- this._asserts.push(wrapAssertFn(this._assertStatusArray.bind(this, a)));
81
- return this;
82
- }
83
- if (typeof b === "string" || typeof b === "number" || b instanceof RegExp) {
84
- this._asserts.push(wrapAssertFn(this._assertHeader.bind(this, {
85
- name: String(a),
86
- value: b
87
- })));
88
- return this;
89
- }
90
- this._asserts.push(wrapAssertFn(this._assertBody.bind(this, a)));
91
- return this;
92
- }
93
- /**
94
- * UnExpectations:
95
- *
96
- * .unexpectHeader('Content-Type')
97
- * .unexpectHeader('Content-Type', fn)
98
- */
99
- unexpectHeader(name, fn) {
100
- if (typeof fn === "function") this.end(fn);
101
- if (typeof name === "string") this._asserts.push(this._unexpectHeader.bind(this, name));
102
- return this;
103
- }
104
- /**
105
- * Expectations:
106
- *
107
- * .expectHeader('Content-Type')
108
- * .expectHeader('Content-Type', fn)
109
- */
110
- expectHeader(name, fn) {
111
- if (typeof fn === "function") this.end(fn);
112
- if (typeof name === "string") this._asserts.push(this._expectHeader.bind(this, name));
113
- return this;
114
- }
115
- _unexpectHeader(name, res) {
116
- const actual = res.headers[name.toLowerCase()];
117
- if (actual) return new AssertError("unexpected \"" + name + "\" header field, got \"" + actual + "\"", name, actual);
118
- }
119
- _expectHeader(name, res) {
120
- const actual = res.headers[name.toLowerCase()];
121
- if (!actual) return new AssertError("expected \"" + name + "\" header field", name, actual);
122
- }
123
- /**
124
- * Defer invoking superagent's `.end()` until
125
- * the server is listening.
126
- */
127
- end(fn) {
128
- const server = this._server;
129
- super.end((err, res) => {
130
- const localAssert = () => {
131
- this.assert(err, res, fn);
132
- };
133
- if (server && "_handle" in server && server._handle) return server.close(localAssert);
134
- localAssert();
135
- });
136
- return this;
137
- }
138
- /**
139
- * Perform assertions and invoke `fn(err, res)`.
140
- */
141
- assert(resError, res, fn) {
142
- let errorObj;
143
- const sysErrors = {
144
- ECONNREFUSED: "Connection refused",
145
- ECONNRESET: "Connection reset by peer",
146
- EPIPE: "Broken pipe",
147
- ETIMEDOUT: "Operation timed out"
148
- };
149
- if (!res && resError) if (resError instanceof Error && resError.syscall === "connect" && resError.code && sysErrors[resError.code]) errorObj = /* @__PURE__ */ new Error(resError.code + ": " + sysErrors[resError.code]);
150
- else errorObj = resError;
151
- for (let i = 0; i < this._asserts.length && !errorObj; i += 1) errorObj = this._assertFunction(this._asserts[i], res);
152
- if (!errorObj && resError instanceof Error && (!res || resError.status !== res.status)) errorObj = resError;
153
- if (!fn) {
154
- console.warn("[@eggjs/supertest] no callback function provided, fn: %s", typeof fn);
155
- return;
156
- }
157
- fn.call(this, errorObj || null, res);
158
- }
159
- /**
160
- * Perform assertions on a response body and return an Error upon failure.
161
- */
162
- _assertBody(body, res) {
163
- const isRegexp = body instanceof RegExp;
164
- if (typeof body === "object" && !isRegexp) try {
165
- deepStrictEqual(body, res.body);
166
- } catch (err) {
167
- const a = inspect(body);
168
- const b = inspect(res.body);
169
- return new AssertError("expected " + a + " response body, got " + b, body, res.body, { cause: err });
170
- }
171
- else if (body !== res.text) {
172
- const a = inspect(body);
173
- const b = inspect(res.text);
174
- if (isRegexp) {
175
- if (!body.test(res.text)) return new AssertError("expected body " + b + " to match " + body, body, res.body);
176
- } else return new AssertError("expected " + a + " response body, got " + b, body, res.body);
177
- }
178
- }
179
- /**
180
- * Perform assertions on a response header and return an Error upon failure.
181
- */
182
- _assertHeader(header, res) {
183
- const field = header.name;
184
- const actual = res.header[field.toLowerCase()];
185
- const fieldExpected = header.value;
186
- if (typeof actual === "undefined") return new AssertError("expected \"" + field + "\" header field", header, actual);
187
- if (Array.isArray(actual) && actual.toString() === fieldExpected || fieldExpected === actual) return;
188
- if (fieldExpected instanceof RegExp) {
189
- if (!fieldExpected.test(actual)) return new AssertError("expected \"" + field + "\" matching " + fieldExpected + ", got \"" + actual + "\"", header, actual);
190
- } else return new AssertError("expected \"" + field + "\" of \"" + fieldExpected + "\", got \"" + actual + "\"", header, actual);
191
- }
192
- /**
193
- * Perform assertions on the response status and return an Error upon failure.
194
- */
195
- _assertStatus(status, res) {
196
- if (res.status !== status) {
197
- const a = STATUS_CODES[status];
198
- const b = STATUS_CODES[res.status];
199
- return new AssertError("expected " + status + " \"" + a + "\", got " + res.status + " \"" + b + "\"", status, res.status);
200
- }
201
- }
202
- /**
203
- * Perform assertions on the response status and return an Error upon failure.
204
- */
205
- _assertStatusArray(statusArray, res) {
206
- if (!statusArray.includes(res.status)) {
207
- const b = STATUS_CODES[res.status];
208
- const expectedList = statusArray.join(", ");
209
- return new AssertError("expected one of \"" + expectedList + "\", got " + res.status + " \"" + b + "\"", statusArray, res.status);
210
- }
211
- }
212
- /**
213
- * Performs an assertion by calling a function and return an Error upon failure.
214
- */
215
- _assertFunction(fn, res) {
216
- let err;
217
- try {
218
- err = fn(res);
219
- } catch (e) {
220
- err = e;
221
- }
222
- if (err instanceof Error) return err;
223
- }
224
- };
1
+ import { Request } from "./request.js";
2
+ import { TestAgent, proxyAgent } from "./agent.js";
225
3
  /**
226
- * Wraps an assert function into another.
227
- * The wrapper function edit the stack trace of any assertion error, prepending a more useful stack to it.
228
- *
229
- * @param {Function} assertFn
230
- * @return {Function} wrapped assert function
231
- */
232
- function wrapAssertFn(assertFn) {
233
- const savedStack = (/* @__PURE__ */ new Error()).stack.split("\n").slice(3);
234
- return (res) => {
235
- let badStack;
236
- let err;
237
- try {
238
- err = assertFn(res);
239
- } catch (e) {
240
- err = e;
241
- }
242
- if (err instanceof Error && err.stack) {
243
- badStack = err.stack.replace(err.message, "").split("\n").slice(1);
244
- err.stack = [err.toString()].concat(savedStack).concat("----").concat(badStack).join("\n");
245
- }
246
- return err;
247
- };
4
+ * Test against the given `app`,
5
+ * returning a new `Test`.
6
+ */
7
+ export function request(app, options = {}) {
8
+ return new Request(app, options);
248
9
  }
249
-
250
- //#endregion
251
- //#region src/request.ts
252
- var Request = class {
253
- app;
254
- #http2 = false;
255
- constructor(appOrListener, options = {}) {
256
- if (typeof appOrListener === "function") if (options.http2) {
257
- this.#http2 = true;
258
- this.app = http2.createServer(appOrListener);
259
- } else this.app = http.createServer(appOrListener);
260
- else this.app = appOrListener;
261
- }
262
- _testRequest(method, url) {
263
- const req = new Test(this.app, method.toUpperCase(), url);
264
- if (this.#http2) req.http2();
265
- return req;
266
- }
267
- delete(url) {
268
- return this._testRequest("delete", url);
269
- }
270
- del(url) {
271
- return this._testRequest("delete", url);
272
- }
273
- get(url) {
274
- return this._testRequest("get", url);
275
- }
276
- head(url) {
277
- return this._testRequest("head", url);
278
- }
279
- put(url) {
280
- return this._testRequest("put", url);
281
- }
282
- post(url) {
283
- return this._testRequest("post", url);
284
- }
285
- patch(url) {
286
- return this._testRequest("patch", url);
287
- }
288
- options(url) {
289
- return this._testRequest("options", url);
290
- }
291
- trace(url) {
292
- return this._testRequest("trace", url);
293
- }
294
- };
295
-
296
- //#endregion
297
- //#region src/agent.ts
298
- /**
299
- * Initialize a new `TestAgent`.
300
- *
301
- * @param {Function|Server} app
302
- * @param {Object} options
303
- */
304
- var TestAgent = class extends agent {
305
- app;
306
- _host;
307
- #http2 = false;
308
- constructor(appOrListener, options = {}) {
309
- super(options);
310
- if (typeof appOrListener === "function") if (options.http2) {
311
- this.#http2 = true;
312
- this.app = http2.createServer(appOrListener);
313
- } else this.app = http.createServer(appOrListener);
314
- else this.app = appOrListener;
315
- }
316
- host(host) {
317
- this._host = host;
318
- return this;
319
- }
320
- _testRequest(method, url) {
321
- const req = new Test(this.app, method.toUpperCase(), url);
322
- if (this.#http2) req.http2();
323
- if (this._host) req.set("host", this._host);
324
- const that = this;
325
- req.on("response", that._saveCookies.bind(this));
326
- req.on("redirect", that._saveCookies.bind(this));
327
- req.on("redirect", that._attachCookies.bind(this, req));
328
- that._setDefaults(req);
329
- that._attachCookies(req);
330
- return req;
331
- }
332
- delete(url) {
333
- return this._testRequest("delete", url);
334
- }
335
- del(url) {
336
- return this._testRequest("delete", url);
337
- }
338
- get(url) {
339
- return this._testRequest("get", url);
340
- }
341
- head(url) {
342
- return this._testRequest("head", url);
343
- }
344
- put(url) {
345
- return this._testRequest("put", url);
346
- }
347
- post(url) {
348
- return this._testRequest("post", url);
349
- }
350
- patch(url) {
351
- return this._testRequest("patch", url);
352
- }
353
- options(url) {
354
- return this._testRequest("options", url);
355
- }
356
- trace(url) {
357
- return this._testRequest("trace", url);
358
- }
359
- };
360
- const proxyAgent = new Proxy(TestAgent, { apply(target, _, argumentsList) {
361
- return new target(argumentsList[0], argumentsList[1]);
362
- } });
363
-
364
- //#endregion
365
- //#region src/index.ts
366
- /**
367
- * Test against the given `app`,
368
- * returning a new `Test`.
369
- */
370
- function request(app, options = {}) {
371
- return new Request(app, options);
372
- }
373
- var src_default = new Proxy(request, {
374
- apply(target, _, argumentsList) {
375
- return target(argumentsList[0], argumentsList[1]);
376
- },
377
- get(target, property, receiver) {
378
- if (property === "agent") return proxyAgent;
379
- return Reflect.get(target, property, receiver);
380
- }
10
+ export { Request, TestAgent,
11
+ // import { agent } from '@eggjs/supertest';
12
+ // agent()
13
+ proxyAgent as agent, };
14
+ export * from "./test.js";
15
+ // import request from '@eggjs/supertest';
16
+ // request()
17
+ export default new Proxy(request, {
18
+ apply(target, _, argumentsList) {
19
+ return target(argumentsList[0], argumentsList[1]);
20
+ },
21
+ get(target, property, receiver) {
22
+ // import request from '@eggjs/supertest';
23
+ // request.agent()
24
+ if (property === 'agent') {
25
+ return proxyAgent;
26
+ }
27
+ return Reflect.get(target, property, receiver);
28
+ },
381
29
  });
382
-
383
- //#endregion
384
- export { Request, Test, TestAgent, proxyAgent as agent, src_default as default, request };
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBdUIsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHbkQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxHQUFRLEVBQUUsVUFBMEIsRUFBRTtJQUM1RCxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsT0FBTyxFQUNMLE9BQU8sRUFFUCxTQUFTO0FBQ1QsNENBQTRDO0FBQzVDLFVBQVU7QUFDVixVQUFVLElBQUksS0FBSyxHQUNwQixDQUFDO0FBRUYsY0FBYyxXQUFXLENBQUM7QUFFMUIsMENBQTBDO0FBQzFDLFlBQVk7QUFDWixlQUFlLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtJQUNoQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxhQUFhO1FBQzVCLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUTtRQUM1QiwwQ0FBMEM7UUFDMUMsa0JBQWtCO1FBQ2xCLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YsQ0FFQSxDQUFDIn0=
@@ -0,0 +1,21 @@
1
+ import type { Server } from 'node:net';
2
+ import type { App } from './types.ts';
3
+ import { Test } from './test.ts';
4
+ export interface RequestOptions {
5
+ http2?: boolean;
6
+ }
7
+ export declare class Request {
8
+ #private;
9
+ app: string | Server;
10
+ constructor(appOrListener: App, options?: RequestOptions);
11
+ protected _testRequest(method: string, url: string): Test;
12
+ delete(url: string): Test;
13
+ del(url: string): Test;
14
+ get(url: string): Test;
15
+ head(url: string): Test;
16
+ put(url: string): Test;
17
+ post(url: string): Test;
18
+ patch(url: string): Test;
19
+ options(url: string): Test;
20
+ trace(url: string): Test;
21
+ }
@@ -0,0 +1,56 @@
1
+ import http from 'node:http';
2
+ import http2 from 'node:http2';
3
+ import { Test } from "./test.js";
4
+ export class Request {
5
+ app;
6
+ #http2 = false;
7
+ constructor(appOrListener, options = {}) {
8
+ if (typeof appOrListener === 'function') {
9
+ if (options.http2) {
10
+ this.#http2 = true;
11
+ this.app = http2.createServer(appOrListener); // eslint-disable-line no-param-reassign
12
+ }
13
+ else {
14
+ this.app = http.createServer(appOrListener); // eslint-disable-line no-param-reassign
15
+ }
16
+ }
17
+ else {
18
+ this.app = appOrListener;
19
+ }
20
+ }
21
+ _testRequest(method, url) {
22
+ const req = new Test(this.app, method.toUpperCase(), url);
23
+ if (this.#http2) {
24
+ req.http2();
25
+ }
26
+ return req;
27
+ }
28
+ delete(url) {
29
+ return this._testRequest('delete', url);
30
+ }
31
+ del(url) {
32
+ return this._testRequest('delete', url);
33
+ }
34
+ get(url) {
35
+ return this._testRequest('get', url);
36
+ }
37
+ head(url) {
38
+ return this._testRequest('head', url);
39
+ }
40
+ put(url) {
41
+ return this._testRequest('put', url);
42
+ }
43
+ post(url) {
44
+ return this._testRequest('post', url);
45
+ }
46
+ patch(url) {
47
+ return this._testRequest('patch', url);
48
+ }
49
+ options(url) {
50
+ return this._testRequest('options', url);
51
+ }
52
+ trace(url) {
53
+ return this._testRequest('trace', url);
54
+ }
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFJL0IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU1qQyxNQUFNLE9BQU8sT0FBTztJQUNsQixHQUFHLENBQWtCO0lBQ3JCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixZQUFZLGFBQWtCLEVBQUUsVUFBMEIsRUFBRTtRQUMxRCxJQUFJLE9BQU8sYUFBYSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3hDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWtDLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztZQUM3RyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWtDLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztZQUM1RyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVTLFlBQVksQ0FBQyxNQUFjLEVBQUUsR0FBVztRQUNoRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsR0FBRyxDQUFDLEdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxHQUFHLENBQUMsR0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELElBQUksQ0FBQyxHQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsR0FBRyxDQUFDLEdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFJLENBQUMsR0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELEtBQUssQ0FBQyxHQUFXO1FBQ2YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQVc7UUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsS0FBSyxDQUFDLEdBQVc7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRiJ9
package/dist/test.d.ts ADDED
@@ -0,0 +1,96 @@
1
+ import type { Server } from 'node:net';
2
+ import { Request, type Response } from 'superagent';
3
+ import { AssertError } from './error/AssertError.ts';
4
+ export type TestApplication = Server | string;
5
+ export type AssertFunction = (res: Response) => AssertError | void;
6
+ export type CallbackFunction = (err: AssertError | Error | null, res: Response) => void;
7
+ export type ResponseError = Error & {
8
+ syscall?: string;
9
+ code?: string;
10
+ status?: number;
11
+ };
12
+ export interface ExpectHeader {
13
+ name: string;
14
+ value: string | number | RegExp;
15
+ }
16
+ export declare class Test extends Request {
17
+ app: TestApplication;
18
+ _server: Server;
19
+ _asserts: AssertFunction[];
20
+ /**
21
+ * Initialize a new `Test` with the given `app`,
22
+ * request `method` and `path`.
23
+ */
24
+ constructor(app: TestApplication, method: string, path: string);
25
+ /**
26
+ * Returns a URL, extracted from a server.
27
+ *
28
+ * @return {String} URL address
29
+ * @private
30
+ */
31
+ protected serverAddress(app: Server, path: string): string;
32
+ /**
33
+ * Expectations:
34
+ *
35
+ * ```js
36
+ * .expect(200)
37
+ * .expect(200, fn)
38
+ * .expect(200, body)
39
+ * .expect('Some body')
40
+ * .expect('Some body', fn)
41
+ * .expect(['json array body', { key: 'val' }])
42
+ * .expect('Content-Type', 'application/json')
43
+ * .expect('Content-Type', 'application/json', fn)
44
+ * .expect(fn)
45
+ * .expect([200, 404])
46
+ * ```
47
+ *
48
+ * @return {Test} The current Test instance for chaining.
49
+ */
50
+ expect(a: number | string | RegExp | object | AssertFunction, b?: string | number | RegExp | CallbackFunction, c?: CallbackFunction): Test;
51
+ /**
52
+ * UnExpectations:
53
+ *
54
+ * .unexpectHeader('Content-Type')
55
+ * .unexpectHeader('Content-Type', fn)
56
+ */
57
+ unexpectHeader(name: string, fn?: CallbackFunction): this;
58
+ /**
59
+ * Expectations:
60
+ *
61
+ * .expectHeader('Content-Type')
62
+ * .expectHeader('Content-Type', fn)
63
+ */
64
+ expectHeader(name: string, fn?: CallbackFunction): this;
65
+ _unexpectHeader(name: string, res: Response): AssertError | undefined;
66
+ _expectHeader(name: string, res: Response): AssertError | undefined;
67
+ /**
68
+ * Defer invoking superagent's `.end()` until
69
+ * the server is listening.
70
+ */
71
+ end(fn: CallbackFunction): this;
72
+ /**
73
+ * Perform assertions and invoke `fn(err, res)`.
74
+ */
75
+ assert(resError: ResponseError | null, res: Response, fn: CallbackFunction): void;
76
+ /**
77
+ * Perform assertions on a response body and return an Error upon failure.
78
+ */
79
+ _assertBody(body: RegExp | string | number | object | null | undefined, res: Response): AssertError | undefined;
80
+ /**
81
+ * Perform assertions on a response header and return an Error upon failure.
82
+ */
83
+ _assertHeader(header: ExpectHeader, res: Response): AssertError | undefined;
84
+ /**
85
+ * Perform assertions on the response status and return an Error upon failure.
86
+ */
87
+ _assertStatus(status: number, res: Response): AssertError | undefined;
88
+ /**
89
+ * Perform assertions on the response status and return an Error upon failure.
90
+ */
91
+ _assertStatusArray(statusArray: number[], res: Response): AssertError | undefined;
92
+ /**
93
+ * Performs an assertion by calling a function and return an Error upon failure.
94
+ */
95
+ _assertFunction(fn: AssertFunction, res: Response): Error | undefined;
96
+ }
package/dist/test.js ADDED
@@ -0,0 +1,315 @@
1
+ import { inspect } from 'node:util';
2
+ import { STATUS_CODES } from 'node:http';
3
+ import { Server as HttpsServer } from 'node:tls';
4
+ import { deepStrictEqual } from 'node:assert';
5
+ import { Request } from 'superagent';
6
+ import { AssertError } from "./error/AssertError.js";
7
+ export class Test extends Request {
8
+ app;
9
+ _server;
10
+ _asserts = [];
11
+ /**
12
+ * Initialize a new `Test` with the given `app`,
13
+ * request `method` and `path`.
14
+ */
15
+ constructor(app, method, path) {
16
+ super(method.toUpperCase(), path);
17
+ this.redirects(0);
18
+ this.buffer();
19
+ this.app = app;
20
+ this.url = typeof app === 'string' ? app + path : this.serverAddress(app, path);
21
+ }
22
+ /**
23
+ * Returns a URL, extracted from a server.
24
+ *
25
+ * @return {String} URL address
26
+ * @private
27
+ */
28
+ serverAddress(app, path) {
29
+ const addr = app.address();
30
+ if (!addr) {
31
+ this._server = app.listen(0);
32
+ }
33
+ const port = app.address().port;
34
+ const protocol = app instanceof HttpsServer || this._server instanceof HttpsServer ? 'https' : 'http';
35
+ return `${protocol}://127.0.0.1:${port}${path}`;
36
+ }
37
+ /**
38
+ * Expectations:
39
+ *
40
+ * ```js
41
+ * .expect(200)
42
+ * .expect(200, fn)
43
+ * .expect(200, body)
44
+ * .expect('Some body')
45
+ * .expect('Some body', fn)
46
+ * .expect(['json array body', { key: 'val' }])
47
+ * .expect('Content-Type', 'application/json')
48
+ * .expect('Content-Type', 'application/json', fn)
49
+ * .expect(fn)
50
+ * .expect([200, 404])
51
+ * ```
52
+ *
53
+ * @return {Test} The current Test instance for chaining.
54
+ */
55
+ expect(a, b, c) {
56
+ // callback
57
+ if (typeof a === 'function') {
58
+ // .expect(fn)
59
+ this._asserts.push(wrapAssertFn(a));
60
+ return this;
61
+ }
62
+ if (typeof b === 'function') {
63
+ // .expect('Some body', fn)
64
+ this.end(b);
65
+ }
66
+ if (typeof c === 'function') {
67
+ // .expect('Content-Type', 'application/json', fn)
68
+ this.end(c);
69
+ }
70
+ // status
71
+ if (typeof a === 'number') {
72
+ this._asserts.push(wrapAssertFn(this._assertStatus.bind(this, a)));
73
+ // body
74
+ if (typeof b !== 'function' && arguments.length > 1) {
75
+ // .expect(200, 'body')
76
+ // .expect(200, null)
77
+ // .expect(200, 9999999)
78
+ this._asserts.push(wrapAssertFn(this._assertBody.bind(this, b)));
79
+ }
80
+ return this;
81
+ }
82
+ // multiple statuses
83
+ if (Array.isArray(a) && a.length > 0 && a.every(val => typeof val === 'number')) {
84
+ // .expect([200, 300])
85
+ this._asserts.push(wrapAssertFn(this._assertStatusArray.bind(this, a)));
86
+ return this;
87
+ }
88
+ // header field
89
+ if (typeof b === 'string' || typeof b === 'number' || b instanceof RegExp) {
90
+ // .expect('Content-Type', 'application/json')
91
+ // .expect('Content-Type', /json/)
92
+ this._asserts.push(wrapAssertFn(this._assertHeader.bind(this, { name: String(a), value: b })));
93
+ return this;
94
+ }
95
+ // body
96
+ // .expect('body')
97
+ // .expect(['json array body', { key: 'val' }])
98
+ // .expect(/foo/)
99
+ this._asserts.push(wrapAssertFn(this._assertBody.bind(this, a)));
100
+ return this;
101
+ }
102
+ /**
103
+ * UnExpectations:
104
+ *
105
+ * .unexpectHeader('Content-Type')
106
+ * .unexpectHeader('Content-Type', fn)
107
+ */
108
+ unexpectHeader(name, fn) {
109
+ if (typeof fn === 'function') {
110
+ this.end(fn);
111
+ }
112
+ // header
113
+ if (typeof name === 'string') {
114
+ this._asserts.push(this._unexpectHeader.bind(this, name));
115
+ }
116
+ return this;
117
+ }
118
+ /**
119
+ * Expectations:
120
+ *
121
+ * .expectHeader('Content-Type')
122
+ * .expectHeader('Content-Type', fn)
123
+ */
124
+ expectHeader(name, fn) {
125
+ if (typeof fn === 'function') {
126
+ this.end(fn);
127
+ }
128
+ // header
129
+ if (typeof name === 'string') {
130
+ this._asserts.push(this._expectHeader.bind(this, name));
131
+ }
132
+ return this;
133
+ }
134
+ _unexpectHeader(name, res) {
135
+ const actual = res.headers[name.toLowerCase()];
136
+ if (actual) {
137
+ return new AssertError('unexpected "' + name + '" header field, got "' + actual + '"', name, actual);
138
+ }
139
+ }
140
+ _expectHeader(name, res) {
141
+ const actual = res.headers[name.toLowerCase()];
142
+ if (!actual) {
143
+ return new AssertError('expected "' + name + '" header field', name, actual);
144
+ }
145
+ }
146
+ /**
147
+ * Defer invoking superagent's `.end()` until
148
+ * the server is listening.
149
+ */
150
+ end(fn) {
151
+ const server = this._server;
152
+ super.end((err, res) => {
153
+ const localAssert = () => {
154
+ this.assert(err, res, fn);
155
+ };
156
+ if (server && '_handle' in server && server._handle) {
157
+ return server.close(localAssert);
158
+ }
159
+ localAssert();
160
+ });
161
+ return this;
162
+ }
163
+ /**
164
+ * Perform assertions and invoke `fn(err, res)`.
165
+ */
166
+ assert(resError, res, fn) {
167
+ let errorObj;
168
+ // check for unexpected network errors or server not running/reachable errors
169
+ // when there is no response and superagent sends back a System Error
170
+ // do not check further for other asserts, if any, in such case
171
+ // https://nodejs.org/api/errors.html#errors_common_system_errors
172
+ const sysErrors = {
173
+ ECONNREFUSED: 'Connection refused',
174
+ ECONNRESET: 'Connection reset by peer',
175
+ EPIPE: 'Broken pipe',
176
+ ETIMEDOUT: 'Operation timed out',
177
+ };
178
+ if (!res && resError) {
179
+ if (resError instanceof Error && resError.syscall === 'connect' && resError.code && sysErrors[resError.code]) {
180
+ errorObj = new Error(resError.code + ': ' + sysErrors[resError.code]);
181
+ }
182
+ else {
183
+ errorObj = resError;
184
+ }
185
+ }
186
+ // asserts
187
+ for (let i = 0; i < this._asserts.length && !errorObj; i += 1) {
188
+ errorObj = this._assertFunction(this._asserts[i], res);
189
+ }
190
+ // set unexpected superagent error if no other error has occurred.
191
+ if (!errorObj && resError instanceof Error && (!res || resError.status !== res.status)) {
192
+ errorObj = resError;
193
+ }
194
+ if (!fn) {
195
+ console.warn('[@eggjs/supertest] no callback function provided, fn: %s', typeof fn);
196
+ return;
197
+ }
198
+ fn.call(this, errorObj || null, res);
199
+ }
200
+ /**
201
+ * Perform assertions on a response body and return an Error upon failure.
202
+ */
203
+ _assertBody(body, res) {
204
+ const isRegexp = body instanceof RegExp;
205
+ // parsed
206
+ if (typeof body === 'object' && !isRegexp) {
207
+ try {
208
+ deepStrictEqual(body, res.body);
209
+ }
210
+ catch (err) {
211
+ const a = inspect(body);
212
+ const b = inspect(res.body);
213
+ return new AssertError('expected ' + a + ' response body, got ' + b, body, res.body, { cause: err });
214
+ }
215
+ }
216
+ else if (body !== res.text) {
217
+ // string
218
+ const a = inspect(body);
219
+ const b = inspect(res.text);
220
+ // regexp
221
+ if (isRegexp) {
222
+ if (!body.test(res.text)) {
223
+ return new AssertError('expected body ' + b + ' to match ' + body, body, res.body);
224
+ }
225
+ }
226
+ else {
227
+ return new AssertError('expected ' + a + ' response body, got ' + b, body, res.body);
228
+ }
229
+ }
230
+ }
231
+ /**
232
+ * Perform assertions on a response header and return an Error upon failure.
233
+ */
234
+ _assertHeader(header, res) {
235
+ const field = header.name;
236
+ const actual = res.header[field.toLowerCase()];
237
+ const fieldExpected = header.value;
238
+ if (typeof actual === 'undefined') {
239
+ return new AssertError('expected "' + field + '" header field', header, actual);
240
+ }
241
+ // This check handles header values that may be a String or single element Array
242
+ if ((Array.isArray(actual) && actual.toString() === fieldExpected) || fieldExpected === actual) {
243
+ return;
244
+ }
245
+ if (fieldExpected instanceof RegExp) {
246
+ if (!fieldExpected.test(actual)) {
247
+ return new AssertError('expected "' + field + '" matching ' + fieldExpected + ', got "' + actual + '"', header, actual);
248
+ }
249
+ }
250
+ else {
251
+ return new AssertError('expected "' + field + '" of "' + fieldExpected + '", got "' + actual + '"', header, actual);
252
+ }
253
+ }
254
+ /**
255
+ * Perform assertions on the response status and return an Error upon failure.
256
+ */
257
+ _assertStatus(status, res) {
258
+ if (res.status !== status) {
259
+ const a = STATUS_CODES[status];
260
+ const b = STATUS_CODES[res.status];
261
+ return new AssertError('expected ' + status + ' "' + a + '", got ' + res.status + ' "' + b + '"', status, res.status);
262
+ }
263
+ }
264
+ /**
265
+ * Perform assertions on the response status and return an Error upon failure.
266
+ */
267
+ _assertStatusArray(statusArray, res) {
268
+ if (!statusArray.includes(res.status)) {
269
+ const b = STATUS_CODES[res.status];
270
+ const expectedList = statusArray.join(', ');
271
+ return new AssertError('expected one of "' + expectedList + '", got ' + res.status + ' "' + b + '"', statusArray, res.status);
272
+ }
273
+ }
274
+ /**
275
+ * Performs an assertion by calling a function and return an Error upon failure.
276
+ */
277
+ _assertFunction(fn, res) {
278
+ let err;
279
+ try {
280
+ err = fn(res);
281
+ }
282
+ catch (e) {
283
+ err = e;
284
+ }
285
+ if (err instanceof Error) {
286
+ return err;
287
+ }
288
+ }
289
+ }
290
+ /**
291
+ * Wraps an assert function into another.
292
+ * The wrapper function edit the stack trace of any assertion error, prepending a more useful stack to it.
293
+ *
294
+ * @param {Function} assertFn
295
+ * @return {Function} wrapped assert function
296
+ */
297
+ function wrapAssertFn(assertFn) {
298
+ const savedStack = new Error().stack.split('\n').slice(3);
299
+ return (res) => {
300
+ let badStack;
301
+ let err;
302
+ try {
303
+ err = assertFn(res);
304
+ }
305
+ catch (e) {
306
+ err = e;
307
+ }
308
+ if (err instanceof Error && err.stack) {
309
+ badStack = err.stack.replace(err.message, '').split('\n').slice(1);
310
+ err.stack = [err.toString()].concat(savedStack).concat('----').concat(badStack).join('\n');
311
+ }
312
+ return err;
313
+ };
314
+ }
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxJQUFJLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxPQUFPLEVBQWlCLE1BQU0sWUFBWSxDQUFDO0FBRXBELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWdCckQsTUFBTSxPQUFPLElBQUssU0FBUSxPQUFPO0lBQy9CLEdBQUcsQ0FBa0I7SUFDckIsT0FBTyxDQUFTO0lBQ2hCLFFBQVEsR0FBcUIsRUFBRSxDQUFDO0lBRWhDOzs7T0FHRztJQUNILFlBQVksR0FBb0IsRUFBRSxNQUFjLEVBQUUsSUFBWTtRQUM1RCxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sYUFBYSxDQUFDLEdBQVcsRUFBRSxJQUFZO1FBQy9DLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMz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
@@ -0,0 +1,10 @@
1
+ import type { RequestListener } from 'node:http';
2
+ import type { Http2ServerRequest, Http2ServerResponse } from 'node:http2';
3
+ import type { Server } from 'node:net';
4
+ import type { AgentOptions as SAgentOptions } from 'superagent';
5
+ export type H2RequestListener = (request: Http2ServerRequest, response: Http2ServerResponse) => void;
6
+ export type H1RequestListener = RequestListener;
7
+ export type App = Server | H1RequestListener | H2RequestListener | string;
8
+ export interface AgentOptions extends SAgentOptions {
9
+ http2?: boolean;
10
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@eggjs/supertest",
3
3
  "description": "SuperAgent driven library for testing HTTP servers",
4
- "version": "9.0.0-beta.20",
4
+ "version": "9.0.0-beta.22",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -51,7 +51,7 @@
51
51
  "typescript": "^5.9.3"
52
52
  },
53
53
  "scripts": {
54
- "build": "tsdown",
54
+ "build": "tsdown && rimraf dist && tsc -b --clean && tsc",
55
55
  "test": "vitest run",
56
56
  "typecheck": "tsc --noEmit",
57
57
  "lint": "oxlint --type-aware"