def test_200_for_good_validated_array_response():
    request = EnhancedDummyRequest(
        method='GET',
        path='/sample_array_response',
    )
    response = Response(
        body=simplejson.dumps([{
            "enum_value": "good_enum_value"
        }]),
        headers={'Content-Type': 'application/json; charset=UTF-8'},
    )

    _validate_against_tween(request,
                            response=response,
                            path_pattern='/sample_array_response')
def test_200_when_response_is_void_with_empty_response():
    request = EnhancedDummyRequest(
        method='GET',
        path='/sample/nonstring/{int_arg}/{float_arg}/{boolean_arg}',
        params={'required_arg': 'test'},
        matchdict={
            'int_arg': '1',
            'float_arg': '2.0',
            'boolean_arg': 'true'
        },
    )
    response = Response(body='{}')
    _validate_against_tween(
        request,
        response=response,
        path_pattern='/sample/nonstring/{int_arg}/{float_arg}/{boolean_arg}')
def test_response_validation_enabled_by_default():
    request = EnhancedDummyRequest(
        method='GET',
        path='/sample/path_arg1/resource',
        params={'required_arg': 'test'},
        matchdict={'path_arg': 'path_arg1'},
    )
    # Omit the logging_info key from the response. If response validation
    # occurs, we'll fail it.
    response = Response(
        body=simplejson.dumps({'raw_response': 'foo'}),
        headers={'Content-Type': 'application/json; charset=UTF-8'},
    )
    with pytest.raises(ResponseValidationError):
        _validate_against_tween(request,
                                response=response,
                                path_pattern='/sample/{path_arg}/resource')
def test_500_for_bad_validated_array_response():
    request = EnhancedDummyRequest(
        method='GET',
        path='/sample_array_response',
    )
    response = Response(
        body=simplejson.dumps([{
            "enum_value": "bad_enum_value"
        }]),
        headers={'Content-Type': 'application/json; charset=UTF-8'},
    )
    with pytest.raises(ResponseValidationError) as excinfo:
        _validate_against_tween(request,
                                response=response,
                                path_pattern='/sample_array_response')

    assert "'bad_enum_value' is not one of " in \
           str(excinfo.value)
def test_response_validation_context():
    request = EnhancedDummyRequest(
        method='GET',
        path='/sample/path_arg1/resource',
        params={'required_arg': 'test'},
        matchdict={'path_arg': 'path_arg1'},
    )
    # Omit the logging_info key from the response.
    response = Response(
        body=simplejson.dumps({'raw_response': 'foo'}),
        headers={'Content-Type': 'application/json; charset=UTF-8'},
    )

    with pytest.raises(CustomResponseValidationException):
        _validate_against_tween(
            request,
            response=response,
            path_pattern='/sample/{path_arg}/resource',
            **{'pyramid_swagger.validation_context_path': validation_ctx_path})
def test_200_when_response_is_void_with_none_response():
    request = EnhancedDummyRequest(
        method='GET',
        path='/sample/nonstring/{int_arg}/{float_arg}/{boolean_arg}',
        params={'required_arg': 'test'},
        matchdict={
            'int_arg': '1',
            'float_arg': '2.0',
            'boolean_arg': 'true'
        },
    )
    response = Response(
        body=simplejson.dumps(None),
        headers={'Content-Type': 'application/json; charset=UTF-8'},
    )
    _validate_against_tween(
        request,
        response=response,
        path_pattern='/sample/nonstring/{int_arg}/{float_arg}/{boolean_arg}')
def test_500_when_response_is_missing_required_field():

    request = EnhancedDummyRequest(
        method='GET',
        path='/sample/path_arg1/resource',
        params={'required_arg': 'test'},
        matchdict={'path_arg': 'path_arg1'},
    )

    # Omit the logging_info key from the response to induce failure
    response = Response(
        body=simplejson.dumps({'raw_response': 'foo'}),
        headers={'Content-Type': 'application/json; charset=UTF-8'},
    )

    with pytest.raises(ResponseValidationError) as excinfo:
        _validate_against_tween(request,
                                response=response,
                                path_pattern='/sample/{path_arg}/resource')

    assert "'logging_info' is a required property" in str(excinfo.value)
def test_500_when_response_arg_is_wrong_type():
    request = EnhancedDummyRequest(
        method='GET',
        path='/sample/path_arg1/resource',
        params={'required_arg': 'test'},
        matchdict={'path_arg': 'path_arg1'},
    )
    response = Response(
        body=simplejson.dumps({
            'raw_response': 1.0,  # <-- is supposed to be a string
            'logging_info': {
                'foo': 'bar'
            }
        }),
        headers={'Content-Type': 'application/json; charset=UTF-8'},
    )
    with pytest.raises(ResponseValidationError) as excinfo:
        _validate_against_tween(request,
                                response=response,
                                path_pattern='/sample/{path_arg}/resource')

    assert "1.0 is not of type " in str(excinfo.value)