Coverage for tests/test_ambiguous_params.py: 100%

34 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-05-05 00:03 +0000

1import pytest 1ghijkl

2from fastapi import Depends, FastAPI, Path 1ghijkl

3from fastapi.param_functions import Query 1ghijkl

4from fastapi.testclient import TestClient 1ghijkl

5from fastapi.utils import PYDANTIC_V2 1ghijkl

6from typing_extensions import Annotated 1ghijkl

7 

8app = FastAPI() 1ghijkl

9 

10 

11def test_no_annotated_defaults(): 1ghijkl

12 with pytest.raises( 1mnopqr

13 AssertionError, match="Path parameters cannot have a default value" 

14 ): 

15 

16 @app.get("/items/{item_id}/") 1mnopqr

17 async def get_item(item_id: Annotated[int, Path(default=1)]): 1mnopqr

18 pass # pragma: nocover 

19 

20 with pytest.raises( 1mnopqr

21 AssertionError, 

22 match=( 

23 "`Query` default value cannot be set in `Annotated` for 'item_id'. Set the" 

24 " default value with `=` instead." 

25 ), 

26 ): 

27 

28 @app.get("/") 1mnopqr

29 async def get(item_id: Annotated[int, Query(default=1)]): 1mnopqr

30 pass # pragma: nocover 

31 

32 

33def test_multiple_annotations(): 1ghijkl

34 async def dep(): 1abcdef

35 pass # pragma: nocover 

36 

37 @app.get("/multi-query") 1abcdef

38 async def get(foo: Annotated[int, Query(gt=2), Query(lt=10)]): 1abcdef

39 return foo 1abcdef

40 

41 with pytest.raises( 1abcdef

42 AssertionError, 

43 match=( 

44 "Cannot specify `Depends` in `Annotated` and default value" 

45 " together for 'foo'" 

46 ), 

47 ): 

48 

49 @app.get("/") 1abcdef

50 async def get2(foo: Annotated[int, Depends(dep)] = Depends(dep)): 1abcdef

51 pass # pragma: nocover 

52 

53 with pytest.raises( 1abcdef

54 AssertionError, 

55 match=( 

56 "Cannot specify a FastAPI annotation in `Annotated` and `Depends` as a" 

57 " default value together for 'foo'" 

58 ), 

59 ): 

60 

61 @app.get("/") 1abcdef

62 async def get3(foo: Annotated[int, Query(min_length=1)] = Depends(dep)): 1abcdef

63 pass # pragma: nocover 

64 

65 client = TestClient(app) 1abcdef

66 response = client.get("/multi-query", params={"foo": "5"}) 1abcdef

67 assert response.status_code == 200 1abcdef

68 assert response.json() == 5 1abcdef

69 

70 response = client.get("/multi-query", params={"foo": "123"}) 1abcdef

71 assert response.status_code == 422 1abcdef

72 

73 if PYDANTIC_V2: 1abcdef

74 response = client.get("/multi-query", params={"foo": "1"}) 1abcdef

75 assert response.status_code == 422 1abcdef