def test_response_with_headers(): r = PactResponse(headers=[{'spam': 'eggs'}]) s = MockServer(port=1234, mock_response=r) s.start() response = requests.get('http://localhost:1234/') s.shutdown() stored_request = s.report()[0] custom_header = False for h in response.headers: if 'spam' in h: custom_header = True assert custom_header is True
def test_different_status(): data = load_acceptance_test(__file__) response = PactResponse(status=400) interaction = {'response': {'status': data['expected']['status']}} test_result = match(interaction, response).value assert test_result == { 'status': FAILED, 'message': data['comment'], 'expected': data['expected']['status'], 'actual': 400 }
def test_different_values(): data = load_acceptance_test(__file__) response = PactResponse(body=[{ 'favouriteColor': 'red', 'favouriteNumber': 2 }, { 'favouriteColor': 'blue', 'favouriteNumber': 2 }]) interaction = {'response': {'body': data['expected']['body']}} test_result = match(interaction, response) assert type(test_result) is Left
def test_matches(): data = load_acceptance_test(__file__) response = PactResponse(body={ 'alligator': { 'feet': 4, 'name': 'Mary', 'favouriteColours': [ 'red', 'blue' ] } }) interaction = {'response': {'body': data['expected']['body']}} test_result = match(interaction, response) assert type(test_result) is Right
def execute_interaction_request(url, port, interaction): url = _build_url(url, port, interaction) method = interaction[REQUEST].get('method', 'GET') body = interaction[REQUEST].get('body', {}) headers = interaction[REQUEST].get('headers', {}) server_response = _server_response(method, url=url, body=body, headers=headers) if type(server_response) is Right: headers = _parse_headers(server_response.value) content_type = _get_content_type(headers) out = Right(PactResponse( status=server_response.value.status_code, headers=headers, body=_parse_body(server_response.value, content_type) )) return out return server_response
def test_nested_objects(): data = load_acceptance_test(__file__) response = PactResponse(body={ 'object1': { 'object2': { 'object4': { 'object5': { 'name': 'Mary', 'friends': ['Fred', 'John'], 'gender': 'F' }, 'object6': { 'phoneNumber': 1234567890 } } }, 'color': 'red' } }) interaction = {'response': {'body': data['expected']['body']}} test_result = match(interaction, response) assert type(test_result) is Right
def build_proxy(mock_response=PactResponse()): class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): SimpleHTTPServer.SimpleHTTPRequestHandler.__init__( self, *args, **kwargs) self.mock_response = mock_response def do_GET(self): data = self.read_request_data(self) self.handle_request('GET', data) def do_POST(self): data = self.read_request_data(self) self.handle_request('POST', data) def do_PUT(self): data = self.read_request_data(self) self.handle_request('PUT', data) def do_DELETE(self): data = self.read_request_data(self) self.handle_request('DELETE', data) @staticmethod def read_request_data(other_self): header_value = other_self.headers.get('Content-Length') data_length = int( header_value) if header_value is not None else None return other_self.rfile.read( data_length) if data_length is not None else None def format_request(self, http_method, data): path_and_query = self.path.split('?') path = path_and_query[0] query = '?' + path_and_query[1] if len(path_and_query) == 2 else '' return { 'method': http_method, 'path': path, 'query': query, 'body': json.loads(data.decode('utf-8')) if data is not None else data, 'headers': list( dict([(key, value)]) for key, value in self.headers.items()) } def handle_request(self, http_method, data): info = self.format_request(http_method, data) ARCHIVE.append(info) self.respond() def respond(self): self.send_response(int(mock_response.status)) for header in mock_response.headers: for key, value in header.items(): self.send_header(key, value) self.end_headers() self.wfile.write( str(mock_response.body).replace("'", '"').encode()) return Proxy
def test_default_headers(): r = PactResponse() assert r.headers == []
def test_custom_status(): r = PactResponse(status=200) assert r.status == 200 r.status = 201 assert r.status == 201
def test_default_body(): r = PactResponse() assert r.body is None
def test_default_status(): r = PactResponse() assert r.status == 500
def build_expected_response(decorated_method): return PactResponse( body=decorated_method.will_respond_with.get('body'), status=decorated_method.will_respond_with.get('status'), headers=decorated_method.will_respond_with.get('headers'))