Skip to content

Commit 46372c7

Browse files
Merge pull request #171 from m-aciek/enable-pending
feat: Support pending Pacts
2 parents 8ed56d6 + e840587 commit 46372c7

File tree

8 files changed

+82
-28
lines changed

8 files changed

+82
-28
lines changed

.pre-commit-config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
repos:
2+
- repo: https://github.com/commitizen-tools/commitizen
3+
rev: master
4+
hooks:
5+
- id: commitizen
6+
stages: [commit-msg]

pact/cli/verify.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,20 +104,23 @@
104104
'--verbose/--no-verbose',
105105
default=False,
106106
help='Toggle verbose logging, defaults to False.')
107-
@click.option(
108-
'--verbose/--no-verbose',
109-
default=False,
110-
help='Toggle verbose logging, defaults to False.')
111107
@click.option(
112108
'log_dir', '--log-dir',
113109
help='The directory for the pact.log file.')
114110
@click.option(
115111
'log_level', '--log-level',
116112
help='The logging level.')
113+
@click.option(
114+
'enable_pending', '--enable-pending',
115+
default=False,
116+
help='Allow pacts which are in pending state to be verified without causing the '
117+
'overall task to fail. For more information, see https://pact.io/pending',
118+
is_flag=True)
117119
def main(pacts, base_url, pact_url, pact_urls, states_url, states_setup_url,
118120
username, broker_base_url, consumer_version_tag, consumer_version_selector,
119121
provider_version_tag, password, token, provider, headers, timeout,
120-
provider_app_version, publish_verification_results, verbose, log_dir, log_level):
122+
provider_app_version, publish_verification_results, verbose, log_dir,
123+
log_level, enable_pending):
121124
"""
122125
Verify one or more contracts against a provider service.
123126
@@ -172,7 +175,7 @@ def main(pacts, base_url, pact_url, pact_urls, states_url, states_setup_url,
172175
'consumer_tags': list(consumer_version_tag),
173176
'consumer_selectors': list(consumer_version_selector),
174177
'provider_tags': list(provider_version_tag),
175-
'provider_states_setup_url': states_setup_url
178+
'provider_states_setup_url': states_setup_url,
176179
}
177180

178181
options = dict(filter(lambda item: item[1] is not None, options.items()))
@@ -182,6 +185,7 @@ def main(pacts, base_url, pact_url, pact_urls, states_url, states_setup_url,
182185
success, logs = VerifyWrapper().call_verify(*all_pact_urls,
183186
provider=provider,
184187
provider_base_url=base_url,
188+
enable_pending=enable_pending,
185189
**options)
186190
sys.exit(success)
187191

pact/verifier.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def validate_publish(self, **kwargs):
3030
# do something
3131
raise Exception()
3232

33-
def verify_pacts(self, *pacts, **kwargs):
33+
def verify_pacts(self, *pacts, enable_pending=False, **kwargs):
3434
"""Verify our pacts from the provider.
3535
3636
Returns:
@@ -53,17 +53,19 @@ def verify_pacts(self, *pacts, **kwargs):
5353
success, logs = VerifyWrapper().call_verify(*pacts,
5454
provider=self.provider,
5555
provider_base_url=self.provider_base_url,
56+
enable_pending=enable_pending,
5657
**options)
5758

5859
return success, logs
5960

60-
def verify_with_broker(self, **kwargs):
61+
def verify_with_broker(self, enable_pending=False, **kwargs):
6162
"""Use Broker to verify.
6263
6364
Args:
6465
broker_username ([String]): broker username
6566
broker_password ([String]): broker password
6667
broker_url ([String]): url of broker
68+
enable_pending ([Boolean])
6769
6870
"""
6971
broker_username = kwargs.get('broker_username', None)
@@ -81,6 +83,7 @@ def verify_with_broker(self, **kwargs):
8183

8284
success, logs = VerifyWrapper().call_verify(provider=self.provider,
8385
provider_base_url=self.provider_base_url,
86+
enable_pending=enable_pending,
8487
**options)
8588
return success, logs
8689

@@ -91,7 +94,6 @@ def extract_params(self, **kwargs):
9194
provider_app_version = kwargs.get('provider_app_version', None)
9295
headers = kwargs.get('headers', [])
9396
timeout = kwargs.get('timeout', None)
94-
verbose = kwargs.get('verbose', None)
9597
consumer_tags = kwargs.get('consumer_tags', [])
9698
provider_tags = kwargs.get('provider_tags', [])
9799
states_setup_url = kwargs.get('provider_states_setup_url', None)
@@ -104,12 +106,11 @@ def extract_params(self, **kwargs):
104106
'provider_app_version': provider_app_version,
105107
'custom_provider_header': list(headers),
106108
'timeout': timeout,
107-
'verbose': verbose,
108109
'consumer_tags': list(consumer_tags),
109110
'provider_tags': list(provider_tags),
110111
'provider_states_setup_url': states_setup_url,
111112
'verbose': verbose,
112-
'publish_version': publish_version
113+
'publish_version': publish_version,
113114
}
114115
return self.filter_empty_options(**options)
115116

pact/verify_wrapper.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,9 @@ def _broker_present(self, **kwargs):
133133

134134
return True
135135

136-
def call_verify(self, *pacts, provider_base_url, provider, **kwargs):
136+
def call_verify(
137+
self, *pacts, provider_base_url, provider, enable_pending=False, **kwargs
138+
):
137139
"""Call verify method."""
138140
verbose = kwargs.get('verbose', False)
139141

@@ -169,6 +171,8 @@ def call_verify(self, *pacts, provider_base_url, provider, **kwargs):
169171

170172
if(kwargs.get('verbose', False) is True):
171173
command.extend(['--verbose'])
174+
if enable_pending:
175+
command.append('--enable-pending')
172176

173177
headers = kwargs.get('custom_provider_headers', [])
174178
for header in headers:

requirements_dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ configparser==3.5.0
44
codecov==2.0.5
55
coverage==4.3.4
66
flake8==3.8.3
7-
mock==2.0.0
7+
mock==3.0.5
88
nose==1.3.7
99
psutil==5.7.0
1010
pycodestyle==2.6.0

tests/cli/test_verify.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ def test_successful_verification(self, mock_isfile, mock_wrapper):
110110
provider='provider',
111111
provider_base_url='http://localhost',
112112
timeout=30,
113-
verbose=True)
113+
verbose=True,
114+
enable_pending=False)
114115

115116
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
116117
@patch("pact.verify_wrapper.isfile", return_value=True)
@@ -137,7 +138,9 @@ def test_pact_url_param_supported(self, mock_isfile, mock_wrapper):
137138
provider='provider',
138139
provider_base_url='http://localhost',
139140
timeout=30,
140-
verbose=False)
141+
verbose=False,
142+
enable_pending=False,
143+
)
141144
self.assertEqual(result.exit_code, 0)
142145

143146
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
@@ -157,7 +160,8 @@ def test_pact_urls_param_supported(self, mock_isfile, mock_wrapper):
157160
provider='provider',
158161
provider_base_url='http://localhost',
159162
timeout=30,
160-
verbose=False)
163+
verbose=False,
164+
enable_pending=False)
161165
self.assertEqual(result.exit_code, 0)
162166

163167
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
@@ -181,7 +185,8 @@ def test_failed_verification(self, mock_isfile, mock_wrapper):
181185
provider='provider',
182186
provider_base_url='http://localhost',
183187
timeout=30,
184-
verbose=False)
188+
verbose=False,
189+
enable_pending=False)
185190

186191
@patch.dict(os.environ, {'PACT_BROKER_PASSWORD': 'pwd',
187192
'PACT_BROKER_USERNAME': 'broker_user',
@@ -202,7 +207,8 @@ def test_broker_creds_from_env_var(self, mock_isfile, mock_wrapper):
202207
broker_username='broker_user',
203208
broker_url='http://broker/',
204209
timeout=30,
205-
verbose=False)
210+
verbose=False,
211+
enable_pending=False)
206212

207213
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
208214
@patch("pact.verify_wrapper.isfile", return_value=True)
@@ -228,7 +234,8 @@ def test_all_url_options(self, mock_isfile, mock_wrapper):
228234
'--log-dir=tmp/logs/pact.test.log',
229235
'--log-level=INFO',
230236
'--timeout=60',
231-
'--verbose'
237+
'--verbose',
238+
'--enable-pending',
232239
])
233240
self.assertEqual(result.exit_code, 0, result.output)
234241

@@ -250,7 +257,8 @@ def test_all_url_options(self, mock_isfile, mock_wrapper):
250257
log_dir='tmp/logs/pact.test.log',
251258
log_level='INFO',
252259
timeout=60,
253-
verbose=True)
260+
verbose=True,
261+
enable_pending=True)
254262

255263
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
256264
def test_all_broker_options(self, mock_wrapper):
@@ -273,7 +281,8 @@ def test_all_broker_options(self, mock_wrapper):
273281
'--provider-app-version=1.2.3',
274282
'--timeout=60',
275283
'--publish-verification-results',
276-
'--verbose'
284+
'--verbose',
285+
'--enable-pending'
277286
])
278287

279288
self.assertEqual(result.exit_code, 0, result.output)
@@ -293,7 +302,8 @@ def test_all_broker_options(self, mock_wrapper):
293302
# custom_provider_header=['Authorization: Basic cGFj', 'CustomHeader: somevalue'],
294303
provider_states_setup_url='http://localhost/provider-states/set',
295304
timeout=60,
296-
verbose=True)
305+
verbose=True,
306+
enable_pending=True)
297307

298308
@patch("pact.verify_wrapper.isfile", return_value=True)
299309
def test_publishing_missing_version(self, mock_isfile):

tests/test_verifier.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ def test_verifier_with_provider_and_files(self, mock_path_exists, mock_wrapper):
3636
provider='test_provider',
3737
provider_base_url='http://localhost:8888',
3838
log_level='INFO',
39-
verbose=False)
39+
verbose=False,
40+
enable_pending=False)
4041

4142
def test_validate_on_publish_results(self):
4243
self.assertRaises(Exception, self.verifier.verify_pacts, 'path/to/pact1', publish=True)
@@ -54,7 +55,8 @@ def test_publish_on_success(self, mock_path_exists, mock_wrapper):
5455
provider_base_url='http://localhost:8888',
5556
log_level='INFO',
5657
verbose=False,
57-
publish_version='1.0.0')
58+
publish_version='1.0.0',
59+
enable_pending=False)
5860

5961
@patch('pact.verifier.path_exists', return_value=False)
6062
def test_raises_error_on_missing_pact_files(self, mock_path_exists):
@@ -73,6 +75,17 @@ def test_expand_directories_called_for_pacts(self, mock_path_exists, mock_expand
7375

7476
mock_expand_dir.assert_called_once()
7577

78+
@patch('pact.verify_wrapper.VerifyWrapper.call_verify', return_value=(0, None))
79+
def test_passes_enable_pending_flag_value(self, mock_wrapper):
80+
for value in (True, False):
81+
with self.subTest(value=value):
82+
with patch('pact.verifier.path_exists'):
83+
self.verifier.verify_pacts('any.json', enable_pending=value)
84+
self.assertTrue(
85+
('enable_pending', value) in mock_wrapper.call_args.kwargs.items(),
86+
mock_wrapper.call_args.kwargs,
87+
)
88+
7689

7790
class VerifierBrokerTestCase(TestCase):
7891

@@ -111,7 +124,8 @@ def test_verifier_with_broker(self, mock_wrapper):
111124
broker_token='token',
112125
broker_url=self.broker_url,
113126
log_level='INFO',
114-
verbose=False)
127+
verbose=False,
128+
enable_pending=False)
115129

116130
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
117131
@patch('pact.verifier.path_exists', return_value=True)
@@ -129,4 +143,16 @@ def test_publish_on_success(self, mock_path_exists, mock_wrapper):
129143
broker_url=self.broker_url,
130144
log_level='INFO',
131145
verbose=False,
132-
publish_version='1.0.0')
146+
publish_version='1.0.0',
147+
enable_pending=False)
148+
149+
@patch('pact.verify_wrapper.VerifyWrapper.call_verify', return_value=(0, None))
150+
def test_passes_enable_pending_flag_value(self, mock_wrapper):
151+
for value in (True, False):
152+
with self.subTest(value=value):
153+
with patch('pact.verifier.path_exists'):
154+
self.verifier.verify_with_broker(enable_pending=value)
155+
self.assertTrue(
156+
('enable_pending', value) in mock_wrapper.call_args.kwargs.items(),
157+
mock_wrapper.call_args.kwargs,
158+
)

tests/test_verify_wrapper.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ def test_all_url_options(self, mock_isfile):
108108
log_dir='tmp/logs/pact.test.log',
109109
log_level='INFO',
110110
timeout=60,
111-
verbose=True)
111+
verbose=True,
112+
enable_pending=True)
112113

113114
self.assertEqual(result, 0)
114115
self.mock_Popen.return_value.wait.assert_called_once_with()
@@ -125,7 +126,9 @@ def test_all_url_options(self, mock_isfile):
125126
'--provider-app-version', '1.2.3',
126127
'--log-dir=tmp/logs/pact.test.log',
127128
'--log-level=INFO',
128-
'--verbose')
129+
'--verbose',
130+
'--enable-pending',
131+
)
129132

130133
def test_uses_broker_if_no_pacts_and_provider_required(self):
131134
self.mock_Popen.return_value.returncode = 0

0 commit comments

Comments
 (0)