@@ -26,27 +26,35 @@ import (
26
26
27
27
func TestReplyJSON (t * testing.T ) {
28
28
t .Parallel ()
29
- var (
30
- errCode = 400
31
- errText = "test error"
32
- expectedErrorResponse = "" +
33
- "{\n " +
34
- " \" error\" : {\n " +
35
- " \" message\" : \" " + errText + "\" \n " +
36
- " }\n " +
37
- "}"
38
- )
39
29
40
- for _ , tc := range []struct {
30
+ var expectedErrorResponse = `{
31
+ "error": {
32
+ "message": "test error"
33
+ }
34
+ }`
35
+
36
+ tests := []struct {
41
37
desc string
42
38
err error
43
39
}{
44
- {"plain error" , errors .New ("test error" )},
45
- {"trace error" , & TraceErr {Err : errors .New ("test error" )}},
46
- {"trace error with stacktrace" , & TraceErr {Err : errors .New ("test error" ), Traces : Traces {{Path : "A" , Func : "B" , Line : 1 }}}},
47
- } {
40
+ {
41
+ desc : "plain error" ,
42
+ err : errors .New ("test error" ),
43
+ },
44
+ {
45
+ desc : "trace error" ,
46
+ err : & TraceErr {Err : errors .New ("test error" )},
47
+ },
48
+ {
49
+ desc : "trace error with stacktrace" ,
50
+ err : & TraceErr {Err : errors .New ("test error" ), Traces : Traces {{Path : "A" , Func : "B" , Line : 1 }}},
51
+ },
52
+ }
53
+
54
+ for _ , tc := range tests {
48
55
t .Run (tc .desc , func (t * testing.T ) {
49
56
recorder := httptest .NewRecorder ()
57
+ const errCode = 400
50
58
replyJSON (recorder , errCode , tc .err )
51
59
require .JSONEq (t , expectedErrorResponse , recorder .Body .String ())
52
60
})
@@ -55,12 +63,63 @@ func TestReplyJSON(t *testing.T) {
55
63
56
64
func TestUnmarshalError (t * testing.T ) {
57
65
t .Parallel ()
58
- testCase := func (t * testing.T , err error , response string , isExpectedErr func (error ) bool , expectedMsg string ) {
59
- readErr := unmarshalError (err , []byte (response ))
60
- require .True (t , isExpectedErr (readErr ))
61
- require .EqualError (t , readErr , expectedMsg )
66
+
67
+ tests := []struct {
68
+ desc string
69
+ inputErr error
70
+ inputResponse string
71
+ assertErr func (error ) bool
72
+ expectedMsg string
73
+ }{
74
+ {
75
+ desc : "unmarshal not found error" ,
76
+ inputErr : & NotFoundError {},
77
+ inputResponse : `{"error": {"message": "ABC"}}` ,
78
+ assertErr : IsNotFound ,
79
+ expectedMsg : "ABC" ,
80
+ },
81
+ {
82
+ desc : "unmarshal access denied error" ,
83
+ inputErr : & AccessDeniedError {},
84
+ inputResponse : `{"error": {"message": "ABC"}}` ,
85
+ assertErr : IsAccessDenied ,
86
+ expectedMsg : "ABC" ,
87
+ },
88
+ {
89
+ desc : "unmarshal error without error JSON key" ,
90
+ inputErr : & AccessDeniedError {},
91
+ inputResponse : `{"message": "ABC"}` ,
92
+ assertErr : IsAccessDenied ,
93
+ expectedMsg : "ABC" ,
94
+ },
95
+ {
96
+ desc : "unmarshal invalid error" ,
97
+ inputErr : & AccessDeniedError {},
98
+ inputResponse : `{"error": "message ABC"}` ,
99
+ assertErr : IsAccessDenied ,
100
+ expectedMsg : "{\" error\" : \" message ABC\" }\n \t access denied" ,
101
+ },
102
+ {
103
+ desc : "unmarshal invalid error without error JSON key" ,
104
+ inputErr : & AccessDeniedError {},
105
+ inputResponse : `["error message ABC"]` ,
106
+ assertErr : IsAccessDenied ,
107
+ expectedMsg : "[\" error message ABC\" ]\n \t access denied" ,
108
+ },
109
+ {
110
+ desc : "unmarshal error with non-JSON body" ,
111
+ inputErr : & AccessDeniedError {},
112
+ inputResponse : "error message ABC" ,
113
+ assertErr : IsAccessDenied ,
114
+ expectedMsg : "error message ABC\n \t access denied" ,
115
+ },
62
116
}
63
117
64
- testCase (t , & NotFoundError {}, `{"error": {"message": "ABC"}}` , IsNotFound , "ABC" )
65
- testCase (t , & AccessDeniedError {}, `{"error": {"message": "ABC"}}` , IsAccessDenied , "ABC" )
118
+ for _ , tc := range tests {
119
+ t .Run (tc .desc , func (t * testing.T ) {
120
+ readErr := unmarshalError (tc .inputErr , []byte (tc .inputResponse ))
121
+ require .True (t , tc .assertErr (readErr ))
122
+ require .EqualError (t , readErr , tc .expectedMsg )
123
+ })
124
+ }
66
125
}
0 commit comments