- Allows creation of 'presets', which are saved configurations of active stubs
- Exposes API for usage with tests
- Watches stub directory for changes, and always shows the updated stub
- Uses proxy middleware to allow user to hit other servers while running their UI app locally
- Stub: a JSON file that gets served for a given endpoint instead of a real application server response
- Preset: a named collection of stubs
Navigate to /services
. Here you will be able to set the active stub for each route.
- The first dropdown selects your environment. (Jump to Environment Configuration) Note: Due to a limitation in the proxy middleware when switching from one proxied environment (anything other than "local") to another, restart stub-server after making the selection.
- The "Select a Preset" dropdown changes the active preset.
- The "Start Preset Recording" button starts recording all traffic that is passing through the proxy middleware. The "Finish Recording & Save Preset" button stops recording and saves the latest response for each proxied url & action as a preset. You must enter a preset name for the preset to be saved.
- The "Save Current Config as Preset" button will save a preset from the current active stubs. Active stubs can be selected from the corresponding dropdown for each url/action. You must enter a preset name for the preset to be saved.
By default, stub-server
expects your environment configurations to be in /server/local/environments
.
With environment configurations, you can configure proxy server middleware to map local paths to a remote paths. Here is an example setup.
/server/local/environments/local.json
[
{
"path": "/foo",
"target": "local"
}
]
/server/local/environments/unit.json
[
{
"path": "/foo",
"target": "https://my2.unit.foo.com"
}
]
/server/local/environments/some-developers-machine.json
[
{
"path": "/foo",
"target": "http://wp3werw232:8080"
}
]
By default, stub-server
expects your stubs to be in /server/local/stubs
.
By default, stub-server
expects your presets to be in /server/local/presets
.
You can create presets in two ways:
-
In the interface, set all of the stubs to their desired positions. At the top of the page, enter a name for the preset and click 'Save config as preset'. You should now see your preset in the presets dropdown
-
Create a new json file in the presets directory. As soon as the file is added, you should see it in the presets dropdown.
Within your stub file JSON, if you add this property to the base object, the stub server will return the response with the indicated status code. The @@HTTP_STATUS will be removed before it is sent.
{
"@@HTTP_STATUS": "500",
...
}
If you want to add some logic to dynamically select or modify the stub that gets returned, you can define a hooks file. To use hooks, first create a stub that will act as the default response (ie. /ws/ers/save/POST/default.json
). Then create the hooks file for this stub /ws/ers/save/POST/default.hooks.js
. Here is an example hooks file:
/**
* if userName is being POSTed, return default.json, else return error.json
* @param {obj} req - the HTTP request object
* @return {string} - the name of the stub to be served
*/
exports.chooseStub = function(req) {
return req.body.userName ? 'default' : 'error';
}
/**
* if user is Bert, add something special to the response for him
* @param {obj} stub - the javascript object for the stub
* @param {obj} req - the HTTP request object
* @return {obj} - the new javascript object to be served
*/
exports.processStub = function(stub, req) {
if (req.body.userName === 'Bert') {
stub.somethingSpecialForBert = 'foo';
}
return stub;
}
Hook files should be written using commonJS module syntax and ES5 to ensure compatibility.
Some urls can have segments that are highly dynamic such as a session ID or plan ID. To promote reuse of stubs and avoid bloat, such portions can be replaced within stub-server with a placeholder. Currently these placeholders are hardcoded for specific use-cases but they will be exposed in an upcoming release. Get in touch if you want to use this feature now.
DEV NOTE: This package is ES2015/ES2016, it must be compiled before release. npm run prepublish
.
In your project
$ npm install git+ssh://[email protected]:jpray/stub-server.git
stub-server
will automatically create the /server/local
directory in your project.
stub-server
returns a Promise
when invoked. This promise is resolved when the server has successfully started.
@param config.port
port number to run on.
@param config.paths
static paths to serve.
@param callback
optional, with signature of (error, server)
, where server
is an instance of the express server.
var server = require('stub-server');
server({port: 9000, paths: ['.']});
var server = require('stub-server');
// dev server
gulp.task('server', function () {
return server({port: 9000, paths: ['.']});
})
// dist server
gulp.task('server:dist', function () {
return server({port: 9000, paths: ['./dist']});
});
You shouldn't ever need to directly call any of the endpoints -- use the interface instead. But here is the documentation.
Shows the mock services index
Sets the default stub for a route
@param route
the route to configure
@param stub
the name of the stub to make default
Applies a preset. Selects all stubs defined in the preset.
@param name
the name of the preset to apply
Resets all active stubs to their original values.
Creates a preset with the current stub configuration. Saves it in /server/local/presets
@param name
the desired name for this stub