Пример #1
0
    def validate(self, attrs):
        with ErrorCollection(inner=True) as errors:
            for api_path, path_definition in attrs.items():
                path_parameter_names = set(get_parameter_names_from_path(api_path))

                if path_definition is None:
                    continue

                api_path_level_parameters = dereference_parameter_list(
                    path_definition.get('parameters', []),
                    parameter_definitions=self.context.get('parameters', {}),
                )

                path_request_methods = set(REQUEST_METHODS).intersection(
                    path_definition.keys(),
                )

                if not path_request_methods:
                    for parameter in api_path_level_parameters:
                        if parameter['name'] not in path_parameter_names:
                            errors[api_path].append(
                                MESSAGES["path"]["missing_parameter"].format(
                                    parameter['name'], api_path,
                                ),
                            )

                for method, operation_definition in path_definition.items():
                    if method not in REQUEST_METHODS:
                        continue
                    if operation_definition is None:
                        operation_definition = {}
                    operation_level_parameters = dereference_parameter_list(
                        operation_definition.get('parameters', []),
                        parameter_definitions=self.context.get('parameters', {}),
                    )
                    parameters_in_path = filter_parameters(
                        merge_parameter_lists(
                            api_path_level_parameters,
                            operation_level_parameters,
                        ),
                        in_=PATH,
                    )

                    for parameter in parameters_in_path:
                        if parameter['name'] not in path_parameter_names:
                            key = "{method}:{api_path}".format(
                                method=method.upper(),
                                api_path=api_path,
                            )
                            errors[key].append(
                                MESSAGES["path"]["missing_parameter"].format(
                                    parameter['name'], api_path,
                                ),
                            )

        return super(PathsSerializer, self).validate(attrs)
Пример #2
0
def test_getting_names_from_parametrized_path():
    path = "/get/{username}/also/{with_underscores}/and/{id}"
    names = get_parameter_names_from_path(path)
    assert len(names) == 3
    assert ("username", "with_underscores", "id") == names
Пример #3
0
def test_non_parametrized_path_returns_empty():
    path = "/get/with/no-parameters"
    names = get_parameter_names_from_path(path)
    assert len(names) == 0
Пример #4
0
def test_getting_names_from_parametrized_path():
    path = "/get/{username}/also/{with_underscores}/and/{id}"
    names = get_parameter_names_from_path(path)
    assert len(names) == 3
    assert ("username", "with_underscores", "id") == names
Пример #5
0
def test_non_parametrized_path_returns_empty():
    path = "/get/with/no-parameters"
    names = get_parameter_names_from_path(path)
    assert len(names) == 0