// Copyright 2022 Princess B33f Heavy Industries / Dave Shanley // SPDX-License-Identifier: MIT package model import ( "github.com/pb33f/libopenapi/datamodel/low" "github.com/pb33f/libopenapi/datamodel/low/v2" "github.com/pb33f/libopenapi/datamodel/low/v3" "github.com/stretchr/testify/assert" "gopkg.in/yaml.v3" "testing" ) func TestCompareParameters(t *testing.T) { left := `name: a param` right := `name: a param` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Nil(t, extChanges) } func TestCompareParameters_V3(t *testing.T) { left := `name: a param` right := `name: a parama` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) } func TestCompareParameters_V3_Schema(t *testing.T) { left := `schema: description: something new` right := `schema: description: a changed thing` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, 1, extChanges.SchemaChanges.TotalChanges()) } func TestCompareParameters_V3_SchemaAdd(t *testing.T) { left := `description: hello` right := `description: hello schema: description: a changed thing` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 1, extChanges.TotalBreakingChanges()) assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V3_SchemaRemove(t *testing.T) { left := `description: hello` right := `description: hello schema: description: a changed thing` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&rDoc, &lDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 1, extChanges.TotalBreakingChanges()) assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V3_Extensions(t *testing.T) { left := `x-thing: thang` right := `x-thing: dang` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, 1, extChanges.ExtensionChanges.TotalChanges()) } func TestCompareParameters_V3_ExampleChange(t *testing.T) { left := `example: a string` right := `example: now: an object` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) } func TestCompareParameters_V3_ExampleEqual(t *testing.T) { left := `example: a string` right := `example: a string` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Nil(t, extChanges) } func TestCompareParameters_V3_ExampleAdd(t *testing.T) { left := `description: something` right := `description: something example: a string` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V3_ExampleRemove(t *testing.T) { left := `description: something` right := `description: something example: a string` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare extChanges := CompareParameters(&rDoc, &lDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V3_ExamplesChanged(t *testing.T) { left := `examples: anExample: value: I love magic herbs` right := `examples: anExample: value: I love magic herbs and tea` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, Modified, extChanges.ExamplesChanges["anExample"].Changes[0].ChangeType) } func TestCompareParameters_V3_ExamplesAdded(t *testing.T) { left := `examples: anExample: value: I love magic herbs ` right := `examples: anExample: value: I love magic herbs teaExample: value: tea and cake and herbs"` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V3_ExamplesRemoved(t *testing.T) { left := `examples: anExample: value: I love magic herbs ` right := `examples: anExample: value: I love magic herbs teaExample: value: tea and cake and herbs"` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare extChanges := CompareParameters(&rDoc, &lDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V3_ContentChanged(t *testing.T) { left := `content: application/json: schema: description: a thing!` right := `content: application/json: schema: description: jay-son!` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, Modified, extChanges.ContentChanges["application/json"].SchemaChanges.Changes[0].ChangeType) } func TestCompareParameters_V3_ContentAdded(t *testing.T) { left := `content: application/json: schema: description: a thing!` right := `content: application/json: schema: description: a thing! application/xml: schema: description: oh no! not XML again` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V2_DefaultChange(t *testing.T) { left := `default: wat?` right := `default: why?` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 1, extChanges.TotalBreakingChanges()) } func TestCompareParameters_V2_EnumChange(t *testing.T) { left := `enum: - one` right := `enum: - two` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 1, extChanges.TotalBreakingChanges()) } func TestCompareParameters_V2_EnumEqual_Reorder(t *testing.T) { left := `enum: - one - two` right := `enum: - two - one` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Nil(t, extChanges) } func TestCompareParameters_V3_ContentChange(t *testing.T) { left := `description: something` right := `description: something example: a string` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v3.Parameter var rDoc v3.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare extChanges := CompareParameters(&rDoc, &lDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V2_Equal(t *testing.T) { left := `name: a param` right := `name: a param` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Nil(t, extChanges) } func TestCompareParameters_V2(t *testing.T) { left := `name: a param` right := `name: a parama` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) } func TestCompareParameters_V2_ItemsChange(t *testing.T) { left := `items: type: string` right := `items: type: int` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 1, extChanges.TotalBreakingChanges()) assert.Equal(t, Modified, extChanges.ItemsChanges.Changes[0].ChangeType) } func TestCompareParameters_V2_ItemsAdd(t *testing.T) { left := `description: something` right := `description: something items: type: int` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 1, extChanges.TotalBreakingChanges()) assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V2_ItemsRemove(t *testing.T) { left := `description: something` right := `description: something items: type: int` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&rDoc, &lDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 1, extChanges.TotalBreakingChanges()) assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType) } func TestCompareParameters_V2_Extensions(t *testing.T) { left := `x-thing: thang` right := `x-thing: dang` var lNode, rNode yaml.Node _ = yaml.Unmarshal([]byte(left), &lNode) _ = yaml.Unmarshal([]byte(right), &rNode) // create low level objects var lDoc v2.Parameter var rDoc v2.Parameter _ = low.BuildModel(&lNode, &lDoc) _ = low.BuildModel(&rNode, &rDoc) _ = lDoc.Build(lNode.Content[0], nil) _ = rDoc.Build(rNode.Content[0], nil) // compare. extChanges := CompareParameters(&lDoc, &rDoc) assert.Equal(t, 1, extChanges.TotalChanges()) assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, 1, extChanges.ExtensionChanges.TotalChanges()) }