Compare commits

...

19 Commits

Author SHA1 Message Date
pre-commit-ci[bot]
6a10e4a712 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks 2025-10-22 13:05:04 +00:00
svlandeg
281641a957 Merge branch 'feature/python-tests-t' of https://github.com/fastapi/fastapi into feature/python-tests-t 2025-10-22 15:04:48 +02:00
svlandeg
5355c137c7 skipping one more orjson test 2025-10-22 15:04:39 +02:00
pre-commit-ci[bot]
55931329eb 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks 2025-10-22 13:00:29 +00:00
svlandeg
865927e914 skipping more tests and moving import to within functions 2025-10-22 15:00:13 +02:00
pre-commit-ci[bot]
11a894297d 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks 2025-10-22 12:53:25 +00:00
svlandeg
ecffbf617d skip ujson and orjson tests 2025-10-22 14:52:09 +02:00
svlandeg
ecb695df4d remove ujson from dependencies (as test) 2025-10-22 14:42:00 +02:00
svlandeg
025351e504 remove ujson-types 2025-10-22 14:35:41 +02:00
svlandeg
8e6bbcbb99 enable GIL again for more testing 2025-10-22 14:26:24 +02:00
svlandeg
002411e05d fix formatting 2025-10-21 10:32:02 +02:00
svlandeg
90e8bcc14d disable GIL to run test suite 2025-10-21 10:30:28 +02:00
svlandeg
479e646451 exclude pydantic v1 for Python 3.14t 2025-10-20 17:21:49 +02:00
Sofie Van Landeghem
f68bdddeca Merge branch 'master' into feature/python-tests-t 2025-10-20 14:51:19 +02:00
svlandeg
5a98af34ec remove allow prereleases 2025-10-10 13:58:32 +02:00
svlandeg
c013c04ea2 remove 3.13t 2025-10-10 13:58:09 +02:00
svlandeg
02415d5191 Merge branch 'master' into feature/python-tests-t 2025-10-10 13:48:05 +02:00
svlandeg
b24c50a4ee Merge branch 'master' into feature/python-tests-t 2025-09-23 14:43:57 +02:00
Patrick Arminio
fc6f9f8df7 Add tests for free threaded and 3.14 2025-07-29 12:03:13 +01:00
8 changed files with 38 additions and 4 deletions

View File

@@ -48,6 +48,7 @@ jobs:
strategy: strategy:
matrix: matrix:
python-version: python-version:
- "3.14t"
- "3.14" - "3.14"
- "3.13" - "3.13"
- "3.12" - "3.12"
@@ -59,6 +60,8 @@ jobs:
exclude: exclude:
- python-version: "3.14" - python-version: "3.14"
pydantic-version: "pydantic-v1" pydantic-version: "pydantic-v1"
- python-version: "3.14t"
pydantic-version: "pydantic-v1"
fail-fast: false fail-fast: false
steps: steps:
- name: Dump GitHub context - name: Dump GitHub context
@@ -90,6 +93,10 @@ jobs:
- name: Install older AnyIO in Python 3.8 - name: Install older AnyIO in Python 3.8
if: matrix.python-version == '3.8' if: matrix.python-version == '3.8'
run: uv pip install "anyio[trio]<4.0.0" run: uv pip install "anyio[trio]<4.0.0"
# - name: Set PYTHON_GIL
# if: endsWith(matrix.python-version, 't')
# run: |
# echo "PYTHON_GIL=0" >> "$GITHUB_ENV"
- run: mkdir coverage - run: mkdir coverage
- name: Test - name: Test
run: bash scripts/test.sh run: bash scripts/test.sh

View File

@@ -1,6 +1,5 @@
from typing import Any from typing import Any
import orjson
from fastapi import FastAPI, Response from fastapi import FastAPI, Response
app = FastAPI() app = FastAPI()
@@ -10,6 +9,8 @@ class CustomORJSONResponse(Response):
media_type = "application/json" media_type = "application/json"
def render(self, content: Any) -> bytes: def render(self, content: Any) -> bytes:
import orjson
assert orjson is not None, "orjson must be installed" assert orjson is not None, "orjson must be installed"
return orjson.dumps(content, option=orjson.OPT_INDENT_2) return orjson.dumps(content, option=orjson.OPT_INDENT_2)

View File

@@ -109,9 +109,9 @@ all = [
# For Starlette's schema generation, would not be used with FastAPI # For Starlette's schema generation, would not be used with FastAPI
"pyyaml >=5.3.1", "pyyaml >=5.3.1",
# For UJSONResponse # For UJSONResponse
"ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0", # "ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0",
# For ORJSONResponse # For ORJSONResponse
"orjson >=3.2.1", # "orjson >=3.2.1",
# To validate email fields # To validate email fields
"email-validator >=2.0.0", "email-validator >=2.0.0",
# Uvicorn with uvloop # Uvicorn with uvloop

View File

@@ -1,6 +1,6 @@
from typing import Any from typing import Any
import orjson import pytest
from fastapi import APIRouter, FastAPI from fastapi import APIRouter, FastAPI
from fastapi.responses import HTMLResponse, JSONResponse, PlainTextResponse from fastapi.responses import HTMLResponse, JSONResponse, PlainTextResponse
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
@@ -10,6 +10,8 @@ class ORJSONResponse(JSONResponse):
media_type = "application/x-orjson" media_type = "application/x-orjson"
def render(self, content: Any) -> bytes: def render(self, content: Any) -> bytes:
import orjson
return orjson.dumps(content) return orjson.dumps(content)
@@ -118,6 +120,7 @@ html_type = "text/html; charset=utf-8"
override_type = "application/x-override" override_type = "application/x-override"
@pytest.mark.skip(reason="skipping orjson tests")
def test_app(): def test_app():
with client: with client:
response = client.get("/") response = client.get("/")
@@ -125,6 +128,7 @@ def test_app():
assert response.headers["content-type"] == orjson_type assert response.headers["content-type"] == orjson_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_app_override(): def test_app_override():
with client: with client:
response = client.get("/override") response = client.get("/override")
@@ -132,6 +136,7 @@ def test_app_override():
assert response.headers["content-type"] == text_type assert response.headers["content-type"] == text_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_a(): def test_router_a():
with client: with client:
response = client.get("/a") response = client.get("/a")
@@ -139,6 +144,7 @@ def test_router_a():
assert response.headers["content-type"] == orjson_type assert response.headers["content-type"] == orjson_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_a_override(): def test_router_a_override():
with client: with client:
response = client.get("/a/override") response = client.get("/a/override")
@@ -146,6 +152,7 @@ def test_router_a_override():
assert response.headers["content-type"] == text_type assert response.headers["content-type"] == text_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_a_a(): def test_router_a_a():
with client: with client:
response = client.get("/a/a") response = client.get("/a/a")
@@ -153,6 +160,7 @@ def test_router_a_a():
assert response.headers["content-type"] == orjson_type assert response.headers["content-type"] == orjson_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_a_a_override(): def test_router_a_a_override():
with client: with client:
response = client.get("/a/a/override") response = client.get("/a/a/override")
@@ -160,6 +168,7 @@ def test_router_a_a_override():
assert response.headers["content-type"] == text_type assert response.headers["content-type"] == text_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_a_b(): def test_router_a_b():
with client: with client:
response = client.get("/a/b") response = client.get("/a/b")
@@ -167,6 +176,7 @@ def test_router_a_b():
assert response.headers["content-type"] == text_type assert response.headers["content-type"] == text_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_a_b_override(): def test_router_a_b_override():
with client: with client:
response = client.get("/a/b/override") response = client.get("/a/b/override")
@@ -174,6 +184,7 @@ def test_router_a_b_override():
assert response.headers["content-type"] == html_type assert response.headers["content-type"] == html_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_b(): def test_router_b():
with client: with client:
response = client.get("/b") response = client.get("/b")
@@ -181,6 +192,7 @@ def test_router_b():
assert response.headers["content-type"] == text_type assert response.headers["content-type"] == text_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_b_override(): def test_router_b_override():
with client: with client:
response = client.get("/b/override") response = client.get("/b/override")
@@ -188,6 +200,7 @@ def test_router_b_override():
assert response.headers["content-type"] == html_type assert response.headers["content-type"] == html_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_b_a(): def test_router_b_a():
with client: with client:
response = client.get("/b/a") response = client.get("/b/a")
@@ -195,6 +208,7 @@ def test_router_b_a():
assert response.headers["content-type"] == text_type assert response.headers["content-type"] == text_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_b_a_override(): def test_router_b_a_override():
with client: with client:
response = client.get("/b/a/override") response = client.get("/b/a/override")
@@ -202,6 +216,7 @@ def test_router_b_a_override():
assert response.headers["content-type"] == html_type assert response.headers["content-type"] == html_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_b_a_c(): def test_router_b_a_c():
with client: with client:
response = client.get("/b/a/c") response = client.get("/b/a/c")
@@ -209,6 +224,7 @@ def test_router_b_a_c():
assert response.headers["content-type"] == html_type assert response.headers["content-type"] == html_type
@pytest.mark.skip(reason="skipping orjson tests")
def test_router_b_a_c_override(): def test_router_b_a_c_override():
with client: with client:
response = client.get("/b/a/c/override") response = client.get("/b/a/c/override")

View File

@@ -1,3 +1,4 @@
import pytest
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.responses import ORJSONResponse from fastapi.responses import ORJSONResponse
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
@@ -15,6 +16,7 @@ def get_orjson_non_str_keys():
client = TestClient(app) client = TestClient(app)
@pytest.mark.skip(reason="skipping orjson tests")
def test_orjson_non_str_keys(): def test_orjson_non_str_keys():
with client: with client:
response = client.get("/orjson_non_str_keys") response = client.get("/orjson_non_str_keys")

View File

@@ -1,3 +1,4 @@
import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from docs_src.custom_response.tutorial001 import app from docs_src.custom_response.tutorial001 import app
@@ -5,12 +6,14 @@ from docs_src.custom_response.tutorial001 import app
client = TestClient(app) client = TestClient(app)
@pytest.mark.skip(reason="skipping ujson tests")
def test_get_custom_response(): def test_get_custom_response():
response = client.get("/items/") response = client.get("/items/")
assert response.status_code == 200, response.text assert response.status_code == 200, response.text
assert response.json() == [{"item_id": "Foo"}] assert response.json() == [{"item_id": "Foo"}]
@pytest.mark.skip(reason="skipping ujson tests")
def test_openapi_schema(): def test_openapi_schema():
response = client.get("/openapi.json") response = client.get("/openapi.json")
assert response.status_code == 200, response.text assert response.status_code == 200, response.text

View File

@@ -1,3 +1,4 @@
import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from docs_src.custom_response.tutorial001b import app from docs_src.custom_response.tutorial001b import app
@@ -5,12 +6,14 @@ from docs_src.custom_response.tutorial001b import app
client = TestClient(app) client = TestClient(app)
@pytest.mark.skip(reason="skipping orjson tests")
def test_get_custom_response(): def test_get_custom_response():
response = client.get("/items/") response = client.get("/items/")
assert response.status_code == 200, response.text assert response.status_code == 200, response.text
assert response.json() == [{"item_id": "Foo"}] assert response.json() == [{"item_id": "Foo"}]
@pytest.mark.skip(reason="skipping orjson tests")
def test_openapi_schema(): def test_openapi_schema():
response = client.get("/openapi.json") response = client.get("/openapi.json")
assert response.status_code == 200, response.text assert response.status_code == 200, response.text

View File

@@ -1,3 +1,4 @@
import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from docs_src.custom_response.tutorial009c import app from docs_src.custom_response.tutorial009c import app
@@ -5,6 +6,7 @@ from docs_src.custom_response.tutorial009c import app
client = TestClient(app) client = TestClient(app)
@pytest.mark.skip(reason="skipping orjson tests")
def test_get(): def test_get():
response = client.get("/") response = client.get("/")
assert response.content == b'{\n "message": "Hello World"\n}' assert response.content == b'{\n "message": "Hello World"\n}'