Skip to content

Commit d9af111

Browse files
committed
Fix tests to handle parsing errors.
Added some more comments for folks.
1 parent 77b77db commit d9af111

File tree

4 files changed

+25
-24
lines changed

4 files changed

+25
-24
lines changed

datamodel/spec_info.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,16 @@ func ExtractSpecInfoWithDocumentCheck(spec []byte, bypass bool) (*SpecInfo, erro
108108
parseJSON := func(bytes []byte, spec *SpecInfo, parsedNode *yaml.Node) error {
109109
var jsonSpec map[string]interface{}
110110
if utils.IsYAML(string(bytes)) {
111+
// Decode YAML to map - this is critical to catch structural errors like duplicate keys
111112
if err := parsedNode.Decode(&jsonSpec); err != nil {
112113
return fmt.Errorf("failed to decode YAML to JSON: %w", err)
113114
}
115+
// Marshal to JSON - if this fails due to unsupported types (e.g. map[interface{}]interface{}),
116+
// we tolerate it as it doesn't indicate spec invalidity, just YAML/JSON incompatibility
114117
b, err := json.Marshal(&jsonSpec)
115-
if err != nil {
116-
return fmt.Errorf("failed to marshal JSON: %w", err)
118+
if err == nil {
119+
spec.SpecJSONBytes = &b
117120
}
118-
spec.SpecJSONBytes = &b
119121
spec.SpecJSON = &jsonSpec
120122
} else {
121123
if err := json.Unmarshal(bytes, &jsonSpec); err != nil {

document_examples_test.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,8 @@ func TestExampleCompareDocuments_swagger(t *testing.T) {
360360
}
361361

362362
func TestDocument_Paths_As_Array(t *testing.T) {
363-
// paths can now be wrapped in an array.
363+
// This test has invalid JSON (paths as array with object literal inside)
364+
// Testing that we properly reject invalid JSON after fix for issue #355
364365
spec := `{
365366
"openapi": "3.1.0",
366367
"paths": [
@@ -372,12 +373,9 @@ func TestDocument_Paths_As_Array(t *testing.T) {
372373
`
373374
// create a new document from specification bytes
374375
doc, err := NewDocument([]byte(spec))
375-
// if anything went wrong, an error is thrown
376-
if err != nil {
377-
panic(fmt.Sprintf("cannot create new document: %e", err))
378-
}
379-
v3Model, _ := doc.BuildV3Model()
380-
assert.NotNil(t, v3Model)
376+
// After fix #355, invalid JSON should now produce an error
377+
assert.Error(t, err, "Invalid JSON should produce an error")
378+
assert.Nil(t, doc, "Document should be nil when JSON is invalid")
381379
}
382380

383381
// If you want to know more about circular references that have been found

document_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,14 +564,15 @@ func TestDocument_BuildModelBad(t *testing.T) {
564564
}
565565

566566
func TestDocument_Serialize_JSON_Modified(t *testing.T) {
567-
json := `{ 'openapi': '3.0',
568-
'info': {
569-
'title': 'The magic API'
567+
json := `{ "openapi": "3.0",
568+
"info": {
569+
"title": "The magic API"
570570
}
571571
}
572572
`
573573
jsonModified := `{"info":{"title":"The magic API - but now, altered!"},"openapi":"3.0"}`
574-
doc, _ := NewDocument([]byte(json))
574+
doc, err := NewDocument([]byte(json))
575+
assert.NoError(t, err)
575576

576577
v3Doc, _ := doc.BuildV3Model()
577578

test_specs/swagger-circular-tests.yaml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,25 @@ definitions:
1111
description: "test one"
1212
properties:
1313
things:
14-
"$ref": "#/definitions/Two"
14+
$ref: "#/definitions/Two"
1515
required:
1616
- things
1717
Two:
1818
description: "test two"
1919
properties:
2020
testThing:
21-
"$ref": "#/definitions/One"
21+
$ref: "#/definitions/One"
2222
required:
2323
- testThing
2424
Three:
2525
description: "test three"
2626
properties:
2727
tester:
28-
"$ref": "#/definitions/Four"
28+
$ref: "#/definitions/Four"
2929
bester:
30-
"$ref": "#/definitions/Seven"
30+
$ref: "#/definitions/Seven"
3131
yester:
32-
"$ref": "#/definitions/Seven"
32+
$ref: "#/definitions/Seven"
3333
required:
3434
- tester
3535
- bester
@@ -38,32 +38,32 @@ definitions:
3838
description: "test four"
3939
properties:
4040
lemons:
41-
"$ref": "#/definitions/Nine"
41+
$ref: "#/definitions/Nine"
4242
required:
4343
- lemons
4444
Five:
4545
properties:
4646
rice:
47-
"$ref": "#/definitions/Six"
47+
$ref: "#/definitions/Six"
4848
required:
4949
- rice
5050
Six:
5151
properties:
5252
mints:
53-
"$ref": "#/definitions/Nine"
53+
$ref: "#/definitions/Nine"
5454
required:
5555
- mints
5656
Seven:
5757
properties:
5858
wow:
59-
"$ref": "#/definitions/Three"
59+
$ref: "#/definitions/Three"
6060
required:
6161
- wow
6262
Nine:
6363
description: done.
6464
Ten:
6565
properties:
6666
yeah:
67-
"$ref": "#/definitions/Ten"
67+
$ref: "#/definitions/Ten"
6868
required:
6969
- yeah

0 commit comments

Comments
 (0)