-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patherrors_test.go
More file actions
134 lines (110 loc) · 2.86 KB
/
errors_test.go
File metadata and controls
134 lines (110 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package api_test
import (
"errors"
"net/http"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/bjaus/api"
)
func TestProblemDetail_Error(t *testing.T) {
t.Parallel()
tests := map[string]struct {
pd api.ProblemDetail
expect string
}{
"with detail": {
pd: api.ProblemDetail{Detail: "something went wrong", Title: "Bad Request"},
expect: "something went wrong",
},
"empty detail returns title": {
pd: api.ProblemDetail{Title: "Not Found"},
expect: "Not Found",
},
"both empty": {
pd: api.ProblemDetail{},
expect: "",
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
t.Parallel()
assert.Equal(t, tc.expect, tc.pd.Error())
})
}
}
func TestProblemDetail_StatusCode(t *testing.T) {
t.Parallel()
tests := map[string]struct {
status int
}{
"400": {status: http.StatusBadRequest},
"404": {status: http.StatusNotFound},
"500": {status: http.StatusInternalServerError},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
t.Parallel()
pd := &api.ProblemDetail{Status: tc.status}
assert.Equal(t, tc.status, pd.StatusCode())
})
}
}
func TestHTTPError_Error(t *testing.T) {
t.Parallel()
err := api.Error(http.StatusNotFound, "not found")
assert.EqualError(t, err, "not found")
var sc api.StatusCoder
require.ErrorAs(t, err, &sc)
assert.Equal(t, http.StatusNotFound, sc.StatusCode())
}
func TestHTTPError_StatusCode(t *testing.T) {
t.Parallel()
err := api.Error(http.StatusConflict, "conflict")
var apiErr *api.HTTPError
require.ErrorAs(t, err, &apiErr)
assert.Equal(t, http.StatusConflict, apiErr.Status)
assert.Equal(t, "conflict", apiErr.Message)
}
func TestError_constructor(t *testing.T) {
t.Parallel()
err := api.Error(http.StatusForbidden, "forbidden")
var he *api.HTTPError
require.ErrorAs(t, err, &he)
assert.Equal(t, http.StatusForbidden, he.StatusCode())
assert.Equal(t, "forbidden", he.Error())
}
func TestErrorf_constructor(t *testing.T) {
t.Parallel()
err := api.Errorf(http.StatusBadRequest, "invalid %s: %d", "age", 42)
assert.EqualError(t, err, "invalid age: 42")
var he *api.HTTPError
require.ErrorAs(t, err, &he)
assert.Equal(t, http.StatusBadRequest, he.StatusCode())
}
func TestErrorStatus(t *testing.T) {
t.Parallel()
tests := map[string]struct {
err error
expect int
}{
"with StatusCoder": {
err: api.Error(http.StatusForbidden, "forbidden"),
expect: http.StatusForbidden,
},
"with ProblemDetail StatusCoder": {
err: &api.ProblemDetail{Status: http.StatusConflict},
expect: http.StatusConflict,
},
"without StatusCoder": {
err: errors.New("plain error"),
expect: http.StatusInternalServerError,
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
t.Parallel()
assert.Equal(t, tc.expect, api.ErrorStatus(tc.err))
})
}
}