mirror of
https://github.com/LukeHagar/libopenapi.git
synced 2025-12-07 20:47:45 +00:00
Now all tests are building the model correctly and everything is passing again, confidence up much higher now.
1200 lines
30 KiB
Go
1200 lines
30 KiB
Go
// Copyright 2022 Princess B33f Heavy Industries / Dave Shanley
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package model
|
|
|
|
import (
|
|
"github.com/pb33f/libopenapi/datamodel/low"
|
|
v2 "github.com/pb33f/libopenapi/datamodel/low/v2"
|
|
v3 "github.com/pb33f/libopenapi/datamodel/low/v3"
|
|
"github.com/stretchr/testify/assert"
|
|
"gopkg.in/yaml.v3"
|
|
"testing"
|
|
)
|
|
|
|
func TestCompareOperations_V2(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
right := left
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Nil(t, extChanges)
|
|
}
|
|
|
|
func TestCompareOperations_V2_ModifyParam(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
right := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: fridge`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
}
|
|
|
|
func TestCompareOperations_V2_AddParamProperty(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam`
|
|
|
|
right := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType)
|
|
assert.Equal(t, "parameters", extChanges.Changes[0].Property)
|
|
|
|
}
|
|
|
|
func TestCompareOperations_V2_RemoveParamProperty(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam`
|
|
|
|
right := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType)
|
|
assert.Equal(t, "parameters", extChanges.Changes[0].Property)
|
|
|
|
}
|
|
|
|
func TestCompareOperations_V2_AddParam(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
right := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer
|
|
- name: jummy
|
|
in: oven`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V2_RemoveParam(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
right := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer
|
|
- name: jummy
|
|
in: oven`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V2_ModifyTag(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
right := `tags:
|
|
- one
|
|
- twenty
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 2, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType)
|
|
assert.Equal(t, PropertyAdded, extChanges.Changes[1].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V2_AddTag(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
right := `tags:
|
|
- one
|
|
- two
|
|
- three
|
|
summary: hello
|
|
description: hello there my pal
|
|
operationId: mintyFresh
|
|
consumes:
|
|
- pizza
|
|
- cake
|
|
produces:
|
|
- toast
|
|
- jam
|
|
parameters:
|
|
- name: jimmy
|
|
- name: jammy
|
|
in: freezer`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType)
|
|
assert.Equal(t, v3.TagsLabel, extChanges.Changes[0].Property)
|
|
}
|
|
|
|
func TestCompareOperations_V2_Modify_ProducesConsumesSchemes(t *testing.T) {
|
|
|
|
left := `produces:
|
|
- electricity
|
|
consumes:
|
|
- oil
|
|
schemes:
|
|
- burning`
|
|
|
|
right := `produces:
|
|
- heat
|
|
consumes:
|
|
- wind
|
|
schemes:
|
|
- blowing`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 6, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
}
|
|
|
|
func TestCompareOperations_V2_Modify_ExtDocs_Responses(t *testing.T) {
|
|
|
|
left := `externalDocs:
|
|
url: https://pb33f.io/old
|
|
responses:
|
|
200:
|
|
description: OK matey!
|
|
`
|
|
|
|
right := `externalDocs:
|
|
url: https://pb33f.io/new
|
|
responses:
|
|
200:
|
|
description: OK me matey!`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 2, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, Modified, extChanges.ResponsesChanges.ResponseChanges["200"].Changes[0].ChangeType)
|
|
assert.Equal(t, Modified, extChanges.ExternalDocChanges.Changes[0].ChangeType)
|
|
|
|
}
|
|
|
|
func TestCompareOperations_V2_Add_ExtDocs_Responses(t *testing.T) {
|
|
|
|
left := `operationId: nuggets`
|
|
|
|
right := `operationId: nuggets
|
|
externalDocs:
|
|
url: https://pb33f.io/new
|
|
responses:
|
|
200:
|
|
description: OK me matey!`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 2, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType)
|
|
assert.Equal(t, PropertyAdded, extChanges.Changes[1].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V2_Remove_ExtDocs_Responses(t *testing.T) {
|
|
|
|
left := `operationId: nuggets`
|
|
|
|
right := `operationId: nuggets
|
|
externalDocs:
|
|
url: https://pb33f.io/new
|
|
responses:
|
|
200:
|
|
description: OK me matey!`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 2, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType)
|
|
assert.Equal(t, PropertyRemoved, extChanges.Changes[1].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V2_AddSecurityReq_Role(t *testing.T) {
|
|
|
|
left := `operationId: nuggets
|
|
security:
|
|
- things:
|
|
- stuff
|
|
- junk`
|
|
|
|
right := `operationId: nuggets
|
|
security:
|
|
- things:
|
|
- stuff
|
|
- junk
|
|
- crap`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectAdded, extChanges.SecurityRequirementChanges[0].Changes[0].ChangeType)
|
|
assert.Equal(t, "crap", extChanges.SecurityRequirementChanges[0].Changes[0].New)
|
|
|
|
}
|
|
|
|
func TestCompareOperations_V2_RemoveSecurityReq_Role(t *testing.T) {
|
|
|
|
left := `operationId: nuggets
|
|
security:
|
|
- things:
|
|
- stuff
|
|
- junk`
|
|
|
|
right := `operationId: nuggets
|
|
security:
|
|
- things:
|
|
- stuff
|
|
- junk
|
|
- crap`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectRemoved, extChanges.SecurityRequirementChanges[0].Changes[0].ChangeType)
|
|
assert.Equal(t, "crap", extChanges.SecurityRequirementChanges[0].Changes[0].Original)
|
|
|
|
}
|
|
|
|
func TestCompareOperations_V2_AddSecurityRequirement(t *testing.T) {
|
|
|
|
left := `operationId: nuggets
|
|
security:
|
|
- things:
|
|
- stuff
|
|
- junk`
|
|
|
|
right := `operationId: nuggets
|
|
security:
|
|
- things:
|
|
- stuff
|
|
- junk
|
|
- thongs:
|
|
- small
|
|
- smelly`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType)
|
|
assert.Equal(t, "thongs", extChanges.Changes[0].New)
|
|
|
|
}
|
|
|
|
func TestCompareOperations_V2_RemoveSecurityRequirement(t *testing.T) {
|
|
|
|
left := `operationId: nuggets
|
|
security:
|
|
- things:
|
|
- stuff
|
|
- junk`
|
|
|
|
right := `operationId: nuggets
|
|
security:
|
|
- things:
|
|
- stuff
|
|
- junk
|
|
- thongs:
|
|
- small
|
|
- smelly`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v2.Operation
|
|
var rDoc v2.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType)
|
|
assert.Equal(t, "thongs", extChanges.Changes[0].Original)
|
|
|
|
}
|
|
|
|
func TestCompareOperations_V3(t *testing.T) {
|
|
|
|
left := `tags:
|
|
- one
|
|
- two
|
|
summary: hello
|
|
description: hello there buddy.
|
|
operationId: aTest
|
|
requestBody:
|
|
description: a request
|
|
content:
|
|
fish/cake:
|
|
schema:
|
|
type: int
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
security:
|
|
- beer:
|
|
- burgers
|
|
- chips
|
|
- beans
|
|
parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: fridge`
|
|
|
|
right := left
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Nil(t, extChanges)
|
|
}
|
|
|
|
func TestCompareOperations_V3_ModifyParam(t *testing.T) {
|
|
|
|
left := `parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: fridge`
|
|
|
|
right := `parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: attic`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, Modified, extChanges.ParameterChanges[0].Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_AddParam(t *testing.T) {
|
|
|
|
left := `parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: fridge`
|
|
|
|
right := `parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: fridge
|
|
- name: pb33f
|
|
in: the_ranch`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_RemoveParam(t *testing.T) {
|
|
|
|
left := `parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: fridge`
|
|
|
|
right := `parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: fridge
|
|
- name: pb33f
|
|
in: the_ranch`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_RemoveParams(t *testing.T) {
|
|
|
|
left := `operationId: ohNoes
|
|
parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: fridge`
|
|
|
|
right := `operationId: ohNoes`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_AddParams(t *testing.T) {
|
|
|
|
left := `operationId: ohNoes
|
|
parameters:
|
|
- name: honey
|
|
- name: bunny
|
|
in: fridge`
|
|
|
|
right := `operationId: ohNoes`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_ModifyServers(t *testing.T) {
|
|
|
|
left := `servers:
|
|
- url: https://pb33f.io
|
|
- description: nourl!`
|
|
|
|
right := `servers:
|
|
- url: https://pb33f.io
|
|
description: new!
|
|
- description: nourl!`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyAdded, extChanges.ServerChanges[0].Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_AddServer(t *testing.T) {
|
|
|
|
left := `servers:
|
|
- url: https://pb33f.io`
|
|
|
|
right := `servers:
|
|
- url: https://pb33f.io
|
|
- url: https://quobix.com`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_RemoveServer(t *testing.T) {
|
|
|
|
left := `servers:
|
|
- url: https://pb33f.io`
|
|
|
|
right := `servers:
|
|
- url: https://pb33f.io
|
|
- url: https://quobix.com`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_AddServerToOp(t *testing.T) {
|
|
|
|
left := `operationId: noServers!`
|
|
|
|
right := `operationId: noServers!
|
|
servers:
|
|
- url: https://pb33f.io
|
|
- url: https://quobix.com`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_RemoveServerFromOp(t *testing.T) {
|
|
|
|
left := `operationId: noServers!`
|
|
|
|
right := `operationId: noServers!
|
|
servers:
|
|
- url: https://pb33f.io
|
|
- url: https://quobix.com`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_ModifySecurity(t *testing.T) {
|
|
|
|
left := `operationId: coldSecurity
|
|
security:
|
|
- winter:
|
|
- cold`
|
|
|
|
right := `operationId: coldSecurity
|
|
security:
|
|
- winter:
|
|
- cold
|
|
- brrr.`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, ObjectAdded, extChanges.SecurityRequirementChanges[0].Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_ModifyRequestBody(t *testing.T) {
|
|
|
|
left := `requestBody:
|
|
description: jammy`
|
|
|
|
right := `requestBody:
|
|
description: gooey`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, Modified, extChanges.RequestBodyChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_AddRequestBody(t *testing.T) {
|
|
|
|
left := `operationId: noRequestBody`
|
|
|
|
right := `operationId: noRequestBody
|
|
requestBody:
|
|
description: jammy`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_ModifyExtension(t *testing.T) {
|
|
|
|
left := `x-pizza: yummy`
|
|
|
|
right := `x-pizza: yammy!`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&lDoc, &rDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 0, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, Modified, extChanges.ExtensionChanges.Changes[0].ChangeType)
|
|
}
|
|
|
|
func TestCompareOperations_V3_RemoveRequestBody(t *testing.T) {
|
|
|
|
left := `operationId: noRequestBody`
|
|
|
|
right := `operationId: noRequestBody
|
|
requestBody:
|
|
description: jammy`
|
|
|
|
var lNode, rNode yaml.Node
|
|
_ = yaml.Unmarshal([]byte(left), &lNode)
|
|
_ = yaml.Unmarshal([]byte(right), &rNode)
|
|
|
|
// create low level objects
|
|
var lDoc v3.Operation
|
|
var rDoc v3.Operation
|
|
_ = low.BuildModel(lNode.Content[0], &lDoc)
|
|
_ = low.BuildModel(rNode.Content[0], &rDoc)
|
|
_ = lDoc.Build(lNode.Content[0], nil)
|
|
_ = rDoc.Build(rNode.Content[0], nil)
|
|
|
|
// compare.
|
|
extChanges := CompareOperations(&rDoc, &lDoc)
|
|
assert.Equal(t, 1, extChanges.TotalChanges())
|
|
assert.Equal(t, 1, extChanges.TotalBreakingChanges())
|
|
assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType)
|
|
}
|