예제 #1
0
def test_default(api):
    op_spec = make_operation(OPERATION4)
    op_spec['parameters'][1]['default'] = 1
    Swagger2Operation(api=api,
                      method='GET',
                      path='endpoint',
                      path_parameters=[],
                      operation=op_spec,
                      app_produces=['application/json'],
                      app_consumes=['application/json'],
                      app_security=[],
                      security_definitions={},
                      definitions=DEFINITIONS,
                      parameter_definitions=PARAMETER_DEFINITIONS,
                      resolver=Resolver())
    op_spec = make_operation(OPERATION6, parameters=False)
    op_spec['parameters'][0]['default'] = {
        'keep_stacks': 1,
        'image_version': 'one',
        'senza_yaml': 'senza.yaml',
        'new_traffic': 100
    }
    Swagger2Operation(api=api,
                      method='POST',
                      path='endpoint',
                      path_parameters=[],
                      operation=op_spec,
                      app_produces=['application/json'],
                      app_consumes=['application/json'],
                      app_security=[],
                      security_definitions={},
                      definitions=DEFINITIONS,
                      parameter_definitions={},
                      resolver=Resolver())
예제 #2
0
def test_multiple_oauth_in_and(api, caplog):
    """Tests an operation with multiple oauth security schemes in AND fashion.
    These should be ignored and raise a warning.
    """
    caplog.set_level(logging.WARNING, logger="connexion.operations.secure")
    verify_oauth = mock.MagicMock(return_value='verify_oauth_result')
    api.security_handler_factory.verify_oauth = verify_oauth

    op_spec = make_operation(OPERATION10)
    operation = Swagger2Operation(
        api=api,
        method='GET',
        path='endpoint',
        path_parameters=[],
        operation=op_spec,
        app_produces=['application/json'],
        app_consumes=['application/json'],
        app_security=SECURITY_DEFINITIONS_2_OAUTH,
        security_definitions=SECURITY_DEFINITIONS_2_OAUTH,
        definitions=DEFINITIONS,
        parameter_definitions=PARAMETER_DEFINITIONS,
        resolver=Resolver())
    assert isinstance(operation.function, types.FunctionType)

    security_decorator = operation.security_decorator
    assert len(security_decorator.args[0]) == 0
    assert security_decorator.args[0] == []
    assert security_decorator.args[1] == ['uid']

    assert '... multiple OAuth2 security schemes in AND fashion not supported' in caplog.text

    assert operation.method == 'GET'
    assert operation.produces == ['application/json']
    assert operation.consumes == ['application/json']
    assert operation.security == [{'oauth_1': ['uid'], 'oauth_2': ['uid']}]
예제 #3
0
def test_multi_body(api):
    with pytest.raises(
            InvalidSpecification) as exc_info:  # type: py.code.ExceptionInfo
        op_spec = make_operation(OPERATION2)
        operation = Swagger2Operation(
            api=api,
            method='GET',
            path='endpoint',
            path_parameters=[],
            operation=op_spec,
            app_produces=['application/json'],
            app_consumes=['application/json'],
            app_security=[],
            security_definitions={},
            definitions=DEFINITIONS,
            parameter_definitions=PARAMETER_DEFINITIONS,
            resolver=Resolver())
        operation.body_schema

    exception = exc_info.value
    assert str(
        exception) == "GET endpoint There can be one 'body' parameter at most"
    assert repr(
        exception
    ) == """<InvalidSpecification: "GET endpoint There can be one 'body' parameter at most">"""
예제 #4
0
def test_mock_resolver_numeric():
    resolver = MockResolver(mock_all=True)

    responses = {
        '200': {
            'examples': {
                'application/json': {
                    'foo': 'bar'
                }
            }
        }
    }

    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation={
                                      'responses': responses
                                  },
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions={},
                                  resolver=resolver)
    assert operation.operation_id == 'mock-1'

    response, status_code = resolver.mock_operation(operation)
    assert status_code == 200
    assert response == {'foo': 'bar'}
예제 #5
0
def test_mock_resolver_no_examples():
    resolver = MockResolver(mock_all=True)

    responses = {
        '418': {}
    }

    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation={
                                      'responses': responses
                                  },
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions={},
                                  resolver=resolver)
    assert operation.operation_id == 'mock-1'

    response, status_code = resolver.mock_operation(operation)
    assert status_code == 418
    assert response == 'No example response was defined.'
예제 #6
0
def test_get_path_parameter_types(api):
    op_spec = make_operation(OPERATION1, parameters=False)
    op_spec['parameters'] = [{
        'in': 'path',
        'type': 'int',
        'name': 'int_path'
    }, {
        'in': 'path',
        'type': 'string',
        'name': 'string_path'
    }, {
        'in': 'path',
        'type': 'string',
        'format': 'path',
        'name': 'path_path'
    }]

    operation = Swagger2Operation(api=api,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation=op_spec,
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  definitions=DEFINITIONS,
                                  resolver=Resolver())

    assert {
        'int_path': 'int',
        'string_path': 'string',
        'path_path': 'path'
    } == operation.get_path_parameter_types()
예제 #7
0
def test_no_token_info(api):
    op_spec = make_operation(OPERATION1)
    operation = Swagger2Operation(
        api=api,
        method='GET',
        path='endpoint',
        path_parameters=[],
        operation=op_spec,
        app_produces=['application/json'],
        app_consumes=['application/json'],
        app_security=SECURITY_DEFINITIONS_WO_INFO,
        security_definitions=SECURITY_DEFINITIONS_WO_INFO,
        definitions=DEFINITIONS,
        parameter_definitions=PARAMETER_DEFINITIONS,
        resolver=Resolver())
    assert isinstance(operation.function, types.FunctionType)

    security_decorator = operation.security_decorator
    assert security_decorator.func is verify_security
    assert len(security_decorator.args[0]) == 0

    assert operation.method == 'GET'
    assert operation.produces == ['application/json']
    assert operation.consumes == ['application/json']
    assert operation.security == [{'oauth': ['uid']}]

    expected_body_schema = {'definitions': DEFINITIONS}
    expected_body_schema.update(DEFINITIONS["new_stack"])
    assert operation.body_schema == expected_body_schema
예제 #8
0
def test_operation_local_security_duplicate_token_info(api):
    verify_oauth = mock.MagicMock(return_value='verify_oauth_result')
    api.security_handler_factory.verify_oauth = verify_oauth

    op_spec = make_operation(OPERATION8)
    operation = Swagger2Operation(
        api=api,
        method='GET',
        path='endpoint',
        path_parameters=[],
        operation=op_spec,
        app_produces=['application/json'],
        app_consumes=['application/json'],
        app_security=[],
        security_definitions=SECURITY_DEFINITIONS_BOTH,
        definitions=DEFINITIONS,
        parameter_definitions=PARAMETER_DEFINITIONS,
        resolver=Resolver())
    assert isinstance(operation.function, types.FunctionType)

    security_decorator = operation.security_decorator
    assert len(security_decorator.args[0]) == 1
    assert security_decorator.args[0][0] == 'verify_oauth_result'
    assert security_decorator.args[1] == ['uid']
    verify_oauth.call_args.assert_called_with(
        math.ceil, api.security_handler_factory.validate_scope)

    assert operation.method == 'GET'
    assert operation.produces == ['application/json']
    assert operation.consumes == ['application/json']
    assert operation.security == [{'oauth': ['uid']}]
    expected_body_schema = op_spec["parameters"][0]["schema"]
    expected_body_schema.update({'definitions': DEFINITIONS})
    assert operation.body_schema == expected_body_schema
예제 #9
0
def test_operation_array(api):
    op_spec = make_operation(OPERATION7)
    operation = Swagger2Operation(
        api=api,
        method='GET',
        path='endpoint',
        path_parameters=[],
        operation=op_spec,
        app_produces=['application/json'],
        app_consumes=['application/json'],
        app_security=[],
        security_definitions=SECURITY_DEFINITIONS_REMOTE,
        definitions=DEFINITIONS,
        parameter_definitions=PARAMETER_DEFINITIONS,
        resolver=Resolver())
    assert isinstance(operation.function, types.FunctionType)

    assert operation.method == 'GET'
    assert operation.produces == ['application/json']
    assert operation.consumes == ['application/json']
    assert operation.security == [{'oauth': ['uid']}]
    expected_body_schema = {
        'type': 'array',
        'items': DEFINITIONS["new_stack"],
        'definitions': DEFINITIONS
    }
    assert operation.body_schema == expected_body_schema
예제 #10
0
def test_mock_resolver_example_nested_in_object():
    resolver = MockResolver(mock_all=True)

    responses = {
        'default': {
            'schema': {
                'type': 'object',
                'properties': {
                    'foo': {
                        'type': 'string',
                        'example': 'bar'
                    }
                },
            }
        }
    }

    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation={'responses': responses},
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions={},
                                  resolver=resolver)
    assert operation.operation_id == 'mock-1'

    response, status_code = resolver.mock_operation(operation)
    assert status_code == 200
    assert response == {'foo': 'bar'}
예제 #11
0
def test_operation_local_security_oauth2(api, monkeypatch):
    dummy = object()
    verify_oauth = mock.MagicMock(return_value=dummy)
    monkeypatch.setattr('connexion.operations.secure.verify_oauth', verify_oauth)

    op_spec = make_operation(OPERATION8)
    operation = Swagger2Operation(api=api,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation=op_spec,
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions=SECURITY_DEFINITIONS_LOCAL,
                                  definitions=DEFINITIONS,
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=Resolver())
    assert isinstance(operation.function, types.FunctionType)
    security_decorator = operation.security_decorator
    assert security_decorator.func is verify_security
    assert len(security_decorator.args[0]) == 1
    assert security_decorator.args[0][0] is dummy
    assert security_decorator.args[1] == ['uid']
    call_args = verify_oauth.call_args[0]
    assert call_args[0] is math.ceil
    assert call_args[1] is validate_scope

    assert operation.method == 'GET'
    assert operation.produces == ['application/json']
    assert operation.consumes == ['application/json']
    assert operation.security == [{'oauth': ['uid']}]
    expected_body_schema = op_spec["parameters"][0]["schema"]
    expected_body_schema.update({'definitions': DEFINITIONS})
    assert operation.body_schema == expected_body_schema
예제 #12
0
def test_mock_resolver_notimplemented():
    resolver = MockResolver(mock_all=False)

    responses = {
        '418': {}
    }

    # do not mock the existent functions
    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation={
                                      'operationId': 'fakeapi.hello.get'
                                  },
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions={},
                                  resolver=resolver)
    assert operation.operation_id == 'fakeapi.hello.get'

    # mock only the nonexistent ones
    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation={
                                      'operationId': 'fakeapi.hello.nonexistent_function',
                                      'responses': responses
                                  },
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions={},
                                  resolver=resolver)

    # check if it is using the mock function
    assert operation._resolution.function() == ('No example response was defined.', 418)
예제 #13
0
def test_resty_resolve_with_default_module_name_can_resolve_api_root():
    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='/',
                                  path_parameters=[],
                                  operation={},
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=RestyResolver('fakeapi'))
    assert operation.operation_id == 'fakeapi.get'
예제 #14
0
def test_resty_resolve_with_default_module_name_lowercase_verb_nested():
    operation = Swagger2Operation(api=None,
                                  method='get',
                                  path='/hello/world/{id}',
                                  path_parameters=[],
                                  operation={},
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=RestyResolver('fakeapi'))
    assert operation.operation_id == 'fakeapi.hello.world.get'
예제 #15
0
def test_resty_resolve_x_router_controller_without_operation_id():
    operation = Swagger2Operation(
        api=None,
        method='GET',
        path='/hello/{id}',
        path_parameters=[],
        operation={'x-swagger-router-controller': 'fakeapi.hello'},
        app_produces=['application/json'],
        app_consumes=['application/json'],
        app_security=[],
        security_definitions={},
        definitions={},
        parameter_definitions=PARAMETER_DEFINITIONS,
        resolver=RestyResolver('fakeapi'))
    assert operation.operation_id == 'fakeapi.hello.get'
예제 #16
0
def test_resty_resolve_with_default_module_name_will_translate_dashes_in_resource_name(
):
    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='/foo-bar',
                                  path_parameters=[],
                                  operation={},
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=RestyResolver('fakeapi'))
    assert operation.operation_id == 'fakeapi.foo_bar.search'
예제 #17
0
def test_parameter_reference(api):
    op_spec = make_operation(OPERATION3, definitions=False)
    operation = Swagger2Operation(api=api,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation=op_spec,
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=Resolver())
    assert operation.parameters == [{'in': 'path', 'type': 'integer'}]
예제 #18
0
def test_resty_resolve_with_default_module_name_will_resolve_resource_root_as_configured(
):
    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='/hello',
                                  path_parameters=[],
                                  operation={},
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=RestyResolver(
                                      'fakeapi', 'api_list'))
    assert operation.operation_id == 'fakeapi.hello.api_list'
예제 #19
0
def test_resty_resolve_operation_id():
    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation={
                                      'operationId':
                                      'fakeapi.hello.post_greeting',
                                  },
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=RestyResolver('fakeapi'))
    assert operation.operation_id == 'fakeapi.hello.post_greeting'
예제 #20
0
def test_resty_resolve_with_default_module_name_and_x_router_controller_will_resolve_resource_root_get_as_search(
):
    operation = Swagger2Operation(api=None,
                                  method='GET',
                                  path='/hello',
                                  path_parameters=[],
                                  operation={
                                      'x-swagger-router-controller':
                                      'fakeapi.hello',
                                  },
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions={},
                                  definitions={},
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=RestyResolver('fakeapi'))
    assert operation.operation_id == 'fakeapi.hello.search'
예제 #21
0
def test_multiple_security_schemes_and(api):
    """Tests an operation with multiple security schemes in AND fashion."""
    def return_api_key_name(func, in_, name):
        return name

    verify_api_key = mock.MagicMock(side_effect=return_api_key_name)
    api.security_handler_factory.verify_api_key = verify_api_key
    verify_multiple = mock.MagicMock(return_value='verify_multiple_result')
    api.security_handler_factory.verify_multiple_schemes = verify_multiple

    op_spec = make_operation(OPERATION9)
    operation = Swagger2Operation(
        api=api,
        method='GET',
        path='endpoint',
        path_parameters=[],
        operation=op_spec,
        app_produces=['application/json'],
        app_consumes=['application/json'],
        app_security=SECURITY_DEFINITIONS_2_KEYS,
        security_definitions=SECURITY_DEFINITIONS_2_KEYS,
        definitions=DEFINITIONS,
        parameter_definitions=PARAMETER_DEFINITIONS,
        resolver=Resolver())
    assert isinstance(operation.function, types.FunctionType)
    assert verify_api_key.call_count == 2
    verify_api_key.assert_any_call(math.ceil, 'header', 'X-Auth-1')
    verify_api_key.assert_any_call(math.ceil, 'header', 'X-Auth-2')
    # Assert verify_multiple_schemes is called with mapping from scheme name
    # to result of security_handler_factory.verify_api_key()
    verify_multiple.assert_called_with({
        'key1': 'X-Auth-1',
        'key2': 'X-Auth-2'
    })

    security_decorator = operation.security_decorator
    assert len(security_decorator.args[0]) == 1
    assert security_decorator.args[0][0] == 'verify_multiple_result'
    assert security_decorator.args[1] is None

    assert operation.method == 'GET'
    assert operation.produces == ['application/json']
    assert operation.consumes == ['application/json']
    assert operation.security == [{'key1': [], 'key2': []}]
예제 #22
0
def test_operation_composed_definition(api):
    op_spec = make_operation(OPERATION8)
    operation = Swagger2Operation(api=api,
                                  method='GET',
                                  path='endpoint',
                                  path_parameters=[],
                                  operation=op_spec,
                                  app_produces=['application/json'],
                                  app_consumes=['application/json'],
                                  app_security=[],
                                  security_definitions=SECURITY_DEFINITIONS_REMOTE,
                                  definitions=DEFINITIONS,
                                  parameter_definitions=PARAMETER_DEFINITIONS,
                                  resolver=Resolver())
    assert isinstance(operation.function, types.FunctionType)

    assert operation.method == 'GET'
    assert operation.produces == ['application/json']
    assert operation.consumes == ['application/json']
    assert operation.security == [{'oauth': ['uid']}]
    expected_body_schema = op_spec["parameters"][0]["schema"]
    expected_body_schema.update({'definitions': DEFINITIONS})
    assert operation.body_schema == expected_body_schema