Skip to content

Commit d4072ed

Browse files
Merge pull request #156 from pact-foundation/feat/provider_verifier
feat: provider verifier
2 parents 4635a07 + 926a611 commit d4072ed

39 files changed

+1669
-573
lines changed

.flake8

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[flake8]
2+
ignore = E226,E302,E41,W503
3+
max-line-length = 160
4+
max-complexity = 10

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ deps:
3131
define E2E
3232
cd examples/e2e
3333
pip install -r requirements.txt
34+
pip install -e ../../
3435
pytest tests/test_user_consumer.py
3536
./verify_pact.sh
3637
endef

examples/broker/docker-compose.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
version: '3'
2+
3+
services:
4+
5+
postgres:
6+
image: postgres
7+
healthcheck:
8+
test: psql postgres --command "select 1" -U postgres
9+
ports:
10+
- "5432:5432"
11+
environment:
12+
POSTGRES_USER: postgres
13+
POSTGRES_PASSWORD: password
14+
POSTGRES_DB: postgres
15+
16+
broker_app:
17+
image: dius/pact-broker
18+
ports:
19+
- "80:80"
20+
links:
21+
- postgres
22+
environment:
23+
PACT_BROKER_DATABASE_USERNAME: postgres
24+
PACT_BROKER_DATABASE_PASSWORD: password
25+
PACT_BROKER_DATABASE_HOST: postgres
26+
PACT_BROKER_DATABASE_NAME: postgres
27+
PACT_BROKER_BASIC_AUTH_USERNAME: pactbroker
28+
PACT_BROKER_BASIC_AUTH_PASSWORD: pactbroker
29+
30+
nginx:
31+
image: nginx:alpine
32+
links:
33+
- broker_app:broker
34+
volumes:
35+
- ./ssl/nginx.conf:/etc/nginx/conf.d/default.conf:ro
36+
- ./ssl:/etc/nginx/ssl
37+
ports:
38+
- "8443:443"
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDiDCCAnACCQCWW6LywpPSwjANBgkqhkiG9w0BAQsFADCBhTELMAkGA1UEBhMC
3+
QVUxEzARBgNVBAgMClNvbWUgU3RhdGUxDzANBgNVBAcMBlN5ZG5leTENMAsGA1UE
4+
CgwEUGFjdDEPMA0GA1UECwwGUHl0aG9uMRIwEAYDVQQDDAlsb2NhbGhvc3QxHDAa
5+
BgkqhkiG9w0BCQEWDXNvbWVAbWFpbC5jb20wHhcNMjAwNjEwMTUzOTM2WhcNMjMw
6+
MzMxMTUzOTM2WjCBhTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUgU3RhdGUx
7+
DzANBgNVBAcMBlN5ZG5leTENMAsGA1UECgwEUGFjdDEPMA0GA1UECwwGUHl0aG9u
8+
MRIwEAYDVQQDDAlsb2NhbGhvc3QxHDAaBgkqhkiG9w0BCQEWDXNvbWVAbWFpbC5j
9+
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDm/BMUkuVaYwLjnoq/
10+
u4fFKoBGSPl3CxvSUWhzlsaM5i+UlS7ZLwXxAxw+Vba9cztSyYHNs2BCxCHUWBFe
11+
B818cXzQXbV0gunMz9oDxr8aQmwpRkIdxxBvmaqLbk6sjj5cTqRK39/BNtZEkZmA
12+
QAOggnfB7Bx/OQmh4aidT6DytjA8ur3FofAVUVXHfQohm/kJOhqcdXL5pBQqD2bh
13+
Ua6KPbZTsfOmFLggZmhqPZSjS+leqFagpissW/aHSyk/3c+vhXOhEbCUeCXaz7up
14+
/DNF/0OHF4+r2UaeonxMxC/X6NEhNYHyNPypbdC3/59Zoa2Spu2BLy8ZoChe1dRk
15+
hZqtAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAHpq3JmhAm5t/orY4ONFxPq1iF89
16+
3nKsKckfcOpDF/zjS2+6I30LVByuU88BKdTt7tsRojoWXEI01YGqYWTEwerfESr9
17+
M16xek5h5e7XJqp9jzyX6kswel/rWB8rF93biW0v00/KKRwwIr5IDvKb4XvugzW4
18+
FEG+1nhXCyjrkmKV/bbCfdkBHgavaj5TPv1LoXOX7VDRjwqoM7RP/z6JJsZkxDx3
19+
TkXtC8Lw4LF+tpWY8nQu3/HCqwxL7Vgy4M/IvoXRePdSI6goH8ri0zFuK9pvAREK
20+
IjY271t+lapu8sDqUEf9tW/98YhxpBInQYBL2bEEtMYTRXRm06fSn7o3IlM=
21+
-----END CERTIFICATE-----
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpQIBAAKCAQEA5vwTFJLlWmMC456Kv7uHxSqARkj5dwsb0lFoc5bGjOYvlJUu
3+
2S8F8QMcPlW2vXM7UsmBzbNgQsQh1FgRXgfNfHF80F21dILpzM/aA8a/GkJsKUZC
4+
HccQb5mqi25OrI4+XE6kSt/fwTbWRJGZgEADoIJ3wewcfzkJoeGonU+g8rYwPLq9
5+
xaHwFVFVx30KIZv5CToanHVy+aQUKg9m4VGuij22U7HzphS4IGZoaj2Uo0vpXqhW
6+
oKYrLFv2h0spP93Pr4VzoRGwlHgl2s+7qfwzRf9DhxePq9lGnqJ8TMQv1+jRITWB
7+
8jT8qW3Qt/+fWaGtkqbtgS8vGaAoXtXUZIWarQIDAQABAoIBAQC3r5woz0yO3ZAN
8+
nSWvpZ0pwUuzGRMxhOcCEPUkfrG0mNUbrqtL0WZDLHsIYzdoXzu88TxFbbFORxSz
9+
/bkJ8uCJZuKf/PVxCy6MTnqMaD/OzSWgiRvI/GXoqeYC7ZypApE67NsgI/qXd1lb
10+
vAG7CK0ZtscvsulSjvRHBOIG/6z5dUAKnLJjr7uKydMHSIKNafKAEA6HGDCvIu4d
11+
J9EQzLfmpjLTkeB1DNZrv1mtNjf/kG/M/UX5a1RtOJTGvHQn/oZSUKng3DVUNBtq
12+
dEO6Pi5n88xWuxH6YAWqqDjCfqyey1Jc1rQxfnx6vRPL7+IaXRugAKFMFm8Xbp9/
13+
/9eEDCyNAoGBAPZEjYH9u2856KYUTyky8gD1TOE9gf4x4zFjK6SzBT8v1y1RdSwQ
14+
tf7ozj94OV/b9bAE3k/z2a09xYty5VBXs6MCluQTS67KgRaO9sSFtRmnupyBNk2z
15+
r3QEYuVDmJ6Dk/3ovItXqFaW8IbOZMf6Acu5aEDx4UKmb2tzGGJ7DxF/AoGBAPAc
16+
57p1yRWIG+hJMdkudXhBz+L3t2NbESWom33hi1mDMIKp3dwJmhA4kq+Uyqfl32uF
17+
Iy3z+3xr2V1BdGg1RnicfcyjHaQ4/89YB+nkOHB8muV2R57tYahOgWn6rXXxTOBs
18+
X2Vjd7ByAEFimrVfDH33inrYuIiI/cku4Xyj71HTAoGBAJeyrsBuPfFL6KW1SPYF
19+
7dDtSchNjS+6J0sa3Z18sTS1EYVW8iiMuq8lVTb/pcgIxJUCyrbRbTssG+3EfsE4
20+
5Oz7AVvJDwvCrjXpJtTz0BTXnzoc1giTMPb0ZL75HqA2SQlVPh9PheCg5dUEekw9
21+
ErIdqbynwqy9vVCg+1pel2+dAoGAR1C+fsIHFG8VottCg/fpies6HHZosIjWwfGf
22+
JTc9FTwCx3w+WeE8Mf8rihzOSCndPukPNtHVavH5YFpVgbH5GU+ZiZMU9ba8O9Aw
23+
oYZYQQixVN/Zi9mDfOK8S0baCELAC5QEjW+KmAx0CPeJbb8qTaudJLmDrYHKpttW
24+
u5dROGMCgYEAlgTZNiEeBAPQZD30CSvFUlZVCOOyu5crP9hCPA9um5FsvD9minSz
25+
yJqeMj7zapZsatAzYwHrGG6nHnTKWEBNaimR7kjTpKdKzXQaA9XeVLmeFAZ3Exad
26+
JDKTPI+asF+097sHUcVuloMOZXbD1uAZnvLWIwfsaHxs41AkF+0lmM4=
27+
-----END RSA PRIVATE KEY-----

examples/broker/ssl/nginx.conf

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
server {
2+
listen 443 ssl default_server;
3+
server_name localhost;
4+
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
5+
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
6+
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
7+
ssl_prefer_server_ciphers on;
8+
ssl_ecdh_curve secp384r1;
9+
ssl_session_cache shared:SSL:10m;
10+
ssl_stapling on;
11+
ssl_stapling_verify on;
12+
13+
location / {
14+
proxy_pass http://broker:80;
15+
proxy_set_header Host $host;
16+
proxy_set_header X-Forwarded-Scheme "https";
17+
proxy_set_header X-Forwarded-Port "443";
18+
proxy_set_header X-Forwarded-Ssl "on";
19+
proxy_set_header X-Real-IP $remote_addr;
20+
}
21+
}

examples/e2e/pact_provider.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ def setup_user_a_nonadmin():
2323
ip_address = '198.0.0.1'
2424

2525
fakedb['UserA'] = {
26-
'name': "UserA",
27-
'id': id,
28-
'created_on': some_date,
29-
'ip_address': ip_address,
30-
'admin': False
31-
}
26+
'name': "UserA",
27+
'id': id,
28+
'created_on': some_date,
29+
'ip_address': ip_address,
30+
'admin': False
31+
}
3232

3333

3434
if __name__ == '__main__':

examples/e2e/tests/test_user_consumer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@ def pact(request):
4242
Provider('UserService'), host_name=PACT_MOCK_HOST, port=PACT_MOCK_PORT,
4343
pact_dir=PACT_DIR)
4444
try:
45+
print('start service')
4546
pact.start_service()
4647
yield pact
4748
finally:
49+
print('stop service')
4850
pact.stop_service()
4951

5052
version = request.config.getoption('--publish-pact')

examples/verifier/.flake8

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[flake8]
2+
max-line-length = 160
3+
exclude = .direnv/*
4+
max-complexity = 10

examples/verifier/README.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Introduction
2+
3+
This is a verifier example.
4+
5+
## Setup
6+
7+
Create your own virtualenv for this. Run
8+
9+
```bash
10+
pip install -r requirements.txt
11+
```
12+
13+
This should provide you with a relative path to pact install relatively (2 dirs up)
14+
15+
Create the local broker (for demo purposes only) To do this separately clone this repo:
16+
* https://github.com/pact-foundation/pact-broker-docker
17+
18+
Then from where this is install run in it's own terminal
19+
20+
```bash
21+
docker-compose up
22+
```
23+
24+
If you can open a browser to http://localhost and see the broker you have succeeded.
25+
26+
## Consumer
27+
28+
From the root directory run:
29+
30+
```bash
31+
pytest
32+
```
33+
34+
Or you can run individual tests like:
35+
36+
```bash
37+
pytest tests/xxx.py::test_yyy
38+
```

0 commit comments

Comments
 (0)