Mockable, containerized API generated from a Swagger spec. Docker Repo: https://hub.docker.com/r/mustafar/parrot/
If you don't need to publish out a mock docker image of your service and just want to generate a quick container that mocks a swagger file you have, you can issue this command
docker run -p 3000:3000 -v $(pwd):/myswagger -it --rm -e PORT=3000 -e SWAGGER_SPEC="/myswagger/swagger.yml" mustafar/parrot:latest
This assumes that swagger.yml exists in your current directory.
If you're a service author and want to publish out a mocked and versioned copy of your service for consumers to use in their tests, you can build a docker image off of the parrot docker image.
FROM mustafar/parrot:latest
# set the port for the mock api
ENV PORT=3000
# copy a swagger spec to /swagger.yml (inside container)
# and also set the path of swagger.yml in the container
COPY /path/to/a/swagger/or/openapi3/spec /spec.yml
ENV API_SPEC="/spec.yml
Run the following command (in the same dir as the Dockerfile) to build your image
docker build -t my_api .
You may now publish this image to a docker repository.
Run this command to start your container
docker run -p 3000:3000 my_api:latest
The -p
directive sets up port forwarding from your container to host.
Once your API is up and running, you may call various API endpoints and receive either default or mocked responses.
Consider the following swagger route
/batman/location:
get:
x-swagger-router-controller: batman-location-controller
responses:
500:
description: failed to find batman
201:
example: alfred's outhouse # example is at an unexpected level
200:
schema:
type: string
example: batcave # example at correct level
description: batman found
Parrot will return the first response with an example
property nested under a schema
property. It will response with the value of the example
property (in this case batcave (200)
).
Call PUT /mock
to mock another route
// mock
const mock = {
method: 'GET',
path: '/batman/location',
qs: 'hello=world&foo=bar', // optional query string
status: 201,
response: 'arkham',
};
await fetch(
`${apiBase}/mock`,
{
method: 'PUT',
body: JSON.stringify(mock),
headers: { 'content-type': 'application/json' }
},
);
// invoke (should return "arkham (201)")
await fetch(`${apiBase}/batman/location?hello=world&foo=bar`, { method: 'GET' });
DELETE /mock
will reset all mocked behavor.
To enable verbose logging, set VERBOSE
environment variable when running the container
-e VERBOSE=on
Check out the tests for more examples!
Spin up the test container with this command
npm run build && npm run test:setup
Run tests with
npm test
Please feel free to send me a PR or open an Issue.
To use an OpenApi 3 spec, please set any value for environment variable IS_OAS3
.
Example:
docker run -d --name parrot-container-openapi3 \
-e PORT=15010 \
-e VERBOSE=on \
-p 15010:15010 \
-e API_SPEC="/spec.yml" \
-e IS_OAS3="true" \
-v openapi3_spec.yaml:/spec.yml \
mustafar/parrot:latest