Esempio n. 1
0
 def test_damaged_request_body(self, request_ctx, mocker):
     mock_request = mocker.patch.object(request_ctx, "request")
     content_type = "application/json"
     mock_request.headers = {"Content-Type": content_type}
     mock_request.get_json = lambda: None
     body_model = RequestBodyModel
     with pytest.raises(JsonBodyParsingError):
         validate(body_model)(lambda x: x)()
Esempio n. 2
0
    def test_validate_func_having_return_type_annotation(
            self, mocker, request_ctx, parameters: ValidateParams):
        mock_request = mocker.patch.object(request_ctx, "request")
        mock_request.args = parameters.request_query
        mock_request.get_json = lambda: parameters.request_body

        def f() -> Any:
            return parameters.response_model(
                **mock_request.body_params.dict(),
                **mock_request.query_params.dict())

        response = validate(
            query=parameters.query_model,
            body=parameters.body_model,
            on_success_status=parameters.on_success_status,
            exclude_none=parameters.exclude_none,
            response_many=parameters.response_many,
            request_body_many=parameters.request_body_many,
        )(f)()

        assert response.status_code == parameters.expected_status_code
        assert response.json == parameters.expected_response_body
        if 200 <= response.status_code < 300:
            assert (mock_request.body_params.dict(
                exclude_none=True,
                exclude_defaults=True) == parameters.request_body)
            assert mock_request.query_params.dict(
                exclude_none=True,
                exclude_defaults=True) == parameters.request_query.to_dict(
                    flat=True)
Esempio n. 3
0
    def test_response_many_response_objs(self):
        response_content = [
            ResponseModel(q1=1, q2="2", b1=3.14, b2="b2"),
            ResponseModel(q1=2, q2="3", b1=3.14),
            ResponseModel(q1=3, q2="4", b1=6.9, b2="b4"),
        ]
        expected_response_body = [
            {
                "q1": 1,
                "q2": "2",
                "b1": 3.14,
                "b2": "b2"
            },
            {
                "q1": 2,
                "q2": "3",
                "b1": 3.14
            },
            {
                "q1": 3,
                "q2": "4",
                "b1": 6.9,
                "b2": "b4"
            },
        ]

        def f():
            return response_content

        response = validate(exclude_none=True, response_many=True)(f)()
        assert response.json == expected_response_body
Esempio n. 4
0
    def test_valid_array_object_request_body(self, mocker, request_ctx):
        mock_request = mocker.patch.object(request_ctx, "request")
        mock_request.args = ImmutableMultiDict({"q1": 1})
        mock_request.get_json = lambda: [
            {"b1": 1.0, "b2": "str1"},
            {"b1": 2.0, "b2": "str2"},
        ]
        expected_response_body = [
            {"q1": 1, "q2": "default", "b1": 1.0, "b2": "str1"},
            {"q1": 1, "q2": "default", "b1": 2.0, "b2": "str2"},
        ]

        def f():
            query_params = mock_request.query_params
            body_params = mock_request.body_params
            return [
                ResponseModel(
                    q1=query_params.q1, q2=query_params.q2, b1=obj.b1, b2=obj.b2
                )
                for obj in body_params
            ]

        response = validate(
            query=QueryModel,
            body=RequestBodyModel,
            request_body_many=True,
            response_many=True,
        )(f)()

        assert response.status_code == 200
        assert response.json == expected_response_body
Esempio n. 5
0
    def test_response_already_response(self):
        expected_response_body = {"a": 1, "b": 2}

        def f():
            return jsonify(expected_response_body)

        response = validate()(f)()
        assert response.json == expected_response_body
Esempio n. 6
0
    def test_response_with_status(self):
        expected_status_code = 201
        expected_response_body = dict(q1=1, q2="2", b1=3.14, b2="b2")

        def f():
            return ResponseModel(q1=1, q2="2", b1=3.14, b2="b2"), expected_status_code

        response = validate()(f)()
        assert response.status_code == expected_status_code
        assert response.json == expected_response_body
Esempio n. 7
0
 def test_unsupported_media_type(self, request_ctx, mocker):
     mock_request = mocker.patch.object(request_ctx, "request")
     content_type = "text/plain"
     mock_request.headers = {"Content-Type": content_type}
     mock_request.get_json = lambda: None
     body_model = RequestBodyModel
     response = validate(body_model)(lambda x: x)()
     assert response.status_code == 415
     assert response.json == {
         "detail": f"Unsupported media type '{content_type}' in request. "
         "'application/json' is required."
     }
Esempio n. 8
0
 def test_invalid_body_model_root(self, request_ctx, mocker):
     mock_request = mocker.patch.object(request_ctx, "request")
     content_type = "application/json"
     mock_request.headers = {"Content-Type": content_type}
     mock_request.get_json = lambda: None
     body_model = RequestBodyModelRoot
     response = validate(body_model)(lambda x: x)()
     assert response.status_code == 400
     assert response.json == {
         "validation_error": {
             "body_params": [{
                 "loc": ["__root__"],
                 "msg": "none is not an allowed value",
                 "type": "type_error.none.not_allowed",
             }]
         }
     }
Esempio n. 9
0
    def test_invalid_many_raises(self):
        def f():
            return ResponseModel(q1=1, q2="2", b1=3.14, b2="b2")

        with pytest.raises(InvalidIterableOfModelsException):
            validate(response_many=True)(f)()