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
package common
import (
"fmt"
"net/http"
"os"
"testing"
"github.com/jarcoal/httpmock"
)
const (
username = "admin"
password = "admin"
baseHost = "http://localhost"
usersUrl = "/api/v1/users"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
var users = []User{{ID: 1, Name: "Guanghongwei", Age: 18}, {ID: 2, Name: "ibuler", Age: 19}}
var user = User{ID: 2, Name: "Jumpserver", Age: 5}
var userDeleteUrl = fmt.Sprintf("%s/%d", usersUrl, user.ID)
func TestClient_Do(t *testing.T) {
c := NewClient(10, "")
err := c.Do("GET", usersUrl, nil, nil)
if err == nil {
t.Error("Failed Do(), want get err but not")
}
c.SetBasicAuth(username, password)
var res []User
err = c.Do("GET", usersUrl, nil, &res)
if err != nil {
t.Errorf("Failed Do() error: %s", err.Error())
}
if len(res) != 2 {
t.Errorf("user not equal 2: %d", len(res))
}
}
func TestClient_Get(t *testing.T) {
c := NewClient(10, baseHost)
err := c.Get(usersUrl, nil)
if err == nil {
t.Errorf("Failed Get(%s): want get err but not", usersUrl)
}
c.SetBasicAuth(username, password)
err = c.Get(usersUrl, nil)
if err != nil {
t.Errorf("Failed Get(%s): %s", usersUrl, err.Error())
}
}
func TestClient_Post(t *testing.T) {
c := NewClient(10, baseHost)
var userCreated User
err := c.Post(usersUrl, user, &userCreated)
if err != nil {
t.Errorf("Failed Post(): %s", err.Error())
}
if userCreated.ID != user.ID {
t.Errorf("Failed Post(), id not euqal: %d != %d", userCreated.ID, user.ID)
}
}
func TestClient_Put(t *testing.T) {
c := NewClient(10, "")
var userUpdated User
err := c.Put(usersUrl, user, &userUpdated)
if err != nil {
t.Errorf("Failed Put(): %s", err.Error())
}
if userUpdated.ID != user.ID {
t.Errorf("Failed Post(), id not euqal: %d != %d", userUpdated.ID, user.ID)
}
}
func TestClient_Delete(t *testing.T) {
c := NewClient(10, baseHost)
c.SetBasicAuth(username, password)
err := c.Delete(userDeleteUrl, nil)
if err != nil {
t.Errorf("Failed Delete(): %s", err.Error())
}
}
func PrepareMockData() {
httpmock.RegisterResponder("GET", usersUrl,
func(req *http.Request) (*http.Response, error) {
u, p, ok := req.BasicAuth()
if !ok || u != username || p != password {
return httpmock.NewStringResponse(401, ""), nil
}
resp, err := httpmock.NewJsonResponse(200, users)
if err != nil {
return httpmock.NewStringResponse(500, ""), nil
}
return resp, nil
},
)
resp, err := httpmock.NewJsonResponder(201, user)
if err != nil {
fmt.Println("Create post reps failed")
}
httpmock.RegisterResponder("POST", usersUrl, resp)
httpmock.RegisterResponder("PUT", usersUrl, resp)
httpmock.RegisterResponder("DELETE", userDeleteUrl, httpmock.NewStringResponder(204, ""))
}
func TestMain(m *testing.M) {
httpmock.Activate()
PrepareMockData()
defer httpmock.DeactivateAndReset()
code := m.Run()
os.Exit(code)
}