Coverage for tests/test_tutorial/test_cookie_param_models/test_tutorial002.py: 100%

40 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-01-13 13:38 +0000

1import importlib 1abcde

2 

3import pytest 1abcde

4from dirty_equals import IsDict 1abcde

5from fastapi.testclient import TestClient 1abcde

6from inline_snapshot import snapshot 1abcde

7 

8from tests.utils import needs_py39, needs_py310, needs_pydanticv1, needs_pydanticv2 1abcde

9 

10 

11@pytest.fixture( 1abcde

12 name="client", 

13 params=[ 

14 pytest.param("tutorial002", marks=needs_pydanticv2), 

15 pytest.param("tutorial002_py310", marks=[needs_py310, needs_pydanticv2]), 

16 pytest.param("tutorial002_an", marks=needs_pydanticv2), 

17 pytest.param("tutorial002_an_py39", marks=[needs_py39, needs_pydanticv2]), 

18 pytest.param("tutorial002_an_py310", marks=[needs_py310, needs_pydanticv2]), 

19 pytest.param("tutorial002_pv1", marks=[needs_pydanticv1, needs_pydanticv1]), 

20 pytest.param("tutorial002_pv1_py310", marks=[needs_py310, needs_pydanticv1]), 

21 pytest.param("tutorial002_pv1_an", marks=[needs_pydanticv1]), 

22 pytest.param("tutorial002_pv1_an_py39", marks=[needs_py39, needs_pydanticv1]), 

23 pytest.param("tutorial002_pv1_an_py310", marks=[needs_py310, needs_pydanticv1]), 

24 ], 

25) 

26def get_client(request: pytest.FixtureRequest): 1abcde

27 mod = importlib.import_module(f"docs_src.cookie_param_models.{request.param}") 1abcde

28 

29 client = TestClient(mod.app) 1abcde

30 return client 1abcde

31 

32 

33def test_cookie_param_model(client: TestClient): 1abcde

34 with client as c: 1fghij

35 c.cookies.set("session_id", "123") 1fghij

36 c.cookies.set("fatebook_tracker", "456") 1fghij

37 c.cookies.set("googall_tracker", "789") 1fghij

38 response = c.get("/items/") 1fghij

39 assert response.status_code == 200 1fghij

40 assert response.json() == { 1fghij

41 "session_id": "123", 

42 "fatebook_tracker": "456", 

43 "googall_tracker": "789", 

44 } 

45 

46 

47def test_cookie_param_model_defaults(client: TestClient): 1abcde

48 with client as c: 1pqrst

49 c.cookies.set("session_id", "123") 1pqrst

50 response = c.get("/items/") 1pqrst

51 assert response.status_code == 200 1pqrst

52 assert response.json() == { 1pqrst

53 "session_id": "123", 

54 "fatebook_tracker": None, 

55 "googall_tracker": None, 

56 } 

57 

58 

59def test_cookie_param_model_invalid(client: TestClient): 1abcde

60 response = client.get("/items/") 1uvwxy

61 assert response.status_code == 422 1uvwxy

62 assert response.json() == snapshot( 1uvwxy

63 IsDict( 

64 { 

65 "detail": [ 

66 { 

67 "type": "missing", 

68 "loc": ["cookie", "session_id"], 

69 "msg": "Field required", 

70 "input": {}, 

71 } 

72 ] 

73 } 

74 ) 

75 | IsDict( 

76 # TODO: remove when deprecating Pydantic v1 

77 { 

78 "detail": [ 

79 { 

80 "type": "value_error.missing", 

81 "loc": ["cookie", "session_id"], 

82 "msg": "field required", 

83 } 

84 ] 

85 } 

86 ) 

87 ) 

88 

89 

90def test_cookie_param_model_extra(client: TestClient): 1abcde

91 with client as c: 1klmno

92 c.cookies.set("session_id", "123") 1klmno

93 c.cookies.set("extra", "track-me-here-too") 1klmno

94 response = c.get("/items/") 1klmno

95 assert response.status_code == 422 1klmno

96 assert response.json() == snapshot( 1klmno

97 IsDict( 

98 { 

99 "detail": [ 

100 { 

101 "type": "extra_forbidden", 

102 "loc": ["cookie", "extra"], 

103 "msg": "Extra inputs are not permitted", 

104 "input": "track-me-here-too", 

105 } 

106 ] 

107 } 

108 ) 

109 | IsDict( 

110 # TODO: remove when deprecating Pydantic v1 

111 { 

112 "detail": [ 

113 { 

114 "type": "value_error.extra", 

115 "loc": ["cookie", "extra"], 

116 "msg": "extra fields not permitted", 

117 } 

118 ] 

119 } 

120 ) 

121 ) 

122 

123 

124def test_openapi_schema(client: TestClient): 1abcde

125 response = client.get("/openapi.json") 1zABCD

126 assert response.status_code == 200, response.text 1zABCD

127 assert response.json() == snapshot( 1zABCD

128 { 

129 "openapi": "3.1.0", 

130 "info": {"title": "FastAPI", "version": "0.1.0"}, 

131 "paths": { 

132 "/items/": { 

133 "get": { 

134 "summary": "Read Items", 

135 "operationId": "read_items_items__get", 

136 "parameters": [ 

137 { 

138 "name": "session_id", 

139 "in": "cookie", 

140 "required": True, 

141 "schema": {"type": "string", "title": "Session Id"}, 

142 }, 

143 { 

144 "name": "fatebook_tracker", 

145 "in": "cookie", 

146 "required": False, 

147 "schema": IsDict( 

148 { 

149 "anyOf": [{"type": "string"}, {"type": "null"}], 

150 "title": "Fatebook Tracker", 

151 } 

152 ) 

153 | IsDict( 

154 # TODO: remove when deprecating Pydantic v1 

155 { 

156 "type": "string", 

157 "title": "Fatebook Tracker", 

158 } 

159 ), 

160 }, 

161 { 

162 "name": "googall_tracker", 

163 "in": "cookie", 

164 "required": False, 

165 "schema": IsDict( 

166 { 

167 "anyOf": [{"type": "string"}, {"type": "null"}], 

168 "title": "Googall Tracker", 

169 } 

170 ) 

171 | IsDict( 

172 # TODO: remove when deprecating Pydantic v1 

173 { 

174 "type": "string", 

175 "title": "Googall Tracker", 

176 } 

177 ), 

178 }, 

179 ], 

180 "responses": { 

181 "200": { 

182 "description": "Successful Response", 

183 "content": {"application/json": {"schema": {}}}, 

184 }, 

185 "422": { 

186 "description": "Validation Error", 

187 "content": { 

188 "application/json": { 

189 "schema": { 

190 "$ref": "#/components/schemas/HTTPValidationError" 

191 } 

192 } 

193 }, 

194 }, 

195 }, 

196 } 

197 } 

198 }, 

199 "components": { 

200 "schemas": { 

201 "HTTPValidationError": { 

202 "properties": { 

203 "detail": { 

204 "items": { 

205 "$ref": "#/components/schemas/ValidationError" 

206 }, 

207 "type": "array", 

208 "title": "Detail", 

209 } 

210 }, 

211 "type": "object", 

212 "title": "HTTPValidationError", 

213 }, 

214 "ValidationError": { 

215 "properties": { 

216 "loc": { 

217 "items": { 

218 "anyOf": [{"type": "string"}, {"type": "integer"}] 

219 }, 

220 "type": "array", 

221 "title": "Location", 

222 }, 

223 "msg": {"type": "string", "title": "Message"}, 

224 "type": {"type": "string", "title": "Error Type"}, 

225 }, 

226 "type": "object", 

227 "required": ["loc", "msg", "type"], 

228 "title": "ValidationError", 

229 }, 

230 } 

231 }, 

232 } 

233 )