1
+ from datetime import datetime
2
+ import pytest
3
+ from typed_api_response .schemas import ResponseMeta , ErrorPayload , ApiErrorResponse , ErrorPayloadData
4
+ from typed_api_response .response import build_api_response
5
+
6
+
7
+ class CustomExceptionForTest (Exception ):
8
+ pass
9
+
10
+ def test_error_shape ():
11
+ try :
12
+ _ = 1 / 0
13
+ except Exception as e :
14
+ response = build_api_response (error = e , status = 418 )
15
+
16
+ assert response .status == 418
17
+ assert isinstance (response , ApiErrorResponse )
18
+ assert isinstance (response .meta , ResponseMeta )
19
+ assert isinstance (response .payload , ErrorPayload )
20
+ assert isinstance (response .payload .error , ErrorPayloadData )
21
+ assert response .payload .error .type == e .__class__ .__name__
22
+ assert response .payload .error .msg == str (e )
23
+ assert response .payload .success == False
24
+ assert response .payload .data == None
25
+ else :
26
+ pytest .fail ("How???" )
27
+
28
+ def test_custom_exception ():
29
+ try :
30
+ raise CustomExceptionForTest ("The app is broken" )
31
+ except CustomExceptionForTest as e :
32
+ response = build_api_response (error = e , status = 500 )
33
+ assert response .payload .error .type == "CustomExceptionForTest"
34
+ assert response .payload .error .msg == "The app is broken"
35
+
36
+ def test_error_with_custom_meta ():
37
+ meta = ResponseMeta (method = "post" , path = "/fail" )
38
+ try :
39
+ raise RuntimeError ("bad things" )
40
+ except Exception as e :
41
+ response = build_api_response (error = e , status = 500 , meta = meta )
42
+
43
+ assert response .meta is not None
44
+ assert isinstance (response .meta , ResponseMeta )
45
+ assert response .meta .method == "POST"
46
+ assert response .meta .path == "/fail"
47
+ assert response .payload .error .type == e .__class__ .__name__
48
+ assert response .payload .error .msg == str (e )
49
+ assert response .payload .success == False
50
+ assert response .payload .data == None
51
+ else :
52
+ pytest .fail ("No error raised. Did you change error behavior?" )
53
+
54
+ def test_timestamp_is_set ():
55
+ foo = [1 , 2 , 3 , 4 ]
56
+ try :
57
+ foo [9999 ]
58
+ except IndexError as e :
59
+ response = build_api_response (error = e , status = 404 )
60
+ assert response .meta is not None
61
+ assert response .meta .timestamp is not None
62
+ assert isinstance (response .meta .timestamp , datetime )
63
+ else :
64
+ pytest .fail ("No error raised. Did you change error behavior?" )
0 commit comments