Skip to content

Commit d5dd821

Browse files
committed
tests and travi ci kickstart
1 parent 17fb876 commit d5dd821

File tree

5 files changed

+545
-256
lines changed

5 files changed

+545
-256
lines changed

.travis.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
language: go
2+
3+
go:
4+
- 1.11.x
5+
- "1.10"
6+
7+
script:
8+
- go test ./...

_examples/example_test.go

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package _examples
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
"time"
7+
8+
"github.com/ompluscator/dynamic-struct"
9+
"gopkg.in/go-playground/validator.v9"
10+
)
11+
12+
func TestExample(t *testing.T) {
13+
instances := []interface{}{
14+
getReaderWithNewStructForJsonExample(),
15+
getReaderWithExtendedStructForJsonExample(),
16+
getReaderWithMergedStructsForJsonExample(),
17+
getReaderWithNewStructForFormExample(),
18+
getReaderWithExtendedStructForFormExample(),
19+
getReaderWithMergedStructsForFormExample(),
20+
}
21+
22+
for _, instance := range instances {
23+
if instance == nil {
24+
t.Error(`TestExample - expected not to get nil`)
25+
}
26+
27+
reader := dynamicstruct.NewReader(instance)
28+
29+
if value := reader.GetField("Integer").Int(); value != 123 {
30+
t.Errorf(`TestExample - expected field "Integer" to be %#v got %#v`, 123, value)
31+
}
32+
33+
if value := reader.GetField("Uinteger").Uint(); value != uint(456) {
34+
t.Errorf(`TestExample - expected field "Uinteger" to be %#v got %#v`, uint(456), value)
35+
}
36+
37+
if value := reader.GetField("Text").String(); value != "example" {
38+
t.Errorf(`TestExample - expected field "Text" to be %#v got %#v`, "example", value)
39+
}
40+
41+
if value := reader.GetField("Float").Float64(); value != 123.45 {
42+
t.Errorf(`TestExample - expected field "Float" to be %#v got %#v`, 123.45, value)
43+
}
44+
45+
dateTime, err := time.Parse(time.RFC3339, "2018-12-27T19:42:31+07:00")
46+
if err != nil {
47+
t.Errorf(`TestExample - expected not to get error got %#v`, err)
48+
}
49+
if value := reader.GetField("Time").Time(); !reflect.DeepEqual(value, dateTime) {
50+
t.Errorf(`TestExample - expected field "Time" to be %#v got %#v`, dateTime, value)
51+
}
52+
53+
if value, ok := reader.GetField("Slice").Interface().([]int); !ok || !reflect.DeepEqual(value, []int{1, 2, 3}) {
54+
t.Errorf(`TestExample - expected field "Slice" to be %#v got %#v`, []int{1, 2, 3}, value)
55+
}
56+
57+
if value := reader.GetField("PointerInteger").PointerInt(); *value != 345 {
58+
t.Errorf(`TestExample - expected field "PointerInteger" to be %#v got %#v`, 345, *value)
59+
}
60+
61+
if value := reader.GetField("PointerUinteger").PointerUint(); *value != uint(234) {
62+
t.Errorf(`TestExample - expected field "PointerUinteger" to be %#v got %#v`, uint(234), *value)
63+
}
64+
65+
if value := reader.GetField("PointerFloat").PointerFloat64(); *value != 567.89 {
66+
t.Errorf(`TestExample - expected field "PointerFloat" to be %#v got %#v`, 567.89, *value)
67+
}
68+
69+
if value := reader.GetField("PointerText").PointerString(); *value != "pointer example" {
70+
t.Errorf(`TestExample - expected field "PointerText" to be %#v got %#v`, "pointer example", *value)
71+
}
72+
73+
if value := reader.GetField("PointerBoolean").PointerBool(); *value != true {
74+
t.Errorf(`TestExample - expected field "PointerBoolean" to be %#v got %#v`, true, *value)
75+
}
76+
77+
pointerDateTime, err := time.Parse(time.RFC3339, "2018-12-28T01:23:45+07:00")
78+
if err != nil {
79+
t.Errorf(`TestExample - expected not to get error got %#v`, err)
80+
}
81+
if value := reader.GetField("PointerTime").PointerTime(); !reflect.DeepEqual(value, &pointerDateTime) {
82+
t.Errorf(`TestExample - expected field "PointerTime" to be %#v got %#v`, pointerDateTime, *value)
83+
}
84+
85+
if value := reader.GetField("Anonymous").String(); value != "" {
86+
t.Errorf(`TestExample - expected field "Anonymous" to be empty got %#v`, value)
87+
}
88+
89+
subReader := dynamicstruct.NewReader(reader.GetField("SubStruct").Interface())
90+
91+
if value := subReader.GetField("Integer").Int(); value != 12 {
92+
t.Errorf(`TestExample - expected field "Integer" to be %#v got %#v`, 12, value)
93+
}
94+
95+
if value := subReader.GetField("Text").String(); value != "sub example" {
96+
t.Errorf(`TestExample - expected field "Text" to be %#v got %#v`, "sub example", value)
97+
}
98+
99+
err = validator.New().Struct(instance)
100+
if err == nil {
101+
t.Errorf(`TestExample - expected to have error got %#v`, err)
102+
}
103+
104+
validationErrors, ok := err.(validator.ValidationErrors)
105+
if !ok {
106+
t.Errorf(`TestExample - expected instance of *validator.ValidationErrors got %#v`, instance)
107+
}
108+
109+
for _, fieldError := range validationErrors {
110+
fieldError.Tag()
111+
}
112+
113+
fieldErrors := []validator.FieldError(validationErrors)
114+
if len(fieldErrors) != 2 {
115+
t.Errorf(`TestExample - expected field errors to have length %#v got %#v`, 2, len(fieldErrors))
116+
}
117+
118+
checkedInteger := false
119+
checkedText := false
120+
for _, fieldError := range fieldErrors {
121+
if fieldError.Field() == "Integer" {
122+
checkedInteger = true
123+
124+
if fieldError.Tag() != "lt" {
125+
t.Errorf(`TestExample - expected tag of field error to be %#v got %#v`, "lt", fieldError.Tag())
126+
}
127+
128+
if fieldError.Param() != "123" {
129+
t.Errorf(`TestExample - expected param of field error to be %#v got %#v`, "123", fieldError.Param())
130+
}
131+
} else if fieldError.Field() == "Anonymous" {
132+
checkedText = true
133+
134+
if fieldError.Tag() != "required" {
135+
t.Errorf(`TestExample - expected tag of field error to be %#v got %#v`, "required", fieldError.Tag())
136+
}
137+
}
138+
}
139+
140+
if !checkedInteger {
141+
t.Error(`TestExample - expected to have field errors for field "Integer"`)
142+
}
143+
144+
if !checkedText {
145+
t.Error(`TestExample - expected to have field errors for field "Anonymous"`)
146+
}
147+
}
148+
}

_examples/form.go

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
package _examples
2+
3+
import (
4+
"net/url"
5+
"time"
6+
7+
"github.com/go-playground/form"
8+
"github.com/leebenson/conform"
9+
"github.com/ompluscator/dynamic-struct"
10+
)
11+
12+
func getReaderWithNewStructForFormExample() interface{} {
13+
integer := 0
14+
uinteger := uint(0)
15+
str := ""
16+
float := 0.0
17+
boolean := false
18+
19+
subInstance := dynamicstruct.NewStruct().
20+
AddField("Integer", integer, "").
21+
AddField("Text", str, `form:"subText" conform:"trim"`).
22+
Build().
23+
New()
24+
25+
instance := dynamicstruct.NewStruct().
26+
AddField("Integer", integer, `form:"int" validate:"lt=123"`).
27+
AddField("Uinteger", uinteger, `validate:"gte=0"`).
28+
AddField("Text", str, `form:"someText" conform:"trim"`).
29+
AddField("Float", float, `form:"double"`).
30+
AddField("Boolean", boolean, "").
31+
AddField("Time", time.Time{}, "").
32+
AddField("Slice", []int{}, "").
33+
AddField("PointerInteger", &integer, "").
34+
AddField("PointerUinteger", &uinteger, "").
35+
AddField("PointerText", &str, `conform:"trim"`).
36+
AddField("PointerFloat", &float, "").
37+
AddField("PointerBoolean", &boolean, "").
38+
AddField("PointerTime", &time.Time{}, "").
39+
AddField("SubStruct", subInstance, `form:"subData"`).
40+
AddField("Anonymous", "", `form:"-" validate:"required"`).
41+
Build().
42+
New()
43+
44+
data := url.Values{
45+
"int": []string{"123"},
46+
"Uinteger": []string{"456"},
47+
"someText": []string{" example "},
48+
"double": []string{"123.45"},
49+
"Boolean": []string{"true"},
50+
"Time": []string{"2018-12-27T19:42:31+07:00"},
51+
"Slice": []string{"1", "2", "3"},
52+
"PointerInteger": []string{"345"},
53+
"PointerUinteger": []string{"234"},
54+
"PointerFloat": []string{"567.89"},
55+
"PointerText": []string{" pointer example "},
56+
"PointerBoolean": []string{"true"},
57+
"PointerTime": []string{"2018-12-28T01:23:45+07:00"},
58+
"subData.Integer": []string{"12"},
59+
"subData.subText": []string{" sub example "},
60+
"Anonymous": []string{"avoid to read"},
61+
}
62+
63+
decoder := form.NewDecoder()
64+
65+
err := decoder.Decode(&instance, data)
66+
if err != nil {
67+
return nil
68+
}
69+
70+
err = conform.Strings(instance)
71+
if err != nil {
72+
return nil
73+
}
74+
75+
return instance
76+
}
77+
78+
func getReaderWithExtendedStructForFormExample() interface{} {
79+
integer := 0
80+
uinteger := uint(0)
81+
str := ""
82+
float := 0.0
83+
boolean := false
84+
85+
instance := dynamicstruct.ExtendStruct(struct {
86+
Integer int `form:"int" validate:"lt=123"`
87+
Uinteger uint `validate:"gte=0"`
88+
Text string `form:"someText" conform:"trim"`
89+
Float float64 `form:"double"`
90+
Boolean bool
91+
Slice []int
92+
Time time.Time
93+
SubStruct struct {
94+
Integer int
95+
Text string `form:"subText" conform:"trim"`
96+
} `form:"subData"`
97+
}{}).
98+
AddField("PointerInteger", &integer, "").
99+
AddField("PointerUinteger", &uinteger, "").
100+
AddField("PointerText", &str, `conform:"trim"`).
101+
AddField("PointerFloat", &float, "").
102+
AddField("PointerBoolean", &boolean, "").
103+
AddField("PointerTime", &time.Time{}, "").
104+
AddField("Anonymous", "", `form:"-" validate:"required"`).
105+
Build().
106+
New()
107+
108+
data := url.Values{
109+
"int": []string{"123"},
110+
"Uinteger": []string{"456"},
111+
"someText": []string{" example "},
112+
"double": []string{"123.45"},
113+
"Boolean": []string{"true"},
114+
"Time": []string{"2018-12-27T19:42:31+07:00"},
115+
"Slice": []string{"1", "2", "3"},
116+
"PointerInteger": []string{"345"},
117+
"PointerUinteger": []string{"234"},
118+
"PointerFloat": []string{"567.89"},
119+
"PointerText": []string{" pointer example "},
120+
"PointerBoolean": []string{"true"},
121+
"PointerTime": []string{"2018-12-28T01:23:45+07:00"},
122+
"subData.Integer": []string{"12"},
123+
"subData.subText": []string{" sub example "},
124+
"Anonymous": []string{"avoid to read"},
125+
}
126+
127+
decoder := form.NewDecoder()
128+
129+
err := decoder.Decode(&instance, data)
130+
if err != nil {
131+
return nil
132+
}
133+
134+
err = conform.Strings(instance)
135+
if err != nil {
136+
return nil
137+
}
138+
139+
return instance
140+
}
141+
142+
func getReaderWithMergedStructsForFormExample() interface{} {
143+
instance := dynamicstruct.MergeStructs(struct {
144+
Integer int `form:"int" validate:"lt=123"`
145+
Uinteger uint `validate:"gte=0"`
146+
Text string `form:"someText" conform:"trim"`
147+
Float float64 `form:"double"`
148+
Boolean bool
149+
Slice []int
150+
Time time.Time
151+
}{}, struct {
152+
Anonymous string `form:"-" validate:"required"`
153+
SubStruct struct {
154+
Integer int
155+
Text string `form:"subText" conform:"trim"`
156+
} `form:"subData"`
157+
}{}, struct {
158+
PointerInteger *int
159+
PointerUinteger *uint
160+
PointerText *string `conform:"trim"`
161+
PointerFloat *float64
162+
PointerBoolean *bool
163+
PointerTime *time.Time
164+
}{}).
165+
Build().
166+
New()
167+
168+
data := url.Values{
169+
"int": []string{"123"},
170+
"Uinteger": []string{"456"},
171+
"someText": []string{" example "},
172+
"double": []string{"123.45"},
173+
"Boolean": []string{"true"},
174+
"Time": []string{"2018-12-27T19:42:31+07:00"},
175+
"Slice": []string{"1", "2", "3"},
176+
"PointerInteger": []string{"345"},
177+
"PointerUinteger": []string{"234"},
178+
"PointerFloat": []string{"567.89"},
179+
"PointerText": []string{" pointer example "},
180+
"PointerBoolean": []string{"true"},
181+
"PointerTime": []string{"2018-12-28T01:23:45+07:00"},
182+
"subData.Integer": []string{"12"},
183+
"subData.subText": []string{" sub example "},
184+
"Anonymous": []string{"avoid to read"},
185+
}
186+
187+
decoder := form.NewDecoder()
188+
189+
err := decoder.Decode(&instance, data)
190+
if err != nil {
191+
return nil
192+
}
193+
194+
err = conform.Strings(instance)
195+
if err != nil {
196+
return nil
197+
}
198+
199+
return instance
200+
}

0 commit comments

Comments
 (0)