File size: 1,994 Bytes
ed962ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# -------------------------------------------------------------------
# This source file is available under the terms of the
# Pimcore Open Core License (POCL)
# Full copyright and license information is available in
# LICENSE.md which is distributed with this source code.
# -------------------------------------------------------------------
"""OpenAPI-contract tests: a POST endpoint that documents no request body is undiscoverable from
the generated docs — Swagger UI renders no input widget and a caller has nothing to go on. Needs
no model weights."""

from src import main

SCHEMA = main.app.openapi()

IMAGE_TO_TEXT_BODY = "/image-to-text/{model_name}"


def test_image_to_text_documents_its_multipart_body():
    """`image_to_text` takes a raw ``Request`` rather than a typed model, so FastAPI cannot infer
    the body — the multipart schema has to be declared explicitly via ``openapi_extra`` or the
    endpoint appears to take no input at all.
    """
    schema = SCHEMA["paths"][IMAGE_TO_TEXT_BODY]["post"]["requestBody"]["content"]["multipart/form-data"]["schema"]

    assert schema["properties"]["image"]["format"] == "binary"
    assert schema["required"] == ["image"]


def test_image_to_text_documents_its_raw_image_body():
    """``get_encoded_image`` accepts a raw ``image/*`` body as well as the multipart form, so both
    accepted content types belong in the docs — see ``TextToImageTaskService.get_encoded_image``.
    """
    content = SCHEMA["paths"][IMAGE_TO_TEXT_BODY]["post"]["requestBody"]["content"]

    assert content["image/*"]["schema"]["format"] == "binary"


def test_every_post_endpoint_documents_a_request_body():
    """Guards the general case, so the next endpoint taking a raw ``Request`` cannot silently ship
    without a documented body.
    """
    missing = [
        path
        for path, operations in SCHEMA["paths"].items()
        if "post" in operations and "requestBody" not in operations["post"]
    ]

    assert missing == []