ike18t/wiremock_mapper_node

View on GitHub
README.md

Summary

Maintainability
Test Coverage
[![Build Status](https://travis-ci.org/ike18t/wiremock_mapper_node.png?branch=master)](https://travis-ci.org/ike18t/wiremock_mapper_node)
[![Code Climate](https://codeclimate.com/github/ike18t/wiremock_mapper_node/badges/gpa.svg)](https://codeclimate.com/github/ike18t/wiremock_mapper_node)
[![Test Coverage](https://codeclimate.com/github/ike18t/wiremock_mapper_node/badges/coverage.svg)](https://codeclimate.com/github/ike18t/wiremock_mapper_node/coverage)
[![npm version](https://badge.fury.io/js/wiremock-mapper.svg)](https://badge.fury.io/js/wiremock-mapper)

# wiremock-mapper
DSL for setting up WireMock mappings

# Installation
```bash
npm install wiremock-mapper
```

## Create a mapping

Import the library
```typescript
import { WireMockMapper } from 'wiremock-mapper';
```

Mappings are created with `WireMockMapper.createMapping()` which takes a function argument defining the mock behavior. It asyncronously sends the configuration to the WireMock server.
```typescript
await WireMockMapper.createMapping((req, res) => { });
```

### Define matching parameters

All request modifiers are set from `res` provided by `createMapping`, and return an instance of `RequestBuilder`, `MatchBuilder`, or `UrlMatchBuilder`. These can be chained together to form a complete request expectation.

It should read like a sentence when set up properly.
```typescript
await WireMockMapper.createMapping((req, res) => {
  req.isAGet().withUrlPath().matching('/my/.*/path');
});
```

#### Interfaces
`RequestBuilder`

| Method           | Argument(s)                          | Effect                                  | Returns           |
|------------------|--------------------------------------|-----------------------------------------|-------------------|
| `isAGet`         | none                                 | sets request method to `GET`            | `RequestBuilder`  |
| `isAPost`        | none                                 | sets request method to `POST`           | `RequestBuilder`  |
| `isAPut`         | none                                 | sets request method to `PUT`            | `RequestBuilder`  |
| `isADelete`      | none                                 | sets request method to `DELETE`         | `RequestBuilder`  |
| `isAHead`        | none                                 | sets request method to `HEAD`           | `RequestBuilder`  |
| `isAnOptions`    | none                                 | sets request method to `OPTIONS`        | `RequestBuilder`  |
| `isATrace`       | none                                 | sets request method to `TRACE`          | `RequestBuilder`  |
| `isAnyVerb`      | none                                 | sets request method to `ANY`            | `RequestBuilder`  |
| `withBody`       | none                                 | sets request body                       | `RequestBuilder`  |
| `withBasicAuth`  | `username: string, password: string` | sets basic auth                         | `RequestBuilder`  |
| `withUrl`        | `url: string`                        | sets expected URL                       | `UrlMatchBuilder` |
| `withUrlPath`    | `urlPath: string`                    | sets URL path match to `urlPathPattern` | `UrlMatchBuilder` |
| `withCookie`     | `key: string`                        | sets request cookie                     | `MatchBuilder`    |
| `withHeader`     | `key: string`                        | sets request header                     | `MatchBuilder`    |
| `withQueryParam` | `key: string`                        | sets request query parameter            | `MatchBuilder`    |

`UrlMatchBuilder`

| Method     | Arguments        | Effect                          | Returns          |
|------------|------------------|---------------------------------|------------------|
| `equalTo`  | `url: string`    | Matches text given              | `RequestBuilder` |
| `matching` | `regexp: string` | Matches with regular expression | `RequestBuilder` |

`MatchBuilder`

| Method             | Argument(s)                                                          | Returns          |
|--------------------|----------------------------------------------------------------------|------------------|
| `absent`           | none                                                                 | `RequestBuilder` |
| `containing`       | `value: string`                                                      | `RequestBuilder` |
| `equalTo`          | `value: string`                                                      | `RequestBuilder` |
| `equalToJson`      | `json: any, ignoreArrayOrder: boolean, ignoreExtraElements: boolean` | `RequestBuilder` |
| `equalToXml`       | `xml: string`                                                        | `RequestBuilder` |
| `macthing`         | `value: string`                                                      | `RequestBuilder` |
| `matchingJsonPath` | `path: string`                                                       | `RequestBuilder` |
| `matchingXPath`    | `xpath: string`                                                      | `RequestBuilder` |
| `notMatching`      | `value: string`                                                      | `RequestBuilder` |

### Define response behavior

Responses are created from `res` provided by `WireMockMapper.createMapping()`

```typescript
await WireMockMapper.createMapping((req, res) => {
  res.withJsonBody({
    someKey: 'theValue',
    otherKey: 'otherValue'
  })
  .withStatus(200)
  .withStatusMessage('ok');
});
```

#### Interface

`ResponseBuilder`

| Method              | Argument(s)               | Returns           |
|---------------------|---------------------------|-------------------|
| `withBody`          | `value: string`           | `ResponseBuilder` |
| `withDelay`         | `milliseconds: number`    | `ResponseBuilder` |
| `withHeader`        | `key: string`             | `ResponseBuilder` |
| `withJsonBody`      | `value: object`           | `ResponseBuilder` |
| `withStatus`        | `statusCode: object`      | `ResponseBuilder` |
| `withStatusMessage` | `statusMessage: string`   | `ResponseBuilder` |
| `withTransformer`   | `transformerName: string` | `ResponseBuilder` |

### Example

```typescript
await WireMockMapper.createMapping((req, res) => {
  req.isAGet().withUrlPath().equalTo('/my/api/path');
  res.withJsonBody({
    someKey: 'theValue',
    otherKey: 'otherValue'
  })
  .withStatus(200)
  .withStatusMessage('ok');
});
```