Coverage for tests/test_forms_single_model.py: 100%
32 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-06 16:22 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-06 16:22 +0000
1from typing import List, Optional 1abcde
3from dirty_equals import IsDict 1abcde
4from fastapi import FastAPI, Form 1abcde
5from fastapi.testclient import TestClient 1abcde
6from pydantic import BaseModel 1abcde
7from typing_extensions import Annotated 1abcde
9app = FastAPI() 1abcde
12class FormModel(BaseModel): 1abcde
13 username: str 1abcde
14 lastname: str 1abcde
15 age: Optional[int] = None 1abcde
16 tags: List[str] = ["foo", "bar"] 1abcde
19@app.post("/form/") 1abcde
20def post_form(user: Annotated[FormModel, Form()]): 1abcde
21 return user 1fghijklmno
24client = TestClient(app) 1abcde
27def test_send_all_data(): 1abcde
28 response = client.post( 1gikmo
29 "/form/",
30 data={
31 "username": "Rick",
32 "lastname": "Sanchez",
33 "age": "70",
34 "tags": ["plumbus", "citadel"],
35 },
36 )
37 assert response.status_code == 200, response.text 1gikmo
38 assert response.json() == { 1gikmo
39 "username": "Rick",
40 "lastname": "Sanchez",
41 "age": 70,
42 "tags": ["plumbus", "citadel"],
43 }
46def test_defaults(): 1abcde
47 response = client.post("/form/", data={"username": "Rick", "lastname": "Sanchez"}) 1fhjln
48 assert response.status_code == 200, response.text 1fhjln
49 assert response.json() == { 1fhjln
50 "username": "Rick",
51 "lastname": "Sanchez",
52 "age": None,
53 "tags": ["foo", "bar"],
54 }
57def test_invalid_data(): 1abcde
58 response = client.post( 1pqrst
59 "/form/",
60 data={
61 "username": "Rick",
62 "lastname": "Sanchez",
63 "age": "seventy",
64 "tags": ["plumbus", "citadel"],
65 },
66 )
67 assert response.status_code == 422, response.text 1pqrst
68 assert response.json() == IsDict( 1pqrst
69 {
70 "detail": [
71 {
72 "type": "int_parsing",
73 "loc": ["body", "age"],
74 "msg": "Input should be a valid integer, unable to parse string as an integer",
75 "input": "seventy",
76 }
77 ]
78 }
79 ) | IsDict(
80 # TODO: remove when deprecating Pydantic v1
81 {
82 "detail": [
83 {
84 "loc": ["body", "age"],
85 "msg": "value is not a valid integer",
86 "type": "type_error.integer",
87 }
88 ]
89 }
90 )
93def test_no_data(): 1abcde
94 response = client.post("/form/") 1uvwxy
95 assert response.status_code == 422, response.text 1uvwxy
96 assert response.json() == IsDict( 1uvwxy
97 {
98 "detail": [
99 {
100 "type": "missing",
101 "loc": ["body", "username"],
102 "msg": "Field required",
103 "input": {"tags": ["foo", "bar"]},
104 },
105 {
106 "type": "missing",
107 "loc": ["body", "lastname"],
108 "msg": "Field required",
109 "input": {"tags": ["foo", "bar"]},
110 },
111 ]
112 }
113 ) | IsDict(
114 # TODO: remove when deprecating Pydantic v1
115 {
116 "detail": [
117 {
118 "loc": ["body", "username"],
119 "msg": "field required",
120 "type": "value_error.missing",
121 },
122 {
123 "loc": ["body", "lastname"],
124 "msg": "field required",
125 "type": "value_error.missing",
126 },
127 ]
128 }
129 )