Skip to content

Commit fd281e9

Browse files
committed
Add metadata validation per filter and unit tests
1 parent 87aed69 commit fd281e9

File tree

9 files changed

+175
-4
lines changed

9 files changed

+175
-4
lines changed

tools/cli/internal/openapi/filter/extension.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ const (
2929
format = "2006-01-02T15:04:05Z07:00"
3030
)
3131

32+
func (f *ExtensionFilter) ValidateMetadata() error {
33+
return validateMetadata(f.metadata)
34+
}
35+
3236
func (f *ExtensionFilter) Apply() error {
3337
for _, pathItem := range f.oas.Paths.Map() {
3438
if pathItem == nil {

tools/cli/internal/openapi/filter/filter.go

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"encoding/json"
1818
"errors"
1919
"fmt"
20+
reflect "reflect"
2021

2122
"github.com/getkin/kin-openapi/openapi3"
2223
"github.com/mongodb/openapi/tools/cli/internal/apiversion"
@@ -25,6 +26,7 @@ import (
2526
//go:generate mockgen -destination=../filter/mock_filter.go -package=filter github.com/mongodb/openapi/tools/cli/internal/openapi/filter Filter
2627
type Filter interface {
2728
Apply() error
29+
ValidateMetadata() error
2830
}
2931

3032
type Metadata struct {
@@ -39,11 +41,29 @@ func NewMetadata(targetVersion *apiversion.APIVersion, targetEnv string) *Metada
3941
}
4042
}
4143

44+
// validateMetadata validates the metadata object, ensuring its not nil and has a target env.
4245
func validateMetadata(metadata *Metadata) error {
4346
if metadata == nil {
4447
return errors.New("metadata is nil")
4548
}
4649

50+
if metadata.targetEnv == "" {
51+
return errors.New("target environment is empty")
52+
}
53+
54+
return nil
55+
}
56+
57+
// validateMetadataWithVersion validates the metadata object, ensuring its not nil and has a target version.
58+
func validateMetadataWithVersion(metadata *Metadata) error {
59+
if err := validateMetadata(metadata); err != nil {
60+
return err
61+
}
62+
63+
if metadata.targetVersion == nil {
64+
return errors.New("target version is nil")
65+
}
66+
4767
return nil
4868
}
4969

@@ -81,17 +101,17 @@ func ApplyFilters(doc *openapi3.T, metadata *Metadata, filters func(oas *openapi
81101
return nil, errors.New("openapi document is nil")
82102
}
83103

84-
if err := validateMetadata(metadata); err != nil {
85-
return nil, err
86-
}
87-
88104
// make a copy of the oas to avoid modifying the original document when applying filters
89105
oas, err := duplicateOas(doc)
90106
if err != nil {
91107
return nil, err
92108
}
93109

94110
for _, filter := range filters(oas, metadata) {
111+
if err := filter.ValidateMetadata(); err != nil {
112+
s := reflect.TypeOf(filter)
113+
return nil, fmt.Errorf("failed to validate metadata for filter %s with: %w", s, err)
114+
}
95115
if err := filter.Apply(); err != nil {
96116
return nil, err
97117
}

tools/cli/internal/openapi/filter/filter_test.go

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,122 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414
package filter
15+
16+
import (
17+
"testing"
18+
19+
"github.com/getkin/kin-openapi/openapi3"
20+
"github.com/mongodb/openapi/tools/cli/internal/apiversion"
21+
"github.com/stretchr/testify/assert"
22+
"github.com/stretchr/testify/require"
23+
)
24+
25+
func TestNewMetadata(t *testing.T) {
26+
version := &apiversion.APIVersion{}
27+
env := "test-env"
28+
metadata := NewMetadata(version, env)
29+
30+
assert.Equal(t, version, metadata.targetVersion)
31+
assert.Equal(t, env, metadata.targetEnv)
32+
}
33+
34+
func TestValidateMetadata(t *testing.T) {
35+
t.Run("Valid metadata", func(t *testing.T) {
36+
metadata := &Metadata{}
37+
err := validateMetadata(metadata)
38+
assert.NoError(t, err)
39+
})
40+
41+
t.Run("Nil metadata", func(t *testing.T) {
42+
err := validateMetadata(nil)
43+
assert.Error(t, err)
44+
assert.Equal(t, "metadata is nil", err.Error())
45+
})
46+
}
47+
48+
func TestDuplicateOas(t *testing.T) {
49+
doc := &openapi3.T{
50+
Info: &openapi3.Info{
51+
Title: "Test API",
52+
Version: "1.0.0",
53+
},
54+
}
55+
56+
duplicateDoc, err := duplicateOas(doc)
57+
require.NoError(t, err)
58+
require.NotNil(t, duplicateDoc)
59+
assert.Equal(t, doc.Info.Title, duplicateDoc.Info.Title)
60+
assert.Equal(t, doc.Info.Version, duplicateDoc.Info.Version)
61+
}
62+
63+
func TestApplyFilters(t *testing.T) {
64+
doc := &openapi3.T{
65+
Info: &openapi3.Info{
66+
Title: "Test API",
67+
Version: "1.0.0",
68+
},
69+
}
70+
metadata := &Metadata{}
71+
72+
t.Run("Nil document", func(t *testing.T) {
73+
_, err := ApplyFilters(nil, metadata, DefaultFilters)
74+
assert.Error(t, err)
75+
assert.Equal(t, "openapi document is nil", err.Error())
76+
})
77+
78+
t.Run("Nil metadata", func(t *testing.T) {
79+
_, err := ApplyFilters(doc, nil, DefaultFilters)
80+
assert.Error(t, err)
81+
assert.Equal(t, "metadata is nil", err.Error())
82+
})
83+
84+
t.Run("Invalid metadata", func(t *testing.T) {
85+
_, err := ApplyFilters(doc, metadata, DefaultFilters)
86+
assert.Equal(t, "target environment is empty", err.Error())
87+
})
88+
89+
t.Run("Missing versioning metadata", func(t *testing.T) {
90+
metadata := &Metadata{
91+
targetEnv: "dev",
92+
}
93+
_, err := ApplyFilters(doc, metadata, DefaultFilters)
94+
assert.Equal(t, "failed to validate metadata for filter *filter.VersioningExtensionFilter with: target version is nil", err.Error())
95+
})
96+
97+
t.Run("Valid metadata for default filters", func(t *testing.T) {
98+
version, err := apiversion.New(apiversion.WithVersion("2023-11-15"))
99+
require.NoError(t, err)
100+
metadata := &Metadata{
101+
targetEnv: "dev",
102+
targetVersion: version,
103+
}
104+
105+
filteredDoc, err := ApplyFilters(doc, metadata, DefaultFilters)
106+
require.NoError(t, err)
107+
assert.NotNil(t, filteredDoc)
108+
})
109+
}
110+
111+
func TestDefaultFilters(t *testing.T) {
112+
doc := &openapi3.T{}
113+
metadata := &Metadata{}
114+
filters := DefaultFilters(doc, metadata)
115+
116+
assert.Len(t, filters, 7)
117+
}
118+
119+
func TestFiltersWithoutVersioning(t *testing.T) {
120+
doc := &openapi3.T{}
121+
metadata := &Metadata{}
122+
filters := FiltersWithoutVersioning(doc, metadata)
123+
124+
assert.Len(t, filters, 5)
125+
}
126+
127+
func TestFiltersToGetVersions(t *testing.T) {
128+
doc := &openapi3.T{}
129+
metadata := &Metadata{}
130+
filters := FiltersToGetVersions(doc, metadata)
131+
132+
assert.Len(t, filters, 1)
133+
}

tools/cli/internal/openapi/filter/hidden_envs.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ type HiddenEnvsFilter struct {
3232
metadata *Metadata
3333
}
3434

35+
func (f *HiddenEnvsFilter) ValidateMetadata() error {
36+
return validateMetadata(f.metadata)
37+
}
38+
3539
func (f *HiddenEnvsFilter) Apply() error {
3640
// delete hidden paths first before processing
3741
for pathName, pathItem := range f.oas.Paths.Map() {

tools/cli/internal/openapi/filter/info.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ type InfoVersioningFilter struct {
2626
metadata *Metadata
2727
}
2828

29+
func (f *InfoVersioningFilter) ValidateMetadata() error {
30+
return validateMetadataWithVersion(f.metadata)
31+
}
32+
2933
func (f *InfoVersioningFilter) Apply() error {
3034
if f.oas.Info == nil {
3135
return nil

tools/cli/internal/openapi/filter/operations.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ type OperationsFilter struct {
2323
oas *openapi3.T
2424
}
2525

26+
func (f *OperationsFilter) ValidateMetadata() error {
27+
return nil
28+
}
29+
2630
func (f *OperationsFilter) Apply() error {
2731
if f.oas.Paths == nil {
2832
return nil

tools/cli/internal/openapi/filter/tags.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ type TagsFilter struct {
2525
oas *openapi3.T
2626
}
2727

28+
func (f *TagsFilter) ValidateMetadata() error {
29+
return nil
30+
}
31+
2832
func (f *TagsFilter) Apply() error {
2933
if f.oas.Tags == nil {
3034
return nil

tools/cli/internal/openapi/filter/versioning.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,15 @@ func newOperationConfig(op *openapi3.Operation) *OperationConfig {
5757
}
5858
}
5959

60+
func (f *VersioningFilter) ValidateMetadata() error {
61+
return validateMetadataWithVersion(f.metadata)
62+
}
63+
6064
func (f *VersioningFilter) Apply() error {
65+
if f.oas.Paths == nil {
66+
return nil
67+
}
68+
6169
newPaths := &openapi3.Paths{
6270
Extensions: f.oas.Paths.Extensions,
6371
}

tools/cli/internal/openapi/filter/versioning_extension.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ const (
3535
xGenExtension = "x-xgen-version"
3636
)
3737

38+
func (f *VersioningExtensionFilter) ValidateMetadata() error {
39+
return validateMetadataWithVersion(f.metadata)
40+
}
41+
3842
func (f *VersioningExtensionFilter) Apply() error {
3943
for _, pathItem := range f.oas.Paths.Map() {
4044
if pathItem == nil {

0 commit comments

Comments
 (0)