From 6597a0050b2cfe97354b6b1270b190d6a015e254 Mon Sep 17 00:00:00 2001 From: Eikentech <268179195+Eikentech@users.noreply.github.com> Date: Sun, 28 Jun 2026 19:57:20 +0200 Subject: [PATCH] test: cover OAuth2AuthorizationCodeBearer auto_error=False branch --- fastapi/security/oauth2.py | 2 +- ...uth2_authorization_code_bearer_optional.py | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 tests/test_security_oauth2_authorization_code_bearer_optional.py diff --git a/fastapi/security/oauth2.py b/fastapi/security/oauth2.py index 3fd9e41eb..89fb1f14e 100644 --- a/fastapi/security/oauth2.py +++ b/fastapi/security/oauth2.py @@ -646,7 +646,7 @@ class OAuth2AuthorizationCodeBearer(OAuth2): if self.auto_error: raise self.make_not_authenticated_error() else: - return None # pragma: nocover + return None return param diff --git a/tests/test_security_oauth2_authorization_code_bearer_optional.py b/tests/test_security_oauth2_authorization_code_bearer_optional.py new file mode 100644 index 000000000..2f6f18ace --- /dev/null +++ b/tests/test_security_oauth2_authorization_code_bearer_optional.py @@ -0,0 +1,78 @@ +from fastapi import FastAPI, Security +from fastapi.security import OAuth2AuthorizationCodeBearer +from fastapi.testclient import TestClient +from inline_snapshot import snapshot + +app = FastAPI() + +oauth2_scheme = OAuth2AuthorizationCodeBearer( + authorizationUrl="authorize", tokenUrl="token", auto_error=False +) + + +@app.get("/items/") +async def read_items(token: str | None = Security(oauth2_scheme)): + if token is None: + return {"msg": "Create an account first"} + return {"token": token} + + +client = TestClient(app) + + +def test_no_token(): + response = client.get("/items") + assert response.status_code == 200, response.text + assert response.json() == {"msg": "Create an account first"} + + +def test_token(): + response = client.get("/items", headers={"Authorization": "Bearer testtoken"}) + assert response.status_code == 200, response.text + assert response.json() == {"token": "testtoken"} + + +def test_incorrect_token(): + response = client.get("/items", headers={"Authorization": "Non-existent testtoken"}) + assert response.status_code == 200, response.text + assert response.json() == {"msg": "Create an account first"} + + +def test_openapi_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200, response.text + assert response.json() == snapshot( + { + "openapi": "3.1.0", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/items/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Read Items", + "operationId": "read_items_items__get", + "security": [{"OAuth2AuthorizationCodeBearer": []}], + } + } + }, + "components": { + "securitySchemes": { + "OAuth2AuthorizationCodeBearer": { + "type": "oauth2", + "flows": { + "authorizationCode": { + "authorizationUrl": "authorize", + "tokenUrl": "token", + "scopes": {}, + } + }, + } + } + }, + } + )