File: test_response_validators.py

package info (click to toggle)
python-openapi-core 0.19.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,008 kB
  • sloc: python: 18,868; makefile: 47
file content (156 lines) | stat: -rw-r--r-- 5,617 bytes parent folder | download
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import json

import pytest

from openapi_core import V30ResponseValidator
from openapi_core.deserializing.media_types.exceptions import (
    MediaTypeDeserializeError,
)
from openapi_core.templating.media_types.exceptions import MediaTypeNotFound
from openapi_core.templating.paths.exceptions import OperationNotFound
from openapi_core.templating.paths.exceptions import PathNotFound
from openapi_core.templating.responses.exceptions import ResponseNotFound
from openapi_core.testing import MockRequest
from openapi_core.testing import MockResponse
from openapi_core.validation.response.exceptions import DataValidationError
from openapi_core.validation.response.exceptions import InvalidData
from openapi_core.validation.response.exceptions import InvalidHeader
from openapi_core.validation.response.exceptions import MissingData
from openapi_core.validation.schemas.exceptions import InvalidSchemaValue


class TestResponseValidator:
    host_url = "http://petstore.swagger.io"

    @pytest.fixture(scope="session")
    def spec_dict(self, v30_petstore_content):
        return v30_petstore_content

    @pytest.fixture(scope="session")
    def spec(self, v30_petstore_spec):
        return v30_petstore_spec

    @pytest.fixture(scope="session")
    def response_validator(self, spec):
        return V30ResponseValidator(spec)

    def test_invalid_server(self, response_validator):
        request = MockRequest("http://petstore.invalid.net/v1", "get", "/")
        response = MockResponse(b"Not Found", status_code=404)

        with pytest.raises(PathNotFound):
            response_validator.validate(request, response)

    def test_invalid_operation(self, response_validator):
        request = MockRequest(self.host_url, "patch", "/v1/pets")
        response = MockResponse(b"Not Found", status_code=404)

        with pytest.raises(OperationNotFound):
            response_validator.validate(request, response)

    def test_invalid_response(self, response_validator):
        request = MockRequest(self.host_url, "get", "/v1/pets")
        response = MockResponse(b"Not Found", status_code=409)

        with pytest.raises(ResponseNotFound):
            response_validator.validate(request, response)

    def test_invalid_content_type(self, response_validator):
        request = MockRequest(self.host_url, "get", "/v1/pets")
        response = MockResponse(b"Not Found", content_type="text/csv")

        with pytest.raises(DataValidationError) as exc_info:
            response_validator.validate(request, response)

        assert type(exc_info.value.__cause__) == MediaTypeNotFound

    def test_missing_body(self, response_validator):
        request = MockRequest(self.host_url, "get", "/v1/pets")
        response = MockResponse(None)

        with pytest.raises(MissingData):
            response_validator.validate(request, response)

    def test_invalid_media_type(self, response_validator):
        request = MockRequest(self.host_url, "get", "/v1/pets")
        response = MockResponse(b"abcde")

        with pytest.raises(DataValidationError) as exc_info:
            response_validator.validate(request, response)

        assert exc_info.value.__cause__ == MediaTypeDeserializeError(
            mimetype="application/json", value=b"abcde"
        )

    def test_invalid_media_type_value(self, response_validator):
        request = MockRequest(self.host_url, "get", "/v1/pets")
        response = MockResponse(b"{}")

        with pytest.raises(DataValidationError) as exc_info:
            response_validator.validate(request, response)

        assert type(exc_info.value.__cause__) == InvalidSchemaValue

    def test_invalid_value(self, response_validator):
        request = MockRequest(self.host_url, "get", "/v1/tags")
        response_json = {
            "data": [
                {"id": 1, "name": "Sparky"},
            ],
        }
        response_data = json.dumps(response_json).encode()
        response = MockResponse(response_data)

        with pytest.raises(InvalidData) as exc_info:
            response_validator.validate(request, response)

        assert type(exc_info.value.__cause__) == InvalidSchemaValue

    def test_invalid_header(self, response_validator):
        request = MockRequest(
            self.host_url,
            "delete",
            "/v1/tags",
            path_pattern="/v1/tags",
        )
        response_json = {
            "data": [
                {
                    "id": 1,
                    "name": "Sparky",
                    "ears": {
                        "healthy": True,
                    },
                },
            ],
        }
        response_data = json.dumps(response_json).encode()
        headers = {
            "x-delete-confirm": "true",
            "x-delete-date": "today",
        }
        response = MockResponse(response_data, headers=headers)

        with pytest.raises(InvalidHeader):
            with pytest.warns(DeprecationWarning):
                response_validator.validate(request, response)

    def test_valid(self, response_validator):
        request = MockRequest(self.host_url, "get", "/v1/pets")
        response_json = {
            "data": [
                {
                    "id": 1,
                    "name": "Sparky",
                    "ears": {
                        "healthy": True,
                    },
                },
            ],
        }
        response_data = json.dumps(response_json).encode()
        response = MockResponse(response_data)

        result = response_validator.validate(request, response)

        assert result is None