예제 #1
0
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
예제 #2
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
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
예제 #8
0
def test_default_headers():
    r = PactResponse()
    assert r.headers == []
예제 #9
0
def test_custom_status():
    r = PactResponse(status=200)
    assert r.status == 200

    r.status = 201
    assert r.status == 201
예제 #10
0
def test_default_body():
    r = PactResponse()
    assert r.body is None
예제 #11
0
def test_default_status():
    r = PactResponse()
    assert r.status == 500
예제 #12
0
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'))