File: validate_rich_spec_test.py

package info (click to toggle)
swagger-spec-validator 3.0.4-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 696 kB
  • sloc: python: 2,321; makefile: 28; sh: 2
file content (87 lines) | stat: -rw-r--r-- 3,268 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import json

import pytest

from swagger_spec_validator.common import SwaggerValidationError
from swagger_spec_validator.validator20 import validate_spec


@pytest.fixture
def swagger_spec(petstore_contents):
    return json.loads(petstore_contents)


def test_failure_on_duplicate_api_parameters(swagger_spec):
    param1 = {"name": "foo", "in": "query", "type": "string"}
    param2 = {"name": "foo", "in": "query", "type": "integer"}
    swagger_spec["paths"]["/pet"]["parameters"] = [param1, param2]
    with pytest.raises(SwaggerValidationError) as exc_info:
        validate_spec(swagger_spec)
    assert "Duplicate param found with (name, in): {}".format(("foo", "query")) in str(
        exc_info.value
    )


def test_failure_on_duplicate_operation_parameters(swagger_spec):
    param1 = {"name": "foo", "in": "query", "type": "string"}
    param2 = {"name": "foo", "in": "query", "type": "integer"}
    swagger_spec["paths"]["/pet"]["post"]["parameters"].extend([param1, param2])
    with pytest.raises(SwaggerValidationError) as exc_info:
        validate_spec(swagger_spec)
    assert "Duplicate param found with (name, in): {}".format(("foo", "query")) in str(
        exc_info.value
    )


def test_failure_on_unresolvable_path_parameter(swagger_spec):
    swagger_spec["paths"]["/pet/{petId}"]["get"]["parameters"] = []

    with pytest.raises(SwaggerValidationError) as exc_info:
        validate_spec(swagger_spec)
    assert "Path parameter 'petId' used is not documented on '/pet/{petId}'" in str(
        exc_info.value
    )


def test_failure_on_path_parameter_used_but_not_defined(swagger_spec):
    swagger_spec["paths"]["/user/{username}"]["get"]["parameters"][0]["name"] = "_"
    with pytest.raises(SwaggerValidationError) as exc_info:
        validate_spec(swagger_spec)
    assert (
        "Path parameter 'username' used is not documented on '/user/{username}'"
        in str(exc_info.value)
    )


def test_failure_on_unresolvable_ref_of_props_required_list(swagger_spec):
    swagger_spec["definitions"]["Pet"]["required"].append("bla")
    with pytest.raises(
        SwaggerValidationError,
        match=r".*In definition of .*, required list has properties not defined: .*",
    ) as exc_info:
        validate_spec(swagger_spec)
    assert str(["bla"]) in str(exc_info.value)


def test_failure_on_unresolvable_model_reference_from_model(swagger_spec):
    swagger_spec["definitions"]["Pet"]["properties"]["category"]["$ref"] = "_"
    with pytest.raises(SwaggerValidationError):
        validate_spec(swagger_spec)


def test_failure_on_unresolvable_model_reference_from_param(swagger_spec):
    param = swagger_spec["paths"]["/pet"]["post"]["parameters"][0]
    param["schema"]["$ref"] = "#/definitions/bla"
    with pytest.raises(SwaggerValidationError):
        validate_spec(swagger_spec)


def test_failure_on_unresolvable_model_reference_from_resp(swagger_spec):
    resp = swagger_spec["paths"]["/pet/findByStatus"]["get"]["responses"]
    resp["200"]["schema"]["items"]["$ref"] = "#/definitions/bla"
    with pytest.raises(SwaggerValidationError):
        validate_spec(swagger_spec)


# TODO: Add warning validations for unused models, path parameter & responses
# TODO: Add validations for cyclic model definitions