![Page 1: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/1.jpg)
Automatic testing of(RESTful) API documentation
API Days Australia, February 2017
By Rouven Weßling ( )Ecosystem Developer / Developer Evangelist, Contentful
@RouvenWessling
photo credit: by Sydney Harbour Bridge, Australia Lenny K Photography (CC-BY)
![Page 2: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/2.jpg)
A content management developer platform with an API at its core.
![Page 3: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/3.jpg)
![Page 4: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/4.jpg)
What do you do?
![Page 5: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/5.jpg)
Powered by
![Page 6: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/6.jpg)
A new look.
![Page 7: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/7.jpg)
Documentation will be wrong
![Page 8: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/8.jpg)
Users hate that
![Page 9: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/9.jpg)
It's all in the spec
api blueprintA powerful high-level API description language for web APIs.
![Page 10: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/10.jpg)
## Questions Collection [/questions]
### Create a New Question [POST]
You may create your own question using this action. It takes a JSON object containing a question and a collection of answers in the form of choices.
+ Request (application/json) { "question": "Favourite programming language?", "choices": [ "Swift", "Python", "Objective-C", "Ruby" ] }
+ Response 201 (application/json) + Headers Location: /questions/2 + Body { "question": "Favourite programming language?", "published_at": "2015-08-05T08:40:51.620Z", "choices": [ { "choice": "Swift",
![Page 11: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/11.jpg)
Let's get testing
DREDDNo more outdated API documentation.
![Page 12: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/12.jpg)
Testing read-onlynode_modules/.bin/dredd cma.apib https://api.contentful.com \ -m GET
![Page 13: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/13.jpg)
![Page 14: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/14.jpg)
![Page 15: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/15.jpg)
HooksbeforeAll called at the beginning of the whole test run
beforeEach called before each HTTP transaction
before called before some specific HTTP transaction
beforeEachValidation called before each HTTP transaction is validated
beforeValidation called before some specific HTTP transaction is validated
after called a�er some specific HTTP transaction regardless its result
afterEach called a�er each HTTP transaction
afterAll called a�er whole test run
![Page 16: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/16.jpg)
Hooksnode_modules/.bin/dredd cma.apib https://api.contentful.com \ --hookfiles=./test-hooks.js \ -m GET
![Page 17: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/17.jpg)
Skipping Testsvar hooks = require('hooks');
hooks.before( "Webhook calls > Webhook call details > Get the webhook call details", function (transaction) { transaction.skip = true; });
![Page 18: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/18.jpg)
Mutating datavar hooks = require('hooks');
hooks.before( "Entries > Delete an Entry", function (transaction) { client.createEntry(entry, "1234") });
![Page 19: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/19.jpg)
Rate limitingvar hooks = require('hooks'); const DELAY = 1000/6.0;
hooks.afterEach(function(transaction, done) { setTimeout(done, DELAY); });
![Page 20: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/20.jpg)
Changing request datavar hooks = require('hooks');
hooks.beforeEach(function (transaction, done) { transaction.fullPath = transaction.fullPath.replace('fp91oelsziea', 'gbkxklvmolc1');
done(); });
![Page 21: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/21.jpg)
Chai assertionsvar hooks = require('hooks'); var assert = require('chai').assert;
hooks.afterEach(function(transaction, done) { if (!transaction.skip) { assert.match(transaction.real.headers['x-contentful-request-id'], /^content-api:[a-zA-Z0-9]{22}$/ }
done(); });
![Page 22: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/22.jpg)
Security �
![Page 23: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/23.jpg)
Censor private datavar hooks = require('hooks'); const SECRET_HEADERS = ['Authorization'].map(header => header.toLowerCase());
hooks.afterEachValidation(function(transaction, done) { Object.keys(transaction.request.headers).forEach(function(key) { if (SECRET_HEADERS.indexOf(key.toLowerCase()) > -1) { transaction.request.headers[key] = "***HIDDEN SECRET DATA***"; } });
done(); });
![Page 24: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/24.jpg)
CI the beast
![Page 25: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/25.jpg)
![Page 26: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/26.jpg)
ConclusionBase your documentation on an API specTest that specMake it part of your CIDon't substitute your integration tests
![Page 27: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/27.jpg)
Slides available on Slideshare: http://www.slideshare.net/rwessling/
Follow me on Twitter: @RouvenWessling
![Page 28: API Days Australia - Automatic Testing of (RESTful) API Documentation](https://reader031.vdocuments.mx/reader031/viewer/2022020103/58ceefcf1a28ab333d8b6559/html5/thumbnails/28.jpg)
MeetupThursday, March 2, 2017
7:00 pmPivotal Labs, Level 11, 155 Clarence Street, Sydney
https://www.meetup.com/Contentful-User-Meetup-Sydney/events/237520492/