Skip to content

Commit ccefa4d

Browse files
committed
feat: adding resource loader interface and default implement
1 parent 5a3b114 commit ccefa4d

File tree

7 files changed

+214
-79
lines changed

7 files changed

+214
-79
lines changed

cmd/run.go

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"fmt"
66
"io"
77
"os"
8-
"path"
9-
"path/filepath"
108
"strings"
119
"sync"
1210
"time"
@@ -16,7 +14,6 @@ import (
1614
"github.com/linuxsuren/api-testing/pkg/render"
1715
"github.com/linuxsuren/api-testing/pkg/runner"
1816
"github.com/linuxsuren/api-testing/pkg/testing"
19-
"github.com/linuxsuren/api-testing/pkg/util"
2017
"github.com/spf13/cobra"
2118
"golang.org/x/sync/semaphore"
2219
)
@@ -134,19 +131,14 @@ func (o *runOption) runE(cmd *cobra.Command, args []string) (err error) {
134131
o.limiter.Stop()
135132
}()
136133

137-
var suites []string
138-
for _, pattern := range util.Expand(o.pattern) {
139-
var files []string
140-
if files, err = filepath.Glob(pattern); err == nil {
141-
suites = append(suites, files...)
142-
}
134+
loader := testing.NewFileLoader()
135+
if err = loader.Put(o.pattern); err != nil {
136+
return
143137
}
144138

145-
cmd.Println("found suites:", len(suites))
146-
for i := range suites {
147-
item := suites[i]
148-
cmd.Println("run suite:", item)
149-
if err = o.runSuiteWithDuration(item); err != nil {
139+
cmd.Println("found suites:", loader.GetCount())
140+
for loader.HasMore() {
141+
if err = o.runSuiteWithDuration(loader); err != nil {
150142
break
151143
}
152144
}
@@ -166,7 +158,7 @@ func (o *runOption) runE(cmd *cobra.Command, args []string) (err error) {
166158
return
167159
}
168160

169-
func (o *runOption) runSuiteWithDuration(suite string) (err error) {
161+
func (o *runOption) runSuiteWithDuration(loader testing.Loader) (err error) {
170162
sem := semaphore.NewWeighted(o.thread)
171163
stop := false
172164
var timeout *time.Ticker
@@ -204,7 +196,7 @@ func (o *runOption) runSuiteWithDuration(suite string) (err error) {
204196
}()
205197

206198
dataContext := getDefaultContext()
207-
ch <- o.runSuite(suite, dataContext, o.context, stopSingal)
199+
ch <- o.runSuite(loader, dataContext, o.context, stopSingal)
208200
}(errChannel, sem)
209201
if o.duration <= 0 {
210202
stop = true
@@ -221,9 +213,14 @@ func (o *runOption) runSuiteWithDuration(suite string) (err error) {
221213
return
222214
}
223215

224-
func (o *runOption) runSuite(suite string, dataContext map[string]interface{}, ctx context.Context, stopSingal chan struct{}) (err error) {
216+
func (o *runOption) runSuite(loader testing.Loader, dataContext map[string]interface{}, ctx context.Context, stopSingal chan struct{}) (err error) {
217+
var data []byte
218+
if data, err = loader.Load(); err != nil {
219+
return
220+
}
221+
225222
var testSuite *testing.TestSuite
226-
if testSuite, err = testing.Parse(suite); err != nil {
223+
if testSuite, err = testing.Parse(data); err != nil {
227224
return
228225
}
229226

@@ -253,7 +250,7 @@ func (o *runOption) runSuite(suite string, dataContext map[string]interface{}, c
253250
o.limiter.Accept()
254251

255252
ctxWithTimeout, _ := context.WithTimeout(ctx, o.requestTimeout)
256-
ctxWithTimeout = context.WithValue(ctxWithTimeout, runner.ContextKey("").ParentDir(), path.Dir(suite))
253+
ctxWithTimeout = context.WithValue(ctxWithTimeout, runner.ContextKey("").ParentDir(), loader.GetContext())
257254

258255
simpleRunner := runner.NewSimpleTestCaseRunner()
259256
simpleRunner.WithTestReporter(o.reporter)

cmd/run_test.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/h2non/gock"
1414
"github.com/linuxsuren/api-testing/pkg/limit"
15+
atest "github.com/linuxsuren/api-testing/pkg/testing"
1516
"github.com/linuxsuren/api-testing/pkg/util"
1617
fakeruntime "github.com/linuxsuren/go-fake-runtime"
1718
"github.com/spf13/cobra"
@@ -58,8 +59,13 @@ func TestRunSuite(t *testing.T) {
5859
opt.limiter = limit.NewDefaultRateLimiter(0, 0)
5960
stopSingal := make(chan struct{}, 1)
6061

61-
err := opt.runSuite(tt.suiteFile, ctx, context.TODO(), stopSingal)
62-
assert.Equal(t, tt.hasError, err != nil, err)
62+
loader := atest.NewFileLoader()
63+
err := loader.Put(tt.suiteFile)
64+
assert.NoError(t, err)
65+
if loader.HasMore() {
66+
err = opt.runSuite(loader, ctx, context.TODO(), stopSingal)
67+
assert.Equal(t, tt.hasError, err != nil, err)
68+
}
6369
})
6470
}
6571
}

pkg/testing/loader.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package testing
2+
3+
// Loader is an interface for test cases loader
4+
type Loader interface {
5+
HasMore() bool
6+
Load() ([]byte, error)
7+
Put(string) (err error)
8+
GetContext() string
9+
GetCount() int
10+
}

pkg/testing/loader_file.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package testing
2+
3+
import (
4+
"os"
5+
"path"
6+
"path/filepath"
7+
8+
"github.com/linuxsuren/api-testing/pkg/util"
9+
)
10+
11+
type fileLoader struct {
12+
paths []string
13+
index int
14+
}
15+
16+
// NewFileLoader creates the instance of file loader
17+
func NewFileLoader() Loader {
18+
return &fileLoader{index: -1}
19+
}
20+
21+
// HasMore returns if there are more test cases
22+
func (l *fileLoader) HasMore() bool {
23+
l.index++
24+
return l.index < len(l.paths)
25+
}
26+
27+
// Load returns the test case content
28+
func (l *fileLoader) Load() (data []byte, err error) {
29+
data, err = os.ReadFile(l.paths[l.index])
30+
return
31+
}
32+
33+
// Put adds the test case path
34+
func (l *fileLoader) Put(item string) (err error) {
35+
for _, pattern := range util.Expand(item) {
36+
var files []string
37+
if files, err = filepath.Glob(pattern); err == nil {
38+
l.paths = append(l.paths, files...)
39+
}
40+
}
41+
return
42+
}
43+
44+
// GetContext returns the context of current test case
45+
func (l *fileLoader) GetContext() string {
46+
return path.Dir(l.paths[l.index])
47+
}
48+
49+
// GetCount returns the count of test cases
50+
func (l *fileLoader) GetCount() int {
51+
return len(l.paths)
52+
}

pkg/testing/loader_file_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package testing_test
2+
3+
import (
4+
"testing"
5+
6+
atest "github.com/linuxsuren/api-testing/pkg/testing"
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestFileLoader(t *testing.T) {
11+
tests := []struct {
12+
name string
13+
items []string
14+
verify func(t *testing.T, loader atest.Loader)
15+
}{{
16+
name: "empty",
17+
items: []string{},
18+
verify: func(t *testing.T, loader atest.Loader) {
19+
assert.False(t, loader.HasMore())
20+
assert.Empty(t, loader.GetCount())
21+
},
22+
}, {
23+
name: "brace expansion path",
24+
items: []string{"testdata/{invalid-,}testcase.yaml"},
25+
verify: defaultVerify,
26+
}, {
27+
name: "glob path",
28+
items: []string{"testdata/*testcase.yaml"},
29+
verify: defaultVerify,
30+
}}
31+
for _, tt := range tests {
32+
t.Run(tt.name, func(t *testing.T) {
33+
loader := atest.NewFileLoader()
34+
for _, item := range tt.items {
35+
loader.Put(item)
36+
}
37+
tt.verify(t, loader)
38+
})
39+
}
40+
}
41+
42+
func defaultVerify(t *testing.T, loader atest.Loader) {
43+
assert.True(t, loader.HasMore())
44+
data, err := loader.Load()
45+
assert.Nil(t, err)
46+
assert.Equal(t, invalidTestCaseContent, string(data))
47+
assert.Equal(t, "testdata", loader.GetContext())
48+
49+
assert.True(t, loader.HasMore())
50+
data, err = loader.Load()
51+
assert.Nil(t, err)
52+
assert.Equal(t, testCaseContent, string(data))
53+
assert.Equal(t, "testdata", loader.GetContext())
54+
55+
assert.False(t, loader.HasMore())
56+
}

pkg/testing/parser.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@ import (
1919
)
2020

2121
// Parse parses a file and returns the test suite
22-
func Parse(configFile string) (testSuite *TestSuite, err error) {
23-
var data []byte
24-
if data, err = os.ReadFile(configFile); err == nil {
25-
testSuite, err = ParseFromData(data)
26-
}
22+
func Parse(data []byte) (testSuite *TestSuite, err error) {
23+
testSuite, err = ParseFromData(data)
2724

2825
// schema validation
2926
if err == nil {
@@ -116,7 +113,7 @@ func (r *Request) Render(ctx interface{}, dataDir string) (err error) {
116113
}
117114

118115
// setting default values
119-
r.Method = emptyThenDefault(r.Method, http.MethodGet)
116+
r.Method = EmptyThenDefault(r.Method, http.MethodGet)
120117
return
121118
}
122119

@@ -153,18 +150,20 @@ func (r *Request) GetBody() (reader io.Reader, err error) {
153150

154151
// Render renders the response
155152
func (r *Response) Render(ctx interface{}) (err error) {
156-
r.StatusCode = zeroThenDefault(r.StatusCode, http.StatusOK)
153+
r.StatusCode = ZeroThenDefault(r.StatusCode, http.StatusOK)
157154
return
158155
}
159156

160-
func zeroThenDefault(val, defVal int) int {
157+
// ZeroThenDefault return the default value if the val is zero
158+
func ZeroThenDefault(val, defVal int) int {
161159
if val == 0 {
162160
val = defVal
163161
}
164162
return val
165163
}
166164

167-
func emptyThenDefault(val, defVal string) string {
165+
// EmptyThenDefault return the default value if the val is empty
166+
func EmptyThenDefault(val, defVal string) string {
168167
if strings.TrimSpace(val) == "" {
169168
val = defVal
170169
}

0 commit comments

Comments
 (0)