diff --git a/docs/docs/api/MockClient.md b/docs/docs/api/MockClient.md index 52ee3e33bdf..0e6c57a1a84 100644 --- a/docs/docs/api/MockClient.md +++ b/docs/docs/api/MockClient.md @@ -38,6 +38,10 @@ const mockClient = mockAgent.get('http://localhost:3000') Implements: [`MockPool.intercept(options)`](/docs/docs/api/MockPool.md#mockpoolinterceptoptions) +### `MockClient.cleanMocks()` + +Implements: [`MockPool.cleanMocks()`](/docs/docs/api/MockPool.md#mockpoolcleanmocks) + ### `MockClient.close()` Implements: [`MockPool.close()`](/docs/docs/api/MockPool.md#mockpoolclose) diff --git a/docs/docs/api/MockPool.md b/docs/docs/api/MockPool.md index ff01b9a35ab..6656b95d834 100644 --- a/docs/docs/api/MockPool.md +++ b/docs/docs/api/MockPool.md @@ -546,3 +546,9 @@ for await (const data of body) { console.log('data', data.toString('utf8')) // data foo } ``` + +### `MockPool.cleanMocks()` + +This method cleans up all the prepared mocks. + +Returns: `void` diff --git a/lib/mock/mock-client.js b/lib/mock/mock-client.js index f8a786ced8b..b3be7ab3b91 100644 --- a/lib/mock/mock-client.js +++ b/lib/mock/mock-client.js @@ -54,6 +54,10 @@ class MockClient extends Client { ) } + cleanMocks () { + this[kDispatches] = [] + } + async [kClose] () { await promisify(this[kOriginalClose])() this[kConnected] = 0 diff --git a/lib/mock/mock-pool.js b/lib/mock/mock-pool.js index a266211ac70..2121e3c99a3 100644 --- a/lib/mock/mock-pool.js +++ b/lib/mock/mock-pool.js @@ -54,6 +54,10 @@ class MockPool extends Pool { ) } + cleanMocks () { + this[kDispatches] = [] + } + async [kClose] () { await promisify(this[kOriginalClose])() this[kConnected] = 0 diff --git a/test/mock-client.js b/test/mock-client.js index fd77f0047b8..313c628374c 100644 --- a/test/mock-client.js +++ b/test/mock-client.js @@ -440,3 +440,43 @@ test('MockClient - basic intercept with MockClient.request', async (t) => { foo: 'bar' }) }) + +test('MockClient - cleans mocks', async (t) => { + t = tspl(t, { plan: 4 }) + + const server = createServer({ joinDuplicateHeaders: true }, (req, res) => { + res.setHeader('content-type', 'text/plain') + res.end('hello') + }) + after(() => server.close()) + + await promisify(server.listen.bind(server))(0) + + const baseUrl = `http://localhost:${server.address().port}` + + const mockAgent = new MockAgent({ connections: 1 }) + after(() => mockAgent.close()) + + const mockClient = mockAgent.get(baseUrl) + t.ok(mockClient instanceof MockClient) + setGlobalDispatcher(mockClient) + + mockClient.intercept({ + path: '/foo', + method: 'GET' + }).reply(500, () => { + t.fail('should not be called') + }) + + mockClient.cleanMocks() + + t.strictEqual(mockClient[kDispatches].length, 0) + + const { statusCode, body } = await request(`${baseUrl}/foo`, { + method: 'GET' + }) + t.strictEqual(statusCode, 200) + + const response = await getResponse(body) + t.deepStrictEqual(response, 'hello') +}) diff --git a/test/mock-pool.js b/test/mock-pool.js index 4e079451741..0febb109fcf 100644 --- a/test/mock-pool.js +++ b/test/mock-pool.js @@ -361,3 +361,44 @@ test('MockPool - allows matching headers in fetch', async (t) => { } }), new TypeError('fetch failed')) }) + +test('MockPool - cleans mocks', async (t) => { + t = tspl(t, { plan: 4 }) + + const server = createServer({ joinDuplicateHeaders: true }, (req, res) => { + res.setHeader('content-type', 'text/plain') + res.end('hello') + }) + after(() => server.close()) + + await promisify(server.listen.bind(server))(0) + + const baseUrl = `http://localhost:${server.address().port}` + + const mockAgent = new MockAgent() + after(() => mockAgent.close()) + + const mockPool = mockAgent.get(baseUrl) + t.ok(mockPool instanceof MockPool) + setGlobalDispatcher(mockPool) + + mockPool.intercept({ + path: '/foo', + method: 'GET' + }).reply(500, () => { + t.fail('should not be called') + t.end() + }) + + mockPool.cleanMocks() + + t.strictEqual(mockPool[kDispatches].length, 0) + + const { statusCode, body } = await request(`${baseUrl}/foo`, { + method: 'GET' + }) + t.strictEqual(statusCode, 200) + + const response = await getResponse(body) + t.deepStrictEqual(response, 'hello') +}) diff --git a/test/types/mock-client.test-d.ts b/test/types/mock-client.test-d.ts index cc9fabfa423..29804b3494f 100644 --- a/test/types/mock-client.test-d.ts +++ b/test/types/mock-client.test-d.ts @@ -37,6 +37,9 @@ import { MockInterceptor } from '../../types/mock-interceptor' // close expectAssignable>(mockClient.close()) + + // cleanMocks + expectAssignable(mockClient.cleanMocks()) } expectAssignable(new MockClient('', { agent: new MockAgent({ connections: 1 }) })) diff --git a/test/types/mock-pool.test-d.ts b/test/types/mock-pool.test-d.ts index b2202f6486d..c7446475ed4 100644 --- a/test/types/mock-pool.test-d.ts +++ b/test/types/mock-pool.test-d.ts @@ -36,6 +36,9 @@ import { MockInterceptor } from '../../types/mock-interceptor' // close expectAssignable>(mockPool.close()) + + // cleanMocks + expectAssignable(mockPool.cleanMocks()) } expectAssignable(new MockPool('', { agent: new MockAgent({ connections: 1 }) })) diff --git a/types/mock-client.d.ts b/types/mock-client.d.ts index 88e16d9fb4f..702e8246494 100644 --- a/types/mock-client.d.ts +++ b/types/mock-client.d.ts @@ -14,6 +14,8 @@ declare class MockClient extends Client implements Interceptable { dispatch (options: Dispatcher.DispatchOptions, handlers: Dispatcher.DispatchHandler): boolean /** Closes the mock client and gracefully waits for enqueued requests to complete. */ close (): Promise + /** Clean up all the prepared mocks. */ + cleanMocks (): void } declare namespace MockClient { diff --git a/types/mock-interceptor.d.ts b/types/mock-interceptor.d.ts index 418db413e5d..83c0b3831ef 100644 --- a/types/mock-interceptor.d.ts +++ b/types/mock-interceptor.d.ts @@ -84,6 +84,8 @@ declare namespace MockInterceptor { interface Interceptable extends Dispatcher { /** Intercepts any matching requests that use the same origin as this mock client. */ intercept(options: MockInterceptor.Options): MockInterceptor; + /** Clean up all the prepared mocks. */ + cleanMocks (): void } export { diff --git a/types/mock-pool.d.ts b/types/mock-pool.d.ts index 5a9d9cb274f..f35f357bc13 100644 --- a/types/mock-pool.d.ts +++ b/types/mock-pool.d.ts @@ -14,6 +14,8 @@ declare class MockPool extends Pool implements Interceptable { dispatch (options: Dispatcher.DispatchOptions, handlers: Dispatcher.DispatchHandler): boolean /** Closes the mock pool and gracefully waits for enqueued requests to complete. */ close (): Promise + /** Clean up all the prepared mocks. */ + cleanMocks (): void } declare namespace MockPool {