File size: 2,852 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# -------------------------------------------------------------------
# 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.
# -------------------------------------------------------------------
"""The documented samples must stay executable.

A sample that no longer validates is worse than no sample: someone clicks "Try it out" in `/docs`,
gets a 422, and concludes the endpoint is broken. These tests bind each documented example to the
real request model, so a schema change that invalidates a sample fails here rather than in
somebody's browser.
"""

import base64

import pytest
from src.embeddings import EmbeddingsRequest
from src.main import app
from src.openapi_examples import (
    IMAGE_EMBEDDING_EXAMPLES,
    SAMPLE_PNG_BASE64,
    TEXT_EMBEDDING_EXAMPLES,
)

ALL_EXAMPLES = [pytest.param(name, example, id=f"text-{name}") for name, example in TEXT_EMBEDDING_EXAMPLES.items()] + [
    pytest.param(name, example, id=f"image-{name}") for name, example in IMAGE_EMBEDDING_EXAMPLES.items()
]


@pytest.mark.parametrize(("name", "example"), ALL_EXAMPLES)
def test_every_documented_example_validates(name, example):
    """Catches the drift case directly: a validator added to EmbeddingsRequest that an old sample
    now violates."""
    EmbeddingsRequest(**example["value"])


@pytest.mark.parametrize(("name", "example"), ALL_EXAMPLES)
def test_every_documented_example_is_described(name, example):
    """A dropdown entry with no summary is unusable — the reader cannot tell the samples apart."""
    assert example["summary"].strip()
    assert example["description"].strip()


def test_sample_image_is_a_real_decodable_png():
    """The image sample is meant to be sent unmodified, so it has to be an actual image rather than
    a `base64_encoded_image_string` placeholder."""
    raw = base64.b64decode(SAMPLE_PNG_BASE64, validate=True)

    assert raw.startswith(b"\x89PNG\r\n\x1a\n")


def test_examples_reach_the_generated_openapi_schema():
    """Guards the wiring, not just the data: the samples are useless if FastAPI never publishes
    them."""
    schema = app.openapi()

    for path, expected in (
        ("/text-embedding", TEXT_EMBEDDING_EXAMPLES),
        ("/image-embedding", IMAGE_EMBEDDING_EXAMPLES),
    ):
        published = schema["paths"][path]["post"]["requestBody"]["content"]["application/json"]["examples"]
        assert set(published) == set(expected), f"{path} publishes {set(published)}"


def test_documented_response_codes_are_published():
    """The 400 and 404 cases are the ones a caller actually has to handle."""
    responses = app.openapi()["paths"]["/text-embedding"]["post"]["responses"]

    assert {"200", "400", "404"} <= set(responses)