Slide 1

Slide 1 text

API DATA STUBBING DONE RIGHT Paolo Ferretti Photo by Chris White

Slide 2

Slide 2 text

WHO AM I ➤ Paolo Ferretti ➤ Senior software developer @ R&D team in MailUP ➤ @paoferretti ➤ https://github.com/pferretti

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

WHAT IS AN API DATA STUB?

Slide 5

Slide 5 text

“ Replica or imitation of a real API -Paolo Ferretti

Slide 6

Slide 6 text

Photo by Mike Boening

Slide 7

Slide 7 text

HOW DOES IT WORK TODAY?

Slide 8

Slide 8 text

import responses import requests @responses.activate def test_simple(): responses.add(responses.GET, 'http://twitter.com/api/1/foobar', json={'error': 'not found'}, status=404) resp = requests.get('http://twitter.com/api/1/foobar') assert resp.json() == {"error": "not found"}

Slide 9

Slide 9 text

MY SOFTWARE ARCHITECTURE IS DIFFERENT

Slide 10

Slide 10 text

SEPARATION OF CONCERNS

Slide 11

Slide 11 text

Web Components Microservices Docker containers

Slide 12

Slide 12 text

HOW CAN WE MAKE IT BETTER?

Slide 13

Slide 13 text

Data {} Code

Slide 14

Slide 14 text

FAKE DATA

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

MOCKER ➤ HTTP server ➤ Command line tool ➤ Multiplatform ➤ Useful proxy mode ➤ Built for containers ➤ Fast! Photo by Jim Bahn Available at https://github.com/theghostwhocodes/mocker-go https://hub.docker.com/r/theghostwhocodes/mocker/

Slide 17

Slide 17 text

HOW DOES MOCKER WORK? HTTP GET http://localhost:2626/api/1/foobar /home/paolo/myproject/tests/data/api/1/foobar.GET.json

Slide 18

Slide 18 text

A FIRST EXAMPLE - SIMPLE.GET.JSON { "request": { "method": "GET" }, "response": { "headers": { "Content-Type": ["application/json"] }, "body": { "message": “Hello BrewBox!” }, "status": 200 } }

Slide 19

Slide 19 text

A SECOND EXAMPLE - SIMPLE.POST.JSON { "request": { "method": "POST", "payload": { "param1": ["value1"], "param2": ["value2"] } }, "response": { "headers": { "Content-Type": ["application/json"] }, "body": { "key": "simple.POST.twoparams.json" } } }

Slide 20

Slide 20 text

FILE NAMING CONVENTION /home/paolo/myproject/test/data/api/1/simple.GET.optional.json HTTP GET http://localhost:2626/api/1/simple

Slide 21

Slide 21 text

FILE NAMING CONVENTION /home/paolo/myproject/test/data/api/1/simple.GET.optional.json Data path HTTP GET http://localhost:2626/api/1/simple

Slide 22

Slide 22 text

FILE NAMING CONVENTION /home/paolo/myproject/test/data/api/1/simple.GET.optional.json Data path API path HTTP GET http://localhost:2626/api/1/simple

Slide 23

Slide 23 text

FILE NAMING CONVENTION /home/paolo/myproject/test/data/api/1/simple.GET.optional.json Data path API path Resource HTTP GET http://localhost:2626/api/1/simple

Slide 24

Slide 24 text

FILE NAMING CONVENTION /home/paolo/myproject/test/data/api/1/simple.GET.optional.json Data path API path Resource HTTP verb HTTP GET http://localhost:2626/api/1/simple

Slide 25

Slide 25 text

FILE NAMING CONVENTION /home/paolo/myproject/test/data/api/1/simple.GET.optional.json Data path API path Resource HTTP verb Optional part HTTP GET http://localhost:2626/api/1/simple

Slide 26

Slide 26 text

FILE NAMING CONVENTION /home/paolo/myproject/test/data/api/1/simple.GET.optional.json Data path API path Resource HTTP verb Optional part Extension HTTP GET http://localhost:2626/api/1/simple

Slide 27

Slide 27 text

PROXY MODE HTTP GET http://localhost:2626/api/1/foobar http://twitter.com/api/1/foobar mocker

Slide 28

Slide 28 text

STEP BACK

Slide 29

Slide 29 text

WHY IS IT IMPORTANT TO STUB DATA? ➤ Separation of concerns / decoupling ➤ Software development (thanks to proxy mode) ➤ Consistent data for tests ➤ Safe environments for demo ➤ Stubs are simple text files ➤ Test data more accessible for non technical people

Slide 30

Slide 30 text

THANK YOU That’s all folks! Photo by Ben Smith