File: test_model_config.py

package info (click to toggle)
flask-openapi3 4.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,224 kB
  • sloc: python: 4,807; makefile: 14; javascript: 5
file content (105 lines) | stat: -rw-r--r-- 3,367 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
# -*- coding: utf-8 -*-
# @Author  : llc
# @Time    : 2023/6/30 10:12
import pytest
from pydantic import BaseModel, Field

from flask_openapi3 import FileStorage, OpenAPI

app = OpenAPI(__name__)
app.config["TESTING"] = True


class UploadFilesForm(BaseModel):
    file: FileStorage
    str_list: list[str]

    model_config = dict(
        openapi_extra={
            # "example": {"a": 123},
            "examples": {
                "Example 01": {
                    "summary": "An example",
                    "value": {"file": "Example-01.jpg", "str_list": ["a", "b", "c"]},
                },
                "Example 02": {"summary": "Another example", "value": {"str_list": ["1", "2", "3"]}},
            }
        }
    )


class BookBody(BaseModel):
    age: int
    author: str

    model_config = dict(
        openapi_extra={
            "description": "This is post RequestBody",
            "example": {"age": 12, "author": "author1"},
            "examples": {
                "example1": {
                    "summary": "example summary1",
                    "description": "example description1",
                    "value": {"age": 24, "author": "author2"},
                },
                "example2": {
                    "summary": "example summary2",
                    "description": "example description2",
                    "value": {"age": 48, "author": "author3"},
                },
            },
        }
    )


class MessageResponse(BaseModel):
    message: str = Field(..., description="The message")
    metadata: dict[str, str] = Field(alias="metadata_")

    model_config = dict(
        by_alias=False,
        openapi_extra={
            # "example": {"message": "aaa"},
            "examples": {
                "example1": {"summary": "example1 summary", "value": {"message": "bbb"}},
                "example2": {"summary": "example2 summary", "value": {"message": "ccc"}},
            }
        },
    )


@app.post("/form")
def api_form(form: UploadFilesForm):
    print(form)  # pragma: no cover


@app.post("/body", responses={"200": MessageResponse})
def api_error_json(body: BookBody):
    print(body)  # pragma: no cover


@pytest.fixture
def client():
    client = app.test_client()

    return client


def test_openapi(client):
    resp = client.get("/openapi/openapi.json")
    _json = resp.json
    assert resp.status_code == 200
    assert _json["paths"]["/form"]["post"]["requestBody"]["content"]["multipart/form-data"]["examples"] == {
        "Example 01": {"summary": "An example", "value": {"file": "Example-01.jpg", "str_list": ["a", "b", "c"]}},
        "Example 02": {"summary": "Another example", "value": {"str_list": ["1", "2", "3"]}},
    }
    assert _json["paths"]["/body"]["post"]["requestBody"]["description"] == "This is post RequestBody"
    assert _json["paths"]["/body"]["post"]["requestBody"]["content"]["application/json"]["example"] == {
        "age": 12,
        "author": "author1",
    }
    assert _json["paths"]["/body"]["post"]["responses"]["200"]["content"]["application/json"]["examples"] == {
        "example1": {"summary": "example1 summary", "value": {"message": "bbb"}},
        "example2": {"summary": "example2 summary", "value": {"message": "ccc"}},
    }
    assert _json["components"]["schemas"]["MessageResponse"]["properties"].get("metadata") is not None