Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
superagent-mock
Advanced tools
superagent plugin allowing to simulate HTTP calls by returning data fixtures based on the requested URL.
Installation | Usage | Supported Methods | Credits | License
superagent plugin allowing to simulate HTTP calls by returning data fixtures based on the requested URL.
See this post to know why we use superagent-mock at Bedrock Streaming.
Install with npm: npm install superagent-mock
Install with yarn: yarn add superagent-mock
node >= 8.0 superagent >= ^3.6.0
First, you have to define the URLs to mock in a configuration file:
// ./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:
// ./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();
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.
You can monitor each call, that has been intercepted by superagent-mock or not, by passing a callback function at initialization.
// ./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
superagent.send
functionsuperagent.set
functionTo run units tests: yarn test
.
To check code style: yarn lint
.
To build code: yarn build
.
Developped by the Cytron Team of Bedrock Streaming. Tested with Jest.
superagent-mock is licensed under the MIT license.
FAQs
superagent plugin allowing to simulate HTTP calls by returning data fixtures based on the requested URL.
The npm package superagent-mock receives a total of 9,033 weekly downloads. As such, superagent-mock popularity was classified as popular.
We found that superagent-mock demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 12 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.