-
Notifications
You must be signed in to change notification settings - Fork 6
/
response_default_test.go
137 lines (120 loc) · 2.79 KB
/
response_default_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
132
133
134
135
136
137
package restit
import (
"encoding/json"
"errors"
"testing"
)
var testJsonList = `{
"code": 200,
"status": "success",
"items": [
{
"id": 1,
"title": "item 1",
"desc": "item 1 desc"
},
{
"id": 2,
"title": "item 2",
"desc": "item 2 desc",
"Hello": "world",
"Foo": "invisible"
},
{
"id": 3,
"title": "item 3",
"desc": "item 2 desc"
}
]
}`
type testItem struct {
ID int `json:"id"`
Title string `json:"title"`
Desc string `json:"desc"`
Hello string
Foo string `json:"-"`
}
func TestDefaultResponse(t *testing.T) {
var r Response = &DefaultResponse{}
_ = r
t.Log("*DefaultResponse implements Response")
}
func TestDefaultResponseResp1(t *testing.T) {
// define a response with item type as testItem
// and item list field named "items"
p := NewResponse("items", testItem{})
// set validator
p.SetValidator(func(in interface{}) error {
a := in.(testItem)
if a.Title == "" {
return errors.New("Incorrect item")
}
return nil
})
// set matcher
p.SetMatcher(func(a interface{}, b interface{}) (err error) {
aItem := a.(testItem)
bItem := b.(testItem)
if aItem.Title != bItem.Title {
err = errors.New("Title mismatch")
} else if aItem.Desc != bItem.Desc {
err = errors.New("Desc mismatch")
} else if aItem.Hello != bItem.Hello {
err = errors.New("Hello mismatch")
} else if aItem.Foo != bItem.Foo {
err = errors.New("Foo mismatch")
}
return
})
// decode testJsonList with *DefaultResponse
json.Unmarshal([]byte(testJsonList), &p)
// test result
nth, err := p.GetNth(1)
if err != nil {
t.Errorf(err.Error())
}
item := nth.(testItem)
t.Logf("Successfully cast item to testItem:\n%#v", item)
// test if items match the json input
if err := p.Match(item, testItem{
ID: 2,
Title: "item 2",
Desc: "item 2 desc",
Hello: "world",
}); err != nil {
t.Errorf("Failed to set JSON value correctly")
} else {
t.Logf("JSON value set correctly")
}
}
func TestDefaultResponseResp2(t *testing.T) {
// define a response with wrong item list field name
p := NewResponse("not_exists", testItem{})
// set validator
p.SetValidator(func(in interface{}) error {
a := in.(testItem)
if a.Title == "" {
return errors.New("Incorrect item")
}
return nil
})
// set matcher
p.SetMatcher(func(a interface{}, b interface{}) (err error) {
aItem := a.(testItem)
bItem := b.(testItem)
if aItem.Title != bItem.Title {
err = errors.New("Title mismatch")
} else if aItem.Desc != bItem.Desc {
err = errors.New("Desc mismatch")
} else if aItem.Hello != bItem.Hello {
err = errors.New("Hello mismatch")
} else if aItem.Foo != bItem.Foo {
err = errors.New("Foo mismatch")
}
return
})
// decode testJsonList with *DefaultResponse
json.Unmarshal([]byte(testJsonList), &p)
// no panic is a pass
return
}