-
Notifications
You must be signed in to change notification settings - Fork 9
/
digestRequest_test.go
131 lines (110 loc) · 3.04 KB
/
digestRequest_test.go
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
package digestRequest
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"strings"
"testing"
"github.com/abbot/go-http-auth"
"github.com/pkg/errors"
"golang.org/x/net/context"
)
func testRequest(h http.HandlerFunc, setClient func(context.Context) context.Context) error {
ctx := context.Background()
if setClient != nil {
ctx = setClient(ctx)
}
ts := httptest.NewServer(h)
defer ts.Close()
r := New(ctx, "john", "hello")
req, err := http.NewRequest("GET", ts.URL, nil)
if err != nil {
return errors.Wrap(err, "error in NewRequest")
}
resp, err := r.Do(req)
if err != nil {
return errors.Wrap(err, "error in Do")
}
defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK {
return errors.Errorf("error status code: %s", resp.Status)
}
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return errors.Wrap(err, "error in ReadAll")
}
if string(b) != "OK" {
return errors.Errorf("invalid body: %s", string(b))
}
return nil
}
// digestHandler is written with referring to
// https://github.com/abbot/go-http-auth/blob/master/examples/digest.go
var digestHandler = func() http.HandlerFunc {
a := auth.NewDigestAuthenticator("example.com", func(user, realm string) string {
if user == "john" {
return "b98e16cbc3d01734b264adba7baa3bf9" // password is "hello"
}
return ""
})
return a.Wrap(func(w http.ResponseWriter, r *auth.AuthenticatedRequest) {
fmt.Fprintf(w, "OK")
})
}()
func TestDigestRequestWithClient(t *testing.T) {
err := testRequest(digestHandler, func(ctx context.Context) context.Context {
return ContextWithClient(ctx, http.DefaultClient)
})
if err != nil {
t.Errorf("error in testRequest: %v", err)
}
}
func TestDigestRequestWithoutClient(t *testing.T) {
if err := testRequest(digestHandler, nil); err != nil {
t.Errorf("error in testRequest: %v", err)
}
}
func testNormalRequest(writer func(w http.ResponseWriter)) error {
return testRequest(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
writer(w)
}),
nil,
)
}
func TestNormalRequest(t *testing.T) {
err := testNormalRequest(func(w http.ResponseWriter) {
fmt.Fprintf(w, "OK")
})
if err != nil {
t.Errorf("error in testRequest: %v", err)
}
}
func TestNormalRequestWithUnauthorizedError(t *testing.T) {
err := testNormalRequest(func(w http.ResponseWriter) {
http.Error(w, "OK", http.StatusUnauthorized)
})
if !strings.Contains(err.Error(), "headers do not have Www-Authenticate") {
t.Errorf("different error: %v", err)
}
}
func TestNormalRequestWithInvalidHeaders(t *testing.T) {
err := testNormalRequest(func(w http.ResponseWriter) {
w.Header().Set(wwwAuthenticate, "hoge")
http.Error(w, "OK", http.StatusUnauthorized)
})
if !strings.Contains(err.Error(), "header is invalid") {
t.Errorf("different error: %v", err)
}
}
func TestInvalidRequests(t *testing.T) {
req, err := http.NewRequest("GET", "", nil) // invalid request
if err != nil {
t.Fatalf("error in NewRequest: %v", err)
}
_, err = New(context.Background(), "", "").Do(req)
if err == nil {
t.Fatalf("no error")
}
}