Skip to content

Commit 4c68fd4

Browse files
Merge pull request #182 from thatguysimon/feat/enable-wip-pacts
feat(verifier): Support work-in-progress pacts attribute in CLI
2 parents a0eca4c + 9ea14d3 commit 4c68fd4

File tree

6 files changed

+65
-19
lines changed

6 files changed

+65
-19
lines changed

pact/cli/verify.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,16 @@
116116
help='Allow pacts which are in pending state to be verified without causing the '
117117
'overall task to fail. For more information, see https://pact.io/pending',
118118
is_flag=True)
119+
@click.option(
120+
'include_wip_pacts_since', '--include-wip-pacts-since',
121+
default=None,
122+
help='Automatically include the pending pacts in the verification step. '
123+
'For more information, see https://docs.pact.io/pact_broker/advanced_topics/wip_pacts/',)
119124
def main(pacts, base_url, pact_url, pact_urls, states_url, states_setup_url,
120125
username, broker_base_url, consumer_version_tag, consumer_version_selector,
121126
provider_version_tag, password, token, provider, headers, timeout,
122127
provider_app_version, publish_verification_results, verbose, log_dir,
123-
log_level, enable_pending):
128+
log_level, enable_pending, include_wip_pacts_since):
124129
"""
125130
Verify one or more contracts against a provider service.
126131
@@ -186,6 +191,7 @@ def main(pacts, base_url, pact_url, pact_urls, states_url, states_setup_url,
186191
provider=provider,
187192
provider_base_url=base_url,
188193
enable_pending=enable_pending,
194+
include_wip_pacts_since=include_wip_pacts_since,
189195
**options)
190196
sys.exit(success)
191197

pact/verifier.py

Lines changed: 5 additions & 2 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, enable_pending=False, **kwargs):
33+
def verify_pacts(self, *pacts, enable_pending=False, include_wip_pacts_since=None, **kwargs):
3434
"""Verify our pacts from the provider.
3535
3636
Returns:
@@ -54,18 +54,20 @@ def verify_pacts(self, *pacts, enable_pending=False, **kwargs):
5454
provider=self.provider,
5555
provider_base_url=self.provider_base_url,
5656
enable_pending=enable_pending,
57+
include_wip_pacts_since=include_wip_pacts_since,
5758
**options)
5859

5960
return success, logs
6061

61-
def verify_with_broker(self, enable_pending=False, **kwargs):
62+
def verify_with_broker(self, enable_pending=False, include_wip_pacts_since=None, **kwargs):
6263
"""Use Broker to verify.
6364
6465
Args:
6566
broker_username ([String]): broker username
6667
broker_password ([String]): broker password
6768
broker_url ([String]): url of broker
6869
enable_pending ([Boolean])
70+
include_wip_pacts_since ([String])
6971
7072
"""
7173
broker_username = kwargs.get('broker_username', None)
@@ -84,6 +86,7 @@ def verify_with_broker(self, enable_pending=False, **kwargs):
8486
success, logs = VerifyWrapper().call_verify(provider=self.provider,
8587
provider_base_url=self.provider_base_url,
8688
enable_pending=enable_pending,
89+
include_wip_pacts_since=include_wip_pacts_since,
8790
**options)
8891
return success, logs
8992

pact/verify_wrapper.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,18 @@ def _broker_present(self, **kwargs):
129129
return False
130130
return True
131131

132+
def _validate_input(self, pacts, **kwargs):
133+
if len(pacts) == 0 and not self._broker_present(**kwargs):
134+
raise PactException('Pact urls or Pact broker required')
135+
132136
def call_verify(
133-
self, *pacts, provider_base_url, provider, enable_pending=False, **kwargs
137+
self, *pacts, provider_base_url, provider, enable_pending=False,
138+
include_wip_pacts_since=None, **kwargs
134139
):
135140
"""Call verify method."""
136141
verbose = kwargs.get('verbose', False)
137142

138-
if(len(pacts) == 0 and not self._broker_present(**kwargs)):
139-
raise PactException('Pact urls or Pact broker required')
143+
self._validate_input(pacts, **kwargs)
140144

141145
provider_app_version = kwargs.get('provider_app_version')
142146
options = {
@@ -170,6 +174,9 @@ def call_verify(
170174
if enable_pending:
171175
command.append('--enable-pending')
172176

177+
if include_wip_pacts_since:
178+
command.extend(['--include-wip-pacts-since={}'.format(include_wip_pacts_since)])
179+
173180
headers = kwargs.get('custom_provider_headers', [])
174181
for header in headers:
175182
command.extend(['{}={}'.format('--custom-provider-header', header)])

tests/cli/test_verify.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ def test_successful_verification(self, mock_isfile, mock_wrapper):
111111
provider_base_url='http://localhost',
112112
timeout=30,
113113
verbose=True,
114-
enable_pending=False)
114+
enable_pending=False,
115+
include_wip_pacts_since=None)
115116

116117
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
117118
@patch("pact.verify_wrapper.isfile", return_value=True)
@@ -140,7 +141,7 @@ def test_pact_url_param_supported(self, mock_isfile, mock_wrapper):
140141
timeout=30,
141142
verbose=False,
142143
enable_pending=False,
143-
)
144+
include_wip_pacts_since=None)
144145
self.assertEqual(result.exit_code, 0)
145146

146147
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
@@ -161,7 +162,8 @@ def test_pact_urls_param_supported(self, mock_isfile, mock_wrapper):
161162
provider_base_url='http://localhost',
162163
timeout=30,
163164
verbose=False,
164-
enable_pending=False)
165+
enable_pending=False,
166+
include_wip_pacts_since=None)
165167
self.assertEqual(result.exit_code, 0)
166168

167169
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
@@ -186,7 +188,8 @@ def test_failed_verification(self, mock_isfile, mock_wrapper):
186188
provider_base_url='http://localhost',
187189
timeout=30,
188190
verbose=False,
189-
enable_pending=False)
191+
enable_pending=False,
192+
include_wip_pacts_since=None)
190193

191194
@patch.dict(os.environ, {'PACT_BROKER_PASSWORD': 'pwd',
192195
'PACT_BROKER_USERNAME': 'broker_user',
@@ -208,7 +211,8 @@ def test_broker_creds_from_env_var(self, mock_isfile, mock_wrapper):
208211
broker_url='http://broker/',
209212
timeout=30,
210213
verbose=False,
211-
enable_pending=False)
214+
enable_pending=False,
215+
include_wip_pacts_since=None)
212216

213217
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
214218
@patch("pact.verify_wrapper.isfile", return_value=True)
@@ -258,7 +262,8 @@ def test_all_url_options(self, mock_isfile, mock_wrapper):
258262
log_level='INFO',
259263
timeout=60,
260264
verbose=True,
261-
enable_pending=True)
265+
enable_pending=True,
266+
include_wip_pacts_since=None)
262267

263268
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
264269
def test_all_broker_options(self, mock_wrapper):
@@ -282,7 +287,8 @@ def test_all_broker_options(self, mock_wrapper):
282287
'--timeout=60',
283288
'--publish-verification-results',
284289
'--verbose',
285-
'--enable-pending'
290+
'--enable-pending',
291+
'--include-wip-pacts-since=2018-01-01',
286292
])
287293

288294
self.assertEqual(result.exit_code, 0, result.output)
@@ -303,7 +309,8 @@ def test_all_broker_options(self, mock_wrapper):
303309
provider_states_setup_url='http://localhost/provider-states/set',
304310
timeout=60,
305311
verbose=True,
306-
enable_pending=True)
312+
enable_pending=True,
313+
include_wip_pacts_since='2018-01-01')
307314

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

tests/test_verifier.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ def test_verifier_with_provider_and_files(self, mock_path_exists, mock_wrapper):
3939
provider_base_url='http://localhost:8888',
4040
log_level='INFO',
4141
verbose=False,
42-
enable_pending=False)
42+
enable_pending=False,
43+
include_wip_pacts_since=None)
4344

4445
def test_validate_on_publish_results(self):
4546
self.assertRaises(Exception, self.verifier.verify_pacts, 'path/to/pact1', publish=True)
@@ -58,7 +59,8 @@ def test_publish_on_success(self, mock_path_exists, mock_wrapper):
5859
log_level='INFO',
5960
verbose=False,
6061
publish_version='1.0.0',
61-
enable_pending=False)
62+
enable_pending=False,
63+
include_wip_pacts_since=None)
6264

6365
@patch('pact.verifier.path_exists', return_value=False)
6466
def test_raises_error_on_missing_pact_files(self, mock_path_exists):
@@ -88,6 +90,14 @@ def test_passes_enable_pending_flag_value(self, mock_wrapper):
8890
mock_wrapper.call_args.kwargs,
8991
)
9092

93+
@patch('pact.verify_wrapper.VerifyWrapper.call_verify', return_value=(0, None))
94+
@patch('pact.verifier.path_exists', return_value=True)
95+
def test_passes_include_wip_pacts_since_value(self, mock_path_exists, mock_wrapper):
96+
self.verifier.verify_pacts('any.json', include_wip_pacts_since='2018-01-01')
97+
self.assertTrue(
98+
('include_wip_pacts_since', '2018-01-01') in mock_wrapper.call_args.kwargs.items(),
99+
mock_wrapper.call_args.kwargs,
100+
)
91101

92102
class VerifierBrokerTestCase(TestCase):
93103

@@ -127,7 +137,8 @@ def test_verifier_with_broker(self, mock_wrapper):
127137
broker_url=self.broker_url,
128138
log_level='INFO',
129139
verbose=False,
130-
enable_pending=False)
140+
enable_pending=False,
141+
include_wip_pacts_since=None)
131142

132143
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
133144
@patch('pact.verifier.path_exists', return_value=True)
@@ -146,7 +157,8 @@ def test_publish_on_success(self, mock_path_exists, mock_wrapper):
146157
log_level='INFO',
147158
verbose=False,
148159
publish_version='1.0.0',
149-
enable_pending=False)
160+
enable_pending=False,
161+
include_wip_pacts_since=None)
150162

151163
@patch('pact.verify_wrapper.VerifyWrapper.call_verify', return_value=(0, None))
152164
def test_passes_enable_pending_flag_value(self, mock_wrapper):
@@ -158,3 +170,12 @@ def test_passes_enable_pending_flag_value(self, mock_wrapper):
158170
('enable_pending', value) in mock_wrapper.call_args.kwargs.items(),
159171
mock_wrapper.call_args.kwargs,
160172
)
173+
174+
@patch('pact.verify_wrapper.VerifyWrapper.call_verify', return_value=(0, None))
175+
@patch('pact.verifier.path_exists', return_value=True)
176+
def test_passes_include_wip_pacts_since_value(self, mock_path_exists, mock_wrapper):
177+
self.verifier.verify_with_broker(include_wip_pacts_since='2018-01-01')
178+
self.assertTrue(
179+
('include_wip_pacts_since', '2018-01-01') in mock_wrapper.call_args.kwargs.items(),
180+
mock_wrapper.call_args.kwargs,
181+
)

tests/test_verify_wrapper.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ def test_all_url_options(self, mock_isfile):
121121
log_level='INFO',
122122
timeout=60,
123123
verbose=True,
124-
enable_pending=True)
124+
enable_pending=True,
125+
include_wip_pacts_since='2018-01-01')
125126

126127
self.assertEqual(result, 0)
127128
self.mock_Popen.return_value.wait.assert_called_once_with()
@@ -140,6 +141,7 @@ def test_all_url_options(self, mock_isfile):
140141
'--log-level=INFO',
141142
'--verbose',
142143
'--enable-pending',
144+
'--include-wip-pacts-since=2018-01-01',
143145
)
144146

145147
def test_uses_broker_if_no_pacts_and_provider_required(self):

0 commit comments

Comments
 (0)