Coverage for tests/test_validate_response_dataclass.py: 100%

31 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-12-04 08:29 +0000

1from typing import List, Optional 1abcdefg

2 

3import pytest 1abcdefg

4from fastapi import FastAPI 1abcdefg

5from fastapi.exceptions import ResponseValidationError 1abcdefg

6from fastapi.testclient import TestClient 1abcdefg

7from pydantic.dataclasses import dataclass 1abcdefg

8 

9app = FastAPI() 1abcdefg

10 

11 

12@dataclass 1abcdefg

13class Item: 1abcdefg

14 name: str 1abcdefg

15 price: Optional[float] = None 1abcdefg

16 owner_ids: Optional[List[int]] = None 1abcdefg

17 

18 

19@app.get("/items/invalid", response_model=Item) 1abcdefg

20def get_invalid(): 1abcdefg

21 return {"name": "invalid", "price": "foo"} 1hijklmn

22 

23 

24@app.get("/items/innerinvalid", response_model=Item) 1abcdefg

25def get_innerinvalid(): 1abcdefg

26 return {"name": "double invalid", "price": "foo", "owner_ids": ["foo", "bar"]} 1opqrstu

27 

28 

29@app.get("/items/invalidlist", response_model=List[Item]) 1abcdefg

30def get_invalidlist(): 1abcdefg

31 return [ 1vwxyzAB

32 {"name": "foo"}, 

33 {"name": "bar", "price": "bar"}, 

34 {"name": "baz", "price": "baz"}, 

35 ] 

36 

37 

38client = TestClient(app) 1abcdefg

39 

40 

41def test_invalid(): 1abcdefg

42 with pytest.raises(ResponseValidationError): 1hijklmn

43 client.get("/items/invalid") 1hijklmn

44 

45 

46def test_double_invalid(): 1abcdefg

47 with pytest.raises(ResponseValidationError): 1opqrstu

48 client.get("/items/innerinvalid") 1opqrstu

49 

50 

51def test_invalid_list(): 1abcdefg

52 with pytest.raises(ResponseValidationError): 1vwxyzAB

53 client.get("/items/invalidlist") 1vwxyzAB