Skip to content

Commit 050ee0e

Browse files
committed
feat: refactoring to prepare verify
1 parent e7d686a commit 050ee0e

10 files changed

+109
-80
lines changed

pact/cli/verify.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,11 @@ def main(pacts, base_url, pact_url, pact_urls, states_url, states_setup_url,
189189
options = dict(filter(lambda item: is_empty_list(item), options.items()))
190190

191191
success, logs = VerifyWrapper().verify(*all_pact_urls,
192-
provider=provider,
193-
provider_base_url=base_url,
194-
enable_pending=enable_pending,
195-
include_wip_pacts_since=include_wip_pacts_since,
196-
**options)
192+
provider=provider,
193+
provider_base_url=base_url,
194+
enable_pending=enable_pending,
195+
include_wip_pacts_since=include_wip_pacts_since,
196+
**options)
197197
sys.exit(success)
198198

199199

pact/ffi/ffi_verifier.py

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
"""Wrapper to pact reference dynamic libraries using FFI."""
2+
from pact.pact_exception import PactException
23
from cffi import FFI
34
import platform
45

6+
57
class FFIVerify(object):
68
"""A Pact Verifier Wrapper."""
79

@@ -15,9 +17,11 @@ def version(self):
1517
result = lib.pactffi_version()
1618
return ffi.string(result).decode('utf-8')
1719

18-
19-
def verify(self):
20+
def verify(self, *pacts, provider_base_url, provider, enable_pending=False,
21+
include_wip_pacts_since=None, **kwargs):
2022
"""Call verify method."""
23+
self._validate_input(pacts, **kwargs)
24+
2125
ffi = FFI()
2226
ffi.cdef("""
2327
char *pactffi_verify(void);
@@ -26,8 +30,6 @@ def verify(self):
2630
result = lib.pactffi_version()
2731
return ffi.string(result).decode('utf-8')
2832

29-
# pactffi_verify
30-
3133
def _load_ffi_library(self, ffi):
3234
"""Load the right library."""
3335
target_platform = platform.platform().lower()
@@ -45,3 +47,12 @@ def _load_ffi_library(self, ffi):
4547
raise Exception(msg)
4648

4749
return ffi.dlopen(libname)
50+
51+
def _validate_input(self, pacts, **kwargs):
52+
if len(pacts) == 0 and not self._broker_present(**kwargs):
53+
raise PactException('Pact urls or Pact broker required')
54+
55+
def _broker_present(self, **kwargs):
56+
if kwargs.get('broker_url') is None:
57+
return False
58+
return True

pact/pact.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ def verify(self):
264264
"""
265265
self._interactions = []
266266
resp = requests.get(
267-
self.uri + "/interactions/verification", headers=self.HEADERS, verify=False, allow_redirects=True
267+
self.uri + "/interactions/verification", headers=self.HEADERS, verify=False
268268
)
269269
assert resp.status_code == 200, resp.text
270270
resp = requests.post(self.uri + "/pact", headers=self.HEADERS, verify=False)

pact/pact_exception.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""Custom Pact Exception."""
2+
3+
class PactException(Exception):
4+
"""PactException when input isn't valid.
5+
6+
Args:
7+
Exception ([type]): [description]
8+
9+
Raises:
10+
KeyError: [description]
11+
Exception: [description]
12+
13+
Returns:
14+
[type]: [description]
15+
16+
"""
17+
18+
def __init__(self, *args, **kwargs):
19+
"""Create wrapper."""
20+
super().__init__(*args, **kwargs)
21+
self.message = args[0]

pact/verifier.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ def verify_pacts(self, *pacts, enable_pending=False, include_wip_pacts_since=Non
5757

5858
options = self.extract_params(**kwargs)
5959
success, logs = VerifyWrapper().verify(*pacts,
60-
provider=self.provider,
61-
provider_base_url=self.provider_base_url,
62-
enable_pending=enable_pending,
63-
include_wip_pacts_since=include_wip_pacts_since,
64-
**options)
60+
provider=self.provider,
61+
provider_base_url=self.provider_base_url,
62+
enable_pending=enable_pending,
63+
include_wip_pacts_since=include_wip_pacts_since,
64+
**options)
6565

6666
return success, logs
6767

@@ -91,10 +91,10 @@ def verify_with_broker(self, enable_pending=False, include_wip_pacts_since=None,
9191
options.update(self.extract_params(**kwargs))
9292

9393
success, logs = VerifyWrapper().verify(provider=self.provider,
94-
provider_base_url=self.provider_base_url,
95-
enable_pending=enable_pending,
96-
include_wip_pacts_since=include_wip_pacts_since,
97-
**options)
94+
provider_base_url=self.provider_base_url,
95+
enable_pending=enable_pending,
96+
include_wip_pacts_since=include_wip_pacts_since,
97+
**options)
9898
return success, logs
9999

100100
def extract_params(self, **kwargs):

pact/verify_wrapper.py

+1-20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Wrapper to verify previously created pacts."""
22

33
from pact.constants import VERIFIER_PATH
4+
from pact.pact_exception import PactException
45
import sys
56
import os
67
import platform
@@ -101,26 +102,6 @@ def rerun_command():
101102
env['PACT_INTERACTION_RERUN_COMMAND'] = command
102103
return env
103104

104-
class PactException(Exception):
105-
"""PactException when input isn't valid.
106-
107-
Args:
108-
Exception ([type]): [description]
109-
110-
Raises:
111-
KeyError: [description]
112-
Exception: [description]
113-
114-
Returns:
115-
[type]: [description]
116-
117-
"""
118-
119-
def __init__(self, *args, **kwargs):
120-
"""Create wrapper."""
121-
super().__init__(*args, **kwargs)
122-
self.message = args[0]
123-
124105
class VerifyWrapper(object):
125106
"""A Pact Verifier Wrapper."""
126107

requirements_dev.txt

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@ Click>=2.0.0
22
coverage==5.4
33
Flask==1.1.1
44
configparser==3.5.0
5+
fastapi==0.67.0
56
flake8==3.8.3
67
mock==3.0.5
78
psutil==5.7.0
89
pycodestyle==2.6.0
910
pydocstyle==4.0.1
10-
tox==3.14.0
11+
tox==3.24.1
1112
pytest==5.4.1
1213
pytest-cov==2.11.1
1314
requests==2.26
14-
tox-travis==0.8
1515
urllib3>=1.26.5
1616
wheel==0.24.0
17-
requests>=2.5.0
1817
six>=1.9.0
19-
cffi==1.14.6
18+
fastapi==0.67.0
19+
uvicorn==0.14.0
20+
cffi==1.14.6

tests/ffi/test_ffi_verifier.py

+15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
1+
import pytest
2+
import mock
3+
4+
from pact.pact_exception import PactException
15
from pact.ffi.ffi_verifier import FFIVerify
26

37
def test_version():
48
assert FFIVerify().version() == "0.0.0"
9+
10+
11+
@mock.patch("os.listdir")
12+
def test_pact_urls_or_broker_required(mock_Popen):
13+
# mock_Popen.return_value.returncode = 2
14+
verifier = FFIVerify()
15+
16+
with pytest.raises(PactException) as e:
17+
verifier.verify(provider='provider', provider_base_url='http://localhost')
18+
19+
assert 'Pact urls or Pact broker required' in str(e)

tests/test_pact.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ def setUp(self):
484484
.upon_receiving('a specific request to the server')
485485
.with_request('GET', '/path')
486486
.will_respond_with(200, body='success'))
487+
487488
self.get_verification_call = call(
488489
'get', 'http://localhost:1234/interactions/verification',
489490
headers={'X-Pact-Mock-Service': 'true'},
@@ -530,7 +531,6 @@ def test_error_writing_pacts_to_file(self):
530531
self.mock_requests.assert_has_calls([
531532
self.get_verification_call, self.post_publish_pacts_call])
532533

533-
534534
class PactContextManagerTestCase(PactTestCase):
535535
def setUp(self):
536536
super(PactContextManagerTestCase, self).setUp()

tests/test_verify_wrapper.py

+36-36
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,9 @@ def test_pact_urls_provided(self):
9999
wrapper = VerifyWrapper()
100100

101101
result, output = wrapper.verify('./pacts/consumer-provider.json',
102-
'./pacts/consumer-provider2.json',
103-
provider='test_provider',
104-
provider_base_url='http://localhost')
102+
'./pacts/consumer-provider2.json',
103+
provider='test_provider',
104+
provider_base_url='http://localhost')
105105

106106
self.assertProcess(*self.default_call)
107107
self.assertEqual(result, 0)
@@ -112,18 +112,18 @@ def test_all_url_options(self, mock_isfile):
112112
wrapper = VerifyWrapper()
113113

114114
result, output = wrapper.verify('./pacts/consumer-provider5.json',
115-
'./pacts/consumer-provider3.json',
116-
provider_base_url='http://localhost',
117-
provider_states_setup_url='http://localhost/provider-states/set',
118-
provider='provider',
119-
provider_app_version='1.2.3',
120-
custom_provider_headers=['Authorization: Basic cGFj', 'CustomHeader: somevalue'],
121-
log_dir='tmp/logs/pact.test.log',
122-
log_level='INFO',
123-
timeout=60,
124-
verbose=True,
125-
enable_pending=True,
126-
include_wip_pacts_since='2018-01-01')
115+
'./pacts/consumer-provider3.json',
116+
provider_base_url='http://localhost',
117+
provider_states_setup_url='http://localhost/provider-states/set',
118+
provider='provider',
119+
provider_app_version='1.2.3',
120+
custom_provider_headers=['Authorization: Basic cGFj', 'CustomHeader: somevalue'],
121+
log_dir='tmp/logs/pact.test.log',
122+
log_level='INFO',
123+
timeout=60,
124+
verbose=True,
125+
enable_pending=True,
126+
include_wip_pacts_since='2018-01-01')
127127

128128
self.assertEqual(result, 0)
129129
self.mock_Popen.return_value.wait.assert_called_once_with()
@@ -149,13 +149,13 @@ def test_uses_broker_if_no_pacts_and_provider_required(self):
149149
wrapper = VerifyWrapper()
150150

151151
result, output = wrapper.verify(provider='test_provider',
152-
provider_base_url='http://localhost',
153-
broker_username='username',
154-
broker_password='pwd',
155-
broker_token='token',
156-
broker_url='http://broker',
157-
consumer_tags=['prod', 'dev'],
158-
provider_tags=['dev', 'qa'])
152+
provider_base_url='http://localhost',
153+
broker_username='username',
154+
broker_password='pwd',
155+
broker_token='token',
156+
broker_url='http://broker',
157+
consumer_tags=['prod', 'dev'],
158+
provider_tags=['dev', 'qa'])
159159

160160
self.assertProcess(*self.broker_call)
161161
self.assertEqual(result, 0)
@@ -169,9 +169,9 @@ def test_rerun_command_called(self, mock_rerun_cmd, mock_expand_dirs, mock_sanit
169169
wrapper = VerifyWrapper()
170170

171171
result, output = wrapper.verify('path/to/pact1',
172-
'path/to/pact2',
173-
provider_base_url='http://localhost',
174-
provider='provider')
172+
'path/to/pact2',
173+
provider_base_url='http://localhost',
174+
provider='provider')
175175

176176
mock_rerun_cmd.assert_called_once()
177177

@@ -184,9 +184,9 @@ def test_sanitize_called(self, mock_rerun_cmd, mock_expand_dirs, mock_sanitize_l
184184
wrapper = VerifyWrapper()
185185

186186
result, output = wrapper.verify('path/to/pact1',
187-
'path/to/pact2',
188-
provider_base_url='http://localhost',
189-
provider='provider')
187+
'path/to/pact2',
188+
provider_base_url='http://localhost',
189+
provider='provider')
190190

191191
mock_sanitize_logs.assert_called_with(self.mock_Popen.return_value, False)
192192

@@ -197,11 +197,11 @@ def test_publishing_with_version(self, mock_sanitize_logs, mock_path_exists):
197197
wrapper = VerifyWrapper()
198198

199199
result, output = wrapper.verify('./pacts/consumer-provider.json',
200-
'./pacts/consumer-provider2.json',
201-
provider='test_provider',
202-
provider_base_url='http://localhost',
203-
provider_app_version='1.2.3',
204-
publish_verification_results=True)
200+
'./pacts/consumer-provider2.json',
201+
provider='test_provider',
202+
provider_base_url='http://localhost',
203+
provider_app_version='1.2.3',
204+
publish_verification_results=True)
205205

206206
self.default_call.extend(['--provider-app-version', '1.2.3', '--publish-verification-results'])
207207

@@ -217,9 +217,9 @@ def test_expand_dirs_called(self, mock_rerun_cmd, mock_expand_dirs, mock_sanitiz
217217
wrapper = VerifyWrapper()
218218

219219
result, output = wrapper.verify('path/to/pact1',
220-
'path/to/pact2',
221-
provider_base_url='http://localhost',
222-
provider='provider')
220+
'path/to/pact2',
221+
provider_base_url='http://localhost',
222+
provider='provider')
223223

224224
mock_expand_dirs.assert_called_with(['path/to/pact1',
225225
'path/to/pact2'])

0 commit comments

Comments
 (0)