-
Notifications
You must be signed in to change notification settings - Fork 139
/
context.go
136 lines (112 loc) · 2.96 KB
/
context.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
package defaultctx
import (
"errors"
"fmt"
"github.com/ovh/venom"
yaml "gopkg.in/yaml.v2"
)
// Name is Context Type name.
const Name = "default"
// New returns a new TestCaseContext.
func New() venom.TestCaseContext {
ctx := &DefaultTestCaseContext{}
ctx.Name = Name
return ctx
}
// DefaultTestCaseContext represents the context of a testcase.
type DefaultTestCaseContext struct {
venom.CommonTestCaseContext
datas map[string]interface{}
}
// Init Initialize the context.
func (tcc *DefaultTestCaseContext) Init() error {
tcc.datas = tcc.TestCase.Context
return nil
}
// Close the context.
func (tcc *DefaultTestCaseContext) Close() error {
return nil
}
// GetString returns string from default context.
func (tcc *DefaultTestCaseContext) GetString(key string) (string, error) {
if tcc.datas[key] == nil {
return "", NotFound(key)
}
result, ok := tcc.datas[key].(string)
if !ok {
return "", InvalidArgument(key)
}
return result, nil
}
// GetFloat returns float64 from default context.
func (tcc *DefaultTestCaseContext) GetFloat(key string) (float64, error) {
if tcc.datas[key] == nil {
return 0, NotFound(key)
}
result, ok := tcc.datas[key].(float64)
if !ok {
return 0, InvalidArgument(key)
}
return result, nil
}
// GetInt returns int from default context.
func (tcc *DefaultTestCaseContext) GetInt(key string) (int, error) {
res, err := tcc.GetFloat(key)
if err != nil {
return 0, err
}
return int(res), nil
}
// GetBool returns bool from default context.
func (tcc *DefaultTestCaseContext) GetBool(key string) (bool, error) {
if tcc.datas[key] == nil {
return false, NotFound(key)
}
result, ok := tcc.datas[key].(bool)
if !ok {
return false, InvalidArgument(key)
}
return result, nil
}
// GetStringSlice returns string slice from default context.
func (tcc *DefaultTestCaseContext) GetStringSlice(key string) ([]string, error) {
if tcc.datas[key] == nil {
return nil, NotFound(key)
}
stringSlice, ok := tcc.datas[key].([]string)
if ok {
return stringSlice, nil
}
slice, ok := tcc.datas[key].([]interface{})
if !ok {
return nil, InvalidArgument(key)
}
res := make([]string, len(slice))
for k, v := range slice {
s, ok := v.(string)
if !ok {
return nil, errors.New("cannot cast to string")
}
res[k] = s
}
return res, nil
}
// GetComplex unmarshal argument in struct from default context.
func (tcc *DefaultTestCaseContext) GetComplex(key string, arg interface{}) error {
if tcc.datas[key] == nil {
return NotFound(key)
}
val, err := yaml.Marshal(tcc.datas[key])
if err != nil {
return err
}
err = yaml.Unmarshal(val, arg)
if err != nil {
return err
}
return nil
}
// NotFound is error returned when trying to get missing argument
func NotFound(key string) error { return fmt.Errorf("missing context argument '%s'", key) }
// InvalidArgument is error returned when trying to cast argument with wrong type
func InvalidArgument(key string) error { return fmt.Errorf("invalid context argument type '%s'", key) }