PactTodo

Simple iOS Swift project for playing with Pact. Nothing fancy with UI yet

Server

Project uses Simple webapi server
Run it using following command:

$ json-server --watch db.json --routes routes.json

Todos service will be available at:

http://localhost:3000/todos/

Pact integration

To be able to create pact contracts, install Pact tools via

$ brew install pact-ruby-standalone

Pact mock service

For launching and stopping Pact mock service Scripts/start_service.sh and Scripts/stop_service.sh is used
PactTodo scheme invokes them using Test Pre- and Post- Actions

PactBroker

We are using Pact broker service hosted in the docker container. To configure and run it use following commands:

# Run the postgres container
docker run \
    --name pactbroker-db \
    -e POSTGRES_PASSWORD=ThePostgresPassword \
    -e POSTGRES_USER=admin \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v /var/lib/postgresql/data:/var/lib/postgresql/data \
    -d postgres


# connect to psql in the postgres container
docker run \
    -it \
    --link pactbroker-db:postgres \
    --rm postgres \
    sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U admin'


# Create pactbroker DB user and grant some access to him
CREATE USER pactbrokeruser WITH PASSWORD 'TheUserPassword';
CREATE DATABASE pactbroker WITH OWNER pactbrokeruser;
GRANT ALL PRIVILEGES ON DATABASE pactbroker TO pactbrokeruser;

# Run the pactbroker server
docker run \
    --name pactbroker \
    --link pactbroker-db:postgres \
    -e PACT_BROKER_DATABASE_USERNAME=pactbrokeruser \
    -e PACT_BROKER_DATABASE_PASSWORD=TheUserPassword \
    -e PACT_BROKER_DATABASE_HOST=postgres \
    -e PACT_BROKER_DATABASE_NAME=pactbroker \
    -d  \
    -p 9292:9292 \
    pactfoundation/pact-broker

Some examples how to work with the Pact Broker

# Publish Pact file
curl -v -X PUT \
    -H "Content-Type: application/json" \
    -T tmp/pacts/todosclient-todosapi.json \
    http://localhost:9292/pacts/provider/TodosAPI/consumer/TodosClient/version/0.0.1

# Get all participants
curl --location --request GET 'http://localhost:9292/pacticipants' \
--header 'Content-Type: application/json'

# Get concrete Pact
curl --location --request GET 'http://localhost:9292/pacts/provider/TodosAPI/consumer/TodosClient/version/2.0.0' \
--header 'Content-Type: application/json' 

GitHub

https://github.com/alounce/PactTodo