# swagmock
Mock data generator for swagger api

This package is the same as https://github.com/subeeshcbabu/swagmock with this PR applied: https://github.com/subeeshcbabu/swagmock/pull/49

*Note: Swagmock version `1.0.0` onwards requires `Node.js v6+` (`"engines": {"node": ">=6.x"}`). Please use `v0.0.x` (say `0.0.5`), if you want to run this module on any previous node.js versions.*

## Install

```
npm install swagmock
```

## Usage

```javascript
    let Swagmock = require('swagmock');
    let Mockgen = Swagmock(api, options);
    // api Can be one of the following.
    // 1) A relative or absolute path to the Swagger api document.
    // 2) A swagger api Object.
    // 3) A promise (or a `thenable`) that resolves to the swagger api Object.
    // Set the `validated` : `true`  in `options`, if the api Object is already validated
    // and dereferenced ($ref are resolved ).
```

Promise response:

```javascript
    let responseMock = Mockgen.responses({}); //returns a promise that resolves to response mock
    responseMock.then(mock => {
        //Use mock here
    }).catch(error => {
        Assert.ifError(error);
    });
```

Callback style:

```javascript

    Mockgen.responses({ path: '/somepath'}, (error, mock) => {
        Assert.ifError(error);
        //Use mock here
    });
```

Check the [API](README.md#api) for more details.

## Example

Initialize the mock generator

```javascript
    const apiPath = 'http://petstore.swagger.io/v2/swagger.json';
    let Assert = require('assert');
    let Swagmock = require('swagmock');
    let Mockgen = Swagmock(apiPath);
```

Response mock generation:

```javascript
    mockgen.responses({
        path: '/pet/findByStatus',
        operation: 'get',
        response: 200
    }).then(mock => {
        console.log(mock); // This would print:
        // {
        //     "responses": [{
        //         "id": 2530624032210944,
        //         "category": {
        //             "id": 8200505595527168,
        //             "name": "r($vA&"
        //         },
        //         "name": "doggie",
        //         "photoUrls": ["p0x1", "6O)3*kO"],
        //         "tags": [{
        //             "id": 4590764340281344,
        //             "name": "WCTA6f!"
        //         }, {
        //             "id": -4614156653166592,
        //             "name": "e"
        //         }],
        //         "status": "pending"
        //     }]
        // }
    }).catch(error => {
        Assert.ifError(error);
    });
```

Parameters mock generation:

```javascript

    mockgen.parameters({
        path: '/pet/findByStatus',
        operation: 'get'
    }).then(mock => {
        console.log(mock);//This would print:
        // {
        //     "parameters": {
        //         "query": [{
        //             "name": "status",
        //             "value": [ 'available', 'pending' ],
        //             "separator": "multi"
        //         }]
        //     }
        // }
    }).catch(error => {
        Assert.ifError(error);
    })

```

Check [Examples](docs/EXAMPLES.md) for more details on mock generators.

## API

`Swagmock(api, [options])`

* `api` - (*Object*) or (*String*) or (*Promise*) - (required) - api can be one of the following.
    - A relative or absolute path to the Swagger api document.
    - A URL of the Swagger api document.
    - The swagger api Object
    - A promise (or a `thenable`) that resolves to the swagger api Object

* `options` - (*Object*) - (optional) - Additional options to create the mock generator.
    - `validated` -  Set this property to `true` if the api is already validated against swagger schema and already dereferenced all the `$ref`. This is really useful to generate mocks for parsed api specs. Default value for this is `false` and the api will be validated using [swagger-parser validate](https://github.com/BigstickCarpet/swagger-parser/blob/master/docs/swagger-parser.md#validateapi-options-callback).

## responses

`mockgen.responses(options, [callback])`

This generates the mock response objects based on the `options`

* `options` - (*Object*) - (required) - Options to control the mock generation.

* `callback` -  (*Function*) - (optional) - `function (error, mock)`. If a callback is not provided a `Promise` will be returned.

### options

* `path` - (*String*) - (optional) - The path for which the response mock need to be generated. For example `/pet/findByStatus`, `/pet` etc. If a `path` is not specified, mock response will be generated for all the paths defined by the swagger api.

* `operation` - (*String*) - (optional) - The operation for which the response mock need to be generated. For example `get`, `post` etc. If `operation` is not specified, mock response will be generated for all the operations defined by the swagger api.

* `response` - (*String*) - (optional) - The response for which the response mock need to be generated. For example `200`, `400`, `default` etc. If `response` is not specified, mock response will be generated for all the responses defined by the swagger api.

* `useExamples` - (*Boolean*)- (optional) - Should the generated mock make use of example values defined in your swagger.json. Note: invalid example values will create invalid mockdata!

## parameters

`mockgen.parameters(options, [callback])`

This generates the mock parameters objects based on the `options`

* `options` - (*Object*) - (required) - Options to control the mock generation.

* `callback` -  (*Function*) - (optional) - `function (error, mock)`. If a callback is not provided a `Promise` will be returned.

### options

* `path` - (*String*) - (optional) - The path for which the parameters mock need to be generated. For example `/pet/findByStatus`, `/pet` etc. If a `path` is not specified, mock parameters will be generated for all the paths defined by the swagger api.

* `operation` - (*String*) - (optional) - The operation for which the parameters mock need to be generated. For example `get`, `post` etc. If `operation` is not specified, mock parameters will be generated for all the operations defined by the swagger api.


## requests

`mockgen.requests(options, [callback])`

This generates the mock request object based on the `options`. `requests` API resolves the `parameters` mock data to generate the `request` mock object useful for unit tests.

* `options` - (*Object*) - (required) - Options to control the mock generation.

* `callback` -  (*Function*) - (optional) - `function (error, mock)`. If a callback is not provided a `Promise` will be returned.

### options

* `path` - (*String*) - (optional) - The path for which the parameters mock need to be generated. For example `/pet/findByStatus`, `/pet` etc. If a `path` is not specified, mock parameters will be generated for all the paths defined by the swagger api.

* `operation` - (*String*) - (optional) - The operation for which the parameters mock need to be generated. For example `get`, `post` etc. If `operation` is not specified, mock parameters will be generated for all the operations defined by the swagger api.

### data

`request` Object will have following possible properties `query`, `header`, `pathname`, `path`, `formData` or `body` based on the `parameters` defined for the path and operation.

Mock request [Path templates](http://swagger.io/specification/#pathTemplating) are resolved using path parameters.

```javascript
    mockgen.requests({
        path: '/pet/findByStatus',
        operation: 'get'
    }, function (error, mock) {
        assert.ifError(error);

        console.log(mock);
        //This would print:
        // {
        //     "request": {
        //         "query": "status=available&status=pending"
        //     }
        // }
    });
```
## Examples

### API
[Usage](docs/EXAMPLES.md)

### Unit test request mocks

[github api express app](https://github.com/subeeshcbabu/swaggerize-examples/tree/master/express/github-express/tests)

[slack api hapi app](https://github.com/subeeshcbabu/swaggerize-examples/tree/master/hapi/slack/tests)

### Mock response data providers

[spotify api hapi app](https://github.com/subeeshcbabu/swaggerize-examples/tree/master/hapi/spotify/data)

[glugbot api express app](https://github.com/subeeshcbabu/swaggerize-examples/tree/master/express/glugbot-express/tests/api)
