Coverage for tests/test_ambiguous_params.py: 100%

34 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2024-08-08 03:53 +0000

1import pytest 1abcde

2from fastapi import Depends, FastAPI, Path 1abcde

3from fastapi.param_functions import Query 1abcde

4from fastapi.testclient import TestClient 1abcde

5from fastapi.utils import PYDANTIC_V2 1abcde

6from typing_extensions import Annotated 1abcde

7 

8app = FastAPI() 1abcde

9 

10 

11def test_no_annotated_defaults(): 1abcde

12 with pytest.raises( 1abcde

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

14 ): 

15 

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

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

18 pass # pragma: nocover 

19 

20 with pytest.raises( 1abcde

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("/") 1abcde

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

30 pass # pragma: nocover 

31 

32 

33def test_multiple_annotations(): 1abcde

34 async def dep(): 1abcde

35 pass # pragma: nocover 

36 

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

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

39 return foo 1abcde

40 

41 with pytest.raises( 1abcde

42 AssertionError, 

43 match=( 

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

45 " together for 'foo'" 

46 ), 

47 ): 

48 

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

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

51 pass # pragma: nocover 

52 

53 with pytest.raises( 1abcde

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("/") 1abcde

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

63 pass # pragma: nocover 

64 

65 client = TestClient(app) 1abcde

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

67 assert response.status_code == 200 1abcde

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

69 

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

71 assert response.status_code == 422 1abcde

72 

73 if PYDANTIC_V2: 1abcde

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

75 assert response.status_code == 422 1abcde