-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathloader.go
More file actions
121 lines (99 loc) · 2.94 KB
/
Copy pathloader.go
File metadata and controls
121 lines (99 loc) · 2.94 KB
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
package framework
import (
"os"
"path/filepath"
"strings"
"github.com/pkg/errors"
)
const (
defaultTestFileGlobPattern = "*.test.yaml"
)
// Loader loads a test suite.
type Loader struct {
globPattern string
rootDir string
}
// NewLoader returns a a loader and applies options to it.
func NewLoader(rootDir string, opts ...LoaderOpt) *Loader {
loader := Loader{
rootDir: rootDir,
globPattern: defaultTestFileGlobPattern,
}
for _, opt := range opts {
opt(&loader)
}
return &loader
}
// LoaderOpts allows to set custom options.
type LoaderOpt func(loader *Loader)
// WithCustomFilePattern sets a custom file pattern to load test files.
func WithCustomFilePattern(pattern string) LoaderOpt {
return func(loader *Loader) {
loader.globPattern = pattern
}
}
// LoadSuite loads a helmtest suite from the given directory.
func (loader *Loader) LoadSuite() (*Test, error) {
var suite Test
if err := unmarshalYamlFromFileStrict(filepath.Join(loader.rootDir, "suite.yaml"), &suite); err != nil && !os.IsNotExist(err) {
return nil, errors.Wrap(err, "loading suite specification")
}
if suite.Name == "" {
suite.Name = strings.TrimRight(loader.rootDir, "/")
}
// Locate test files, if any.
testYAMLFiles, err := filepath.Glob(filepath.Join(loader.rootDir, loader.globPattern))
if err != nil {
return nil, errors.Wrap(err, "globbing for .test.yaml files")
}
for _, file := range testYAMLFiles {
test := Test{
parent: &suite,
}
if err := unmarshalYamlFromFileStrict(file, &test); err != nil {
return nil, errors.Wrapf(err, "loading test specification from file %s", file)
}
if test.Name == "" {
test.Name = filepath.Base(file)
}
suite.Tests = append(suite.Tests, &test)
}
if err := suite.initialize(); err != nil {
return nil, err
}
return &suite, nil
}
// LoadSuiteWithFlavour loads a helmtest suite from the given directory with a specific flavour pre-configured.
func (loader *Loader) LoadSuiteWithFlavour(defaultFlavour string) (*Test, error) {
var suite Test
if err := unmarshalYamlFromFileStrict(filepath.Join(loader.rootDir, "suite.yaml"), &suite); err != nil && !os.IsNotExist(err) {
return nil, errors.Wrap(err, "loading suite specification")
}
if suite.Flavour == "" {
suite.Flavour = defaultFlavour
}
if suite.Name == "" {
suite.Name = strings.TrimRight(loader.rootDir, "/")
}
// Locate test files, if any.
testYAMLFiles, err := filepath.Glob(filepath.Join(loader.rootDir, loader.globPattern))
if err != nil {
return nil, errors.Wrap(err, "globbing for .test.yaml files")
}
for _, file := range testYAMLFiles {
test := Test{
parent: &suite,
}
if err := unmarshalYamlFromFileStrict(file, &test); err != nil {
return nil, errors.Wrapf(err, "loading test specification from file %s", file)
}
if test.Name == "" {
test.Name = filepath.Base(file)
}
suite.Tests = append(suite.Tests, &test)
}
if err := suite.initialize(); err != nil {
return nil, err
}
return &suite, nil
}