Skip to content

Commit 4430681

Browse files
Merge pull request #183 from thatguysimon/feat/verifier-class-consumer-version-selectors
feat(verifier): Allow setting consumer_version_selectors on Verifier
2 parents 482407d + 683a931 commit 4430681

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

pact/verifier.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
"""Classes and methods to verify Contracts."""
2+
import json
3+
24
from pact.verify_wrapper import VerifyWrapper, path_exists, expand_directories
35

46
class Verifier(object):
@@ -103,6 +105,9 @@ def extract_params(self, **kwargs):
103105
verbose = kwargs.get('verbose', False)
104106
publish_version = kwargs.get('publish_version', None)
105107

108+
raw_consumer_selectors = kwargs.get('consumer_version_selectors', [])
109+
consumer_selectors = self._build_consumer_selectors(raw_consumer_selectors)
110+
106111
options = {
107112
'log_dir': log_dir,
108113
'log_level': log_level,
@@ -114,9 +119,19 @@ def extract_params(self, **kwargs):
114119
'provider_states_setup_url': states_setup_url,
115120
'verbose': verbose,
116121
'publish_version': publish_version,
122+
'consumer_selectors': consumer_selectors
117123
}
118124
return self.filter_empty_options(**options)
119125

126+
def _build_consumer_selectors(self, consumer_selectors):
127+
"""
128+
Build the consumer_selectors list.
129+
130+
Turn each dict in the consumer_selectors list into a string with a
131+
json object, as expected by VerifyWrapper.
132+
"""
133+
return [json.dumps(selector) for selector in consumer_selectors]
134+
120135
def filter_empty_options(self, **kwargs):
121136
"""Filter out empty options."""
122137
kwargs = dict(filter(lambda item: item[1] is not None, kwargs.items()))

tests/test_verifier.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from collections import OrderedDict
2+
13
from unittest import TestCase
24
import unittest
35
from mock import patch
@@ -42,6 +44,35 @@ def test_verifier_with_provider_and_files(self, mock_path_exists, mock_wrapper):
4244
enable_pending=False,
4345
include_wip_pacts_since=None)
4446

47+
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
48+
@patch('pact.verifier.path_exists', return_value=True)
49+
def test_verifier_with_provider_and_files_passes_consumer_selctors(self, mock_path_exists, mock_wrapper):
50+
mock_wrapper.return_value = (True, 'some logs')
51+
52+
output, _ = self.verifier.verify_pacts(
53+
'path/to/pact1',
54+
'path/to/pact2',
55+
headers=['header1', 'header2'],
56+
consumer_version_selectors=[
57+
# Using OrderedDict for the sake of testing
58+
OrderedDict([("tag", "main"), ("latest", True)]),
59+
OrderedDict([("tag", "test"), ("latest", False)]),
60+
]
61+
)
62+
63+
assertVerifyCalled(mock_wrapper,
64+
'path/to/pact1',
65+
'path/to/pact2',
66+
provider='test_provider',
67+
custom_provider_headers=['header1', 'header2'],
68+
provider_base_url='http://localhost:8888',
69+
log_level='INFO',
70+
verbose=False,
71+
enable_pending=False,
72+
include_wip_pacts_since=None,
73+
consumer_selectors=['{"tag": "main", "latest": true}',
74+
'{"tag": "test", "latest": false}'])
75+
4576
def test_validate_on_publish_results(self):
4677
self.assertRaises(Exception, self.verifier.verify_pacts, 'path/to/pact1', publish=True)
4778

@@ -140,6 +171,35 @@ def test_verifier_with_broker(self, mock_wrapper):
140171
enable_pending=False,
141172
include_wip_pacts_since=None)
142173

174+
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
175+
def test_verifier_with_broker_passes_consumer_selctors(self, mock_wrapper):
176+
177+
mock_wrapper.return_value = (True, 'some value')
178+
179+
output, _ = self.verifier.verify_with_broker(
180+
consumer_version_selectors=[
181+
# Using OrderedDict for the sake of testing
182+
OrderedDict([("tag", "main"), ("latest", True)]),
183+
OrderedDict([("tag", "test"), ("latest", False)]),
184+
],
185+
**self.default_opts
186+
)
187+
188+
self.assertTrue(output)
189+
assertVerifyCalled(mock_wrapper,
190+
provider='test_provider',
191+
provider_base_url='http://localhost:8888',
192+
broker_password=self.broker_password,
193+
broker_username=self.broker_username,
194+
broker_token='token',
195+
broker_url=self.broker_url,
196+
log_level='INFO',
197+
verbose=False,
198+
enable_pending=False,
199+
include_wip_pacts_since=None,
200+
consumer_selectors=['{"tag": "main", "latest": true}',
201+
'{"tag": "test", "latest": false}'])
202+
143203
@patch("pact.verify_wrapper.VerifyWrapper.call_verify")
144204
@patch('pact.verifier.path_exists', return_value=True)
145205
def test_publish_on_success(self, mock_path_exists, mock_wrapper):

0 commit comments

Comments
 (0)