mirror of
https://github.com/LukeHagar/libopenapi.git
synced 2025-12-09 12:37:49 +00:00
fix: panic thrown when paths is wrapped in an array #4
When paths are wrapped in an array, the index throws an error because it's expecting them to be supplied as a map. Now paths can be wrapped or unwrapped, the index won't care.
This commit is contained in:
@@ -360,3 +360,30 @@ info:
|
|||||||
// license:
|
// license:
|
||||||
// url: https://pb33f.io/license
|
// url: https://pb33f.io/license
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDocument_Panic(t *testing.T) {
|
||||||
|
|
||||||
|
// How to mutate values in an OpenAPI Specification, without re-ordering original content.
|
||||||
|
|
||||||
|
// create very small, and useless spec that does nothing useful, except showcase this feature.
|
||||||
|
spec := `{
|
||||||
|
"openapi": "3.1.0",
|
||||||
|
"paths": [
|
||||||
|
"/": {
|
||||||
|
"get": {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`
|
||||||
|
// create a new document from specification bytes
|
||||||
|
doc, err := NewDocument([]byte(spec))
|
||||||
|
|
||||||
|
// if anything went wrong, an error is thrown
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("cannot create new document: %e", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
// because we know this is a v3 spec, we can build a ready to go model from it.
|
||||||
|
v3Model, errors := doc.BuildV3Model()
|
||||||
|
fmt.Print(v3Model, errors)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1279,7 +1279,12 @@ func (index *SpecIndex) GetOperationCount() int {
|
|||||||
for x, p := range index.pathsNode.Content {
|
for x, p := range index.pathsNode.Content {
|
||||||
if x%2 == 0 {
|
if x%2 == 0 {
|
||||||
|
|
||||||
method := index.pathsNode.Content[x+1]
|
var method *yaml.Node
|
||||||
|
if utils.IsNodeArray(index.pathsNode) {
|
||||||
|
method = index.pathsNode.Content[x]
|
||||||
|
} else {
|
||||||
|
method = index.pathsNode.Content[x+1]
|
||||||
|
}
|
||||||
|
|
||||||
// extract methods for later use.
|
// extract methods for later use.
|
||||||
for y, m := range method.Content {
|
for y, m := range method.Content {
|
||||||
@@ -1339,7 +1344,12 @@ func (index *SpecIndex) GetOperationsParameterCount() int {
|
|||||||
for x, pathItemNode := range index.pathsNode.Content {
|
for x, pathItemNode := range index.pathsNode.Content {
|
||||||
if x%2 == 0 {
|
if x%2 == 0 {
|
||||||
|
|
||||||
pathPropertyNode := index.pathsNode.Content[x+1]
|
var pathPropertyNode *yaml.Node
|
||||||
|
if utils.IsNodeArray(index.pathsNode) {
|
||||||
|
pathPropertyNode = index.pathsNode.Content[x]
|
||||||
|
} else {
|
||||||
|
pathPropertyNode = index.pathsNode.Content[x+1]
|
||||||
|
}
|
||||||
|
|
||||||
// extract methods for later use.
|
// extract methods for later use.
|
||||||
for y, prop := range pathPropertyNode.Content {
|
for y, prop := range pathPropertyNode.Content {
|
||||||
|
|||||||
@@ -474,6 +474,22 @@ func TestSpecIndex_FindComponent(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSpecIndex_performExternalLookup(t *testing.T) {
|
func TestSpecIndex_performExternalLookup(t *testing.T) {
|
||||||
|
yml := `{
|
||||||
|
"openapi": "3.1.0",
|
||||||
|
"paths": [
|
||||||
|
{"/": {
|
||||||
|
"get": {}
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}`
|
||||||
|
var rootNode yaml.Node
|
||||||
|
yaml.Unmarshal([]byte(yml), &rootNode)
|
||||||
|
|
||||||
|
index := NewSpecIndex(&rootNode)
|
||||||
|
assert.Len(t, index.GetPathsNode().Content, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSpecIndex_TestPathsNodeAsArray(t *testing.T) {
|
||||||
yml := `components:
|
yml := `components:
|
||||||
schemas:
|
schemas:
|
||||||
pizza:
|
pizza:
|
||||||
|
|||||||
Reference in New Issue
Block a user