Skip to content

Commit 5bf5528

Browse files
authored
CLOUDP-294902: Support listing private preview values (#430)
1 parent c14d3b7 commit 5bf5528

File tree

8 files changed

+68780
-9
lines changed

8 files changed

+68780
-9
lines changed

tools/.tool-versions

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
golang 1.23.0
1+
golang 1.23.6

tools/cli/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module github.com/mongodb/openapi/tools/cli
22

33
go 1.23
44

5-
toolchain go1.23.1
5+
toolchain go1.23.6
66

77
require (
88
github.com/getkin/kin-openapi v0.128.0

tools/cli/internal/cli/versions/versions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (o *Opts) versionsAsBytes(versions []string) ([]byte, error) {
112112
}
113113

114114
func (o *Opts) PreRunE(_ []string) error {
115-
o.stabilityLevel = strings.ToUpper(o.stabilityLevel)
115+
o.stabilityLevel = strings.ToLower(o.stabilityLevel)
116116
if o.stabilityLevel != "" && o.stabilityLevel != apiversion.PreviewStabilityLevel && o.stabilityLevel != apiversion.StableStabilityLevel {
117117
return fmt.Errorf("stability level must be %q or %q, got %q", apiversion.PreviewStabilityLevel, apiversion.StableStabilityLevel, o.stabilityLevel)
118118
}

tools/cli/internal/cli/versions/versions_test.go

Lines changed: 108 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func TestVersion_RunWithEnv(t *testing.T) {
5959
func TestVersion_RunWithPreview(t *testing.T) {
6060
fs := afero.NewMemMapFs()
6161
opts := &Opts{
62-
basePath: "../../../test/data/base_spec_with_preview.json",
62+
basePath: "../../../test/data/base_spec_with_private_preview.json",
6363
outputPath: "foas.json",
6464
fs: fs,
6565
env: "staging",
@@ -75,10 +75,10 @@ func TestVersion_RunWithPreview(t *testing.T) {
7575
assert.Contains(t, string(b), "preview")
7676
}
7777

78-
func TestVersion_RunStabilityLevelPreview(t *testing.T) {
78+
func TestVersion_RunStabilityLevelPreviewAndPrivatePreview(t *testing.T) {
7979
fs := afero.NewMemMapFs()
8080
opts := &Opts{
81-
basePath: "../../../test/data/base_spec_with_preview.json",
81+
basePath: "../../../test/data/base_spec_with_private_preview.json",
8282
outputPath: "foas.json",
8383
fs: fs,
8484
env: "staging",
@@ -92,13 +92,33 @@ func TestVersion_RunStabilityLevelPreview(t *testing.T) {
9292
// Check initial versions
9393
assert.NotEmpty(t, b)
9494
assert.NotContains(t, string(b), "2023-02-01")
95+
assert.Contains(t, string(b), "private-preview")
96+
}
97+
98+
func TestVersion_PreviewAndPublicPreview(t *testing.T) {
99+
fs := afero.NewMemMapFs()
100+
opts := &Opts{
101+
basePath: "../../../test/data/base_spec_with_public_preview.json",
102+
outputPath: "foas.json",
103+
fs: fs,
104+
env: "staging",
105+
stabilityLevel: "PREVIEW",
106+
}
107+
108+
require.NoError(t, opts.Run())
109+
b, err := afero.ReadFile(fs, opts.outputPath)
110+
require.NoError(t, err)
111+
112+
// Check initial versions
113+
assert.NotEmpty(t, b)
114+
assert.NotContains(t, string(b), "private-preview")
95115
assert.Contains(t, string(b), "preview")
96116
}
97117

98118
func TestVersion_RunStabilityLevelStable(t *testing.T) {
99119
fs := afero.NewMemMapFs()
100120
opts := &Opts{
101-
basePath: "../../../test/data/base_spec_with_preview.json",
121+
basePath: "../../../test/data/base_spec_with_private_preview.json",
102122
outputPath: "foas.json",
103123
fs: fs,
104124
env: "staging",
@@ -112,5 +132,88 @@ func TestVersion_RunStabilityLevelStable(t *testing.T) {
112132
// Check initial versions
113133
assert.NotEmpty(t, b)
114134
assert.Contains(t, string(b), "2023-02-01")
115-
assert.NotContains(t, string(b), "preview")
135+
assert.NotContains(t, string(b), "private-preview")
136+
}
137+
138+
func TestVersion_PreRun(t *testing.T) {
139+
t.Run("NoBasePath", func(t *testing.T) {
140+
opts := &Opts{}
141+
err := opts.PreRunE(nil)
142+
require.Error(t, err)
143+
assert.Contains(t, err.Error(), "no OAS detected")
144+
})
145+
146+
t.Run("InvalidOutputPath", func(t *testing.T) {
147+
opts := &Opts{
148+
basePath: "base",
149+
outputPath: "output",
150+
}
151+
err := opts.PreRunE(nil)
152+
require.Error(t, err)
153+
assert.Contains(t, err.Error(), "output file must be either a JSON or YAML file")
154+
})
155+
156+
t.Run("InvalidFormat", func(t *testing.T) {
157+
opts := &Opts{
158+
basePath: "base",
159+
outputPath: "output.json",
160+
format: "invalid",
161+
}
162+
err := opts.PreRunE(nil)
163+
require.Error(t, err)
164+
assert.Contains(t, err.Error(), "output format must be either 'json' or 'yaml'")
165+
})
166+
167+
t.Run("ValidFormat", func(t *testing.T) {
168+
opts := &Opts{
169+
basePath: "base",
170+
outputPath: "output.json",
171+
format: "json",
172+
}
173+
err := opts.PreRunE(nil)
174+
require.NoError(t, err)
175+
})
176+
177+
t.Run("ValidFormatYAML", func(t *testing.T) {
178+
opts := &Opts{
179+
basePath: "base",
180+
outputPath: "output.yaml",
181+
format: "yaml",
182+
}
183+
err := opts.PreRunE(nil)
184+
require.NoError(t, err)
185+
})
186+
187+
t.Run("InvalidStabilityLevel", func(t *testing.T) {
188+
opts := &Opts{
189+
basePath: "base",
190+
outputPath: "output.yaml",
191+
format: "yaml",
192+
stabilityLevel: "invalid",
193+
}
194+
err := opts.PreRunE(nil)
195+
require.Error(t, err)
196+
assert.Contains(t, err.Error(), "stability level must be")
197+
})
198+
t.Run("ValidStabilityLevelPreview", func(t *testing.T) {
199+
opts := &Opts{
200+
basePath: "base",
201+
outputPath: "output.yaml",
202+
format: "yaml",
203+
stabilityLevel: "preview",
204+
}
205+
err := opts.PreRunE(nil)
206+
require.NoError(t, err)
207+
})
208+
209+
t.Run("ValidStabilityLevelPreviewUppercase", func(t *testing.T) {
210+
opts := &Opts{
211+
basePath: "base",
212+
outputPath: "output.yaml",
213+
format: "yaml",
214+
stabilityLevel: "PREVIEW",
215+
}
216+
err := opts.PreRunE(nil)
217+
require.NoError(t, err)
218+
})
116219
}

tools/cli/internal/openapi/versions.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func extractVersions(oas *openapi3.T) ([]string, error) {
6767
version, err = getPreviewVersionName(contentTypeValue)
6868
if err != nil {
6969
fmt.Printf("failed to parse preview version name: %v\n", err)
70-
continue
70+
return nil, err
7171
}
7272
}
7373

@@ -137,6 +137,10 @@ func parsePreviewExtensionData(contentTypeValue *openapi3.MediaType) (public boo
137137
name = nameV
138138
}
139139

140+
if nameV == "" && publicV != "true" && publicV != "false" {
141+
return false, "", errors.New("invalid value for 'public' field, only 'true' or 'false' are allowed")
142+
}
143+
140144
return public, name, nil
141145
}
142146

tools/cli/internal/openapi/versions_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,20 @@ func TestVersions_PublicPreview(t *testing.T) {
3939
assert.Equal(t, []string{"2023-01-01", "2023-02-01", "preview"}, versions)
4040
}
4141

42+
func TestVersions_InvalidPreviewData(t *testing.T) {
43+
r := NewVersionedResponses(t)
44+
// override the extension so something invalid like "public": true
45+
r.Paths.Find("pathBase4").Post.Responses.Map()["200"].Value.
46+
Content.Get("application/vnd.atlas.preview+json").
47+
Extensions["x-xgen-preview"] = map[string]any{
48+
"public": true,
49+
}
50+
51+
_, err := ExtractVersionsWithEnv(r, "qa")
52+
require.Error(t, err)
53+
require.ErrorContains(t, err, "nvalid value for 'public' field")
54+
}
55+
4256
func NewVersionedResponses(t *testing.T) *openapi3.T {
4357
t.Helper()
4458
inputPath := &openapi3.Paths{}
@@ -95,6 +109,7 @@ func NewVersionedResponses(t *testing.T) *openapi3.T {
95109
},
96110
})
97111

112+
// private preview version
98113
extensionThree := map[string]any{
99114
"x-xgen-version": "preview",
100115
"x-xgen-preview": map[string]any{
@@ -133,6 +148,7 @@ func NewVersionedResponses(t *testing.T) *openapi3.T {
133148
},
134149
})
135150

151+
// public preview version
136152
extensionFour := map[string]any{
137153
"x-xgen-version": "preview",
138154
"x-xgen-preview": map[string]any{
File renamed without changes.

0 commit comments

Comments
 (0)