An open API service indexing awesome lists of open source software.

https://github.com/bedrockstreaming/superagent-mock

superagent plugin allowing to simulate HTTP calls by returning data fixtures based on the requested URL
https://github.com/bedrockstreaming/superagent-mock

javascript

Last synced: 8 months ago
JSON representation

superagent plugin allowing to simulate HTTP calls by returning data fixtures based on the requested URL

Awesome Lists containing this project

README

          

![npm](https://img.shields.io/npm/v/superagent-mock)
![npm bundle size](https://img.shields.io/bundlephobia/minzip/superagent-mock)
![npm](https://img.shields.io/npm/dy/superagent-mock)
![GitHub last commit](https://img.shields.io/github/last-commit/M6web/superagent-mock)
![NPM](https://img.shields.io/npm/l/superagent-mock)
[![NPM Downloads](http://img.shields.io/npm/dm/superagent-mock.svg)](https://www.npmjs.org/package/superagent-mock)
[![Continous Integration](https://github.com/M6Web/superagent-mock/actions/workflows/node.js.yml/badge.svg)](https://github.com/M6Web/superagent-mock/actions/workflows/node.js.yml)


Installation
|
Usage
|
Supported Methods
|
Credits
|
License

# superagent-mock

[superagent](https://github.com/visionmedia/superagent) plugin allowing to simulate HTTP calls by returning data fixtures based on the requested URL.

See [this post](https://tech.bedrockstreaming.com//how-did-we-mock-the-backend-developers.html) to know why we use superagent-mock at Bedrock Streaming.

## Installation

Install with [npm](http://npmjs.org/): `npm install superagent-mock`

Install with [yarn](https://yarnpkg.com/): `yarn add superagent-mock`

## Requirements

node >= 8.0
superagent >= ^3.6.0

## Usage

First, you have to define the URLs to mock in a configuration file:

```js
// ./superagent-mock-config.js file
module.exports = [
{
/**
* regular expression of URL
*/
pattern: 'https://domain.example(.*)',

/**
* returns the data
*
* @param match array Result of the resolution of the regular expression
* @param params object sent by 'send' function
* @param headers object set by 'set' function
* @param context object the context of running the fixtures function
*/
fixtures: function (match, params, headers, context) {
/**
* Returning error codes example:
* request.get('https://domain.example/404').end(function(err, res){
* console.log(err); // 404
* console.log(res.notFound); // true
* })
*/
if (match[1] === '/404') {
throw new Error(404);
}

/**
* Checking on parameters example:
* request.get('https://domain.example/hero').send({superhero: "superman"}).end(function(err, res){
* console.log(res.body); // "Your hero: superman"
* })
*/

if (match[1] === '/hero') {
if(params['superhero']) {
return 'Your hero:' + params['superhero'];
} else {
return 'You didnt choose a hero';
}
}

/**
* Checking on headers example:
* request.get('https://domain.example/authorized_endpoint').set({Authorization: "9382hfih1834h"}).end(function(err, res){
* console.log(res.body); // "Authenticated!"
* })
*/

if (match[1] === '/authorized_endpoint') {
if(headers['Authorization']) {
return 'Authenticated!';
} else {
throw new Error(401); // Unauthorized
}
}

/**
* Cancelling the mocking for a specific matched route example:
* request.get('https://domain.example/server_test').end(function(err, res){
* console.log(res.body); // (whatever the actual server would have returned)
* })
*/

if (match[1] === '/server_test') {
context.cancel = true; // This will cancel the mock process and continue as usual (unmocked)
return null;
}

/**
* Delaying the response with a specific number of milliseconds:
* request.get('https://domain.example/delay_test').end(function(err, res){
* console.log(res.body); // This log will be written after the delay time has passed
* })
*/

if (match[1] === '/delay_test') {
context.delay = 3000; // This will delay the response by 3 seconds
return 'zzZ';
}

/**
* Mocking progress events:
* request.get('https://domain.example/progress_test')
* .on('progress', function (e) { console.log(e.percent + '%'); })
* .end(function(err, res){
* console.log(res.body); // This log will be written after all progress events emitted
* })
*/

if (match[1] === '/progress_test') {
context.progress = {
parts: 3, // The number of progress events to emit one after the other with linear progress
// (Meaning, loaded will be [total/parts])
delay: 1000, // [optional] The delay of emitting each of the progress events by ms
// (default is 0 unless context.delay specified, then it's [delay/parts])
total: 100, // [optional] The total as it will appear in the progress event (default is 100)
lengthComputable: true, // [optional] The same as it will appear in the progress event (default is true)
direction: 'upload' // [optional] superagent adds 'download'/'upload' direction to the event (default is 'upload')
};
return 'Hundred percent!';
}
},

/**
* returns the result of the GET request
*
* @param match array Result of the resolution of the regular expression
* @param data mixed Data returns by `fixtures` attribute
*/
get: function (match, data) {
return {
body: data
};
},

/**
* returns the result of the POST request
*
* @param match array Result of the resolution of the regular expression
* @param data mixed Data returns by `fixtures` attribute
*/
post: function (match, data) {
return {
       status: 201
};
}
},
...
];
```

Then use the plugin:

```js
// ./server.js file
var request = require('superagent');
var config = require('./superagent-mock-config');

// Before tests
var superagentMock = require('superagent-mock')(request, config);

...

// After tests
superagentMock.unset();
```

## Supported methods

All request methods are supported (get, put, post, etc.).

Each request method mock have to be declared in the config file. Otherwise, the `callback` method is used.

## Logging

You can monitor each call, that has been intercepted by superagent-mock or not, by passing a callback function at initialization.

``` js
// ./server.js file
var request = require('superagent');
var config = require('./superagent-mock-config');

var logger = function(log) {
console.log('superagent call', log);
};

// Before tests
var superagentMock = require('superagent-mock')(request, config, logger);

...

// After tests
superagentMock.unset();
```

The callback function will be called with an object containing the following informations
- data : data used with `superagent.send` function
- headers : array of headers given by `superagent.set` function
- matcher : regex matching the current url which is defined in the provided config
- url : url which superagent was called
- method : HTTP method used for the call
- timestamp : timestamp of the superagent call
- mocked : true if the call was mocked by superagent mock, false if it used superagent real methods

## Development scripts

To run units tests: `yarn test`.

To check code style: `yarn lint`.

To build code: `yarn build`.

## Credits

Developped by the Cytron Team of [Bedrock Streaming](https://tech.bedrockstreaming.com/).
Tested with [Jest](https://jestjs.io/).

## License

superagent-mock is licensed under the [MIT license](LICENSE).