Toolchain to define and verify REST API in BDD.
Using Given, when, functions as you see in the example below, you can
determine and assert the behaviour of your REST API.
The story, response, status objects are some proxies for currently
writing story(inside the with Given( ... ): context) and it's response.
and the last response after a Given and or when.
import re
import sys
import json
from bddrest.authoring import Given, when, response, status
def wsgi_application(environ, start_response):
path = environ['PATH_INFO']
if path.endswith('/None'):
start_response(
'404 Not Found',
[('Content-Type', 'text/plain;charset=utf-8')]
)
yield b''
else:
start_response(
'200 OK',
[('Content-Type', 'application/json;charset=utf-8')]
)
result = json.dumps(dict(
foo='bar'
))
yield result.encode()
with Given(
wsgi_application,
title='Quickstart!',
path='/books/id: 1',
as_='visitor') as story:
assert status == 200
assert status == '200 OK'
assert 'foo' in response.json
assert response.json['foo'] == 'bar'
when(
'Trying invalid book id',
path_parameters={'id': None}
)
assert response.status == 404story.dumps()Produces:
base_call:
as_: visitor
description: As a member I have to POST a book to the library.
form:
name: BDD Book
query:
a: b
response:
headers:
- 'Content-Type: application/json;charset=utf-8'
json:
foo: bar
status: 200 OK
title: Posting a book
path: /books/:id
path_parameters:
id: '1'
verb: GET
calls:
- response:
headers:
- 'Content-Type: text/plain;charset=utf-8'
status: 404 Not Found
title: Trying invalid book id
path_parameters:
id: NoneYou may load the story again from this yaml with Story.loads(yaml).
There are two additional methods available to dump and load to
and from a file: story.load(file) and story.dump(file)
You may pass the autodump argument of the Given function to configure the
auto-dumping:
:param autodump: A file-like object to write dumped story.
Default is `None`, means autodump is disabled by default.
You may pass the autodoc argument of the Given function to configure the
auto-documentation:
:param autodoc: A file-like object to write documentation.
Default is `None`, meana autodoc is disabled by default.
:param autodoc_format: Either ``markdown`` or ``html``. default is
``markdown``.
You can use story.document([formatter_factory=MarkdownFormatter]) to generate documentation
in arbitrary format for example: Markdown.
There is also a CLI to do this:
bddrest document < story.yml > story.md## Posting a book
### GET /books/:id
As a member I have to POST a book to the library.
### Path Parameters
Name | Example
--- | ---
id | 1
### Query Strings
Name | Example
--- | ---
a | b
### Form
Name | Example
--- | ---
name | BDD Book
### Response: 200 OK
#### Headers
* Content-Type: application/json;charset=utf-8
#### Body
```json
{"foo": "bar"}
```
## WHEN: Trying invalid book id
### Path Parameters
Name | Example
--- | ---
id | None
### Response: 404 Not Found
#### Headers
* Content-Type: text/plain;charset=utf-8
After installing the project a command named bddrest will be available.
bddrest -hAdd this into your .bashrc and or $VIRTUAL_ENV/bin/postactivate.
eval "$(register-python-argcomplete bddrest)"