diff --git a/what-changed/model/server_variable.go b/what-changed/model/server_variable.go index e6c99af..01bbd98 100644 --- a/what-changed/model/server_variable.go +++ b/what-changed/model/server_variable.go @@ -2,3 +2,73 @@ // SPDX-License-Identifier: MIT package model + +import ( + "github.com/pb33f/libopenapi/datamodel/low" + "github.com/pb33f/libopenapi/datamodel/low/v3" +) + +type ServerVariableChanges struct { + PropertyChanges +} + +func CompareServerVariables(l, r *v3.ServerVariable) *ServerVariableChanges { + if low.AreEqual(l, r) { + return nil + } + + var props []*PropertyCheck + var changes []*Change + + lValues := make(map[string]low.NodeReference[string]) + rValues := make(map[string]low.NodeReference[string]) + for i := range l.Enum { + lValues[l.Enum[i].Value] = l.Enum[i] + } + for i := range r.Enum { + rValues[r.Enum[i].Value] = r.Enum[i] + } + for k := range lValues { + if _, ok := rValues[k]; !ok { + CreateChange(&changes, ObjectRemoved, v3.EnumLabel, + lValues[k].ValueNode, nil, true, + lValues[k].Value, nil) + continue + } + } + for k := range rValues { + if _, ok := lValues[k]; !ok { + CreateChange(&changes, ObjectAdded, v3.EnumLabel, + lValues[k].ValueNode, rValues[k].ValueNode, false, + lValues[k].Value, rValues[k].Value) + } + } + + // default + props = append(props, &PropertyCheck{ + LeftNode: l.Default.ValueNode, + RightNode: r.Default.ValueNode, + Label: v3.DefaultLabel, + Changes: &changes, + Breaking: true, + Original: l, + New: r, + }) + + // description + props = append(props, &PropertyCheck{ + LeftNode: l.Description.ValueNode, + RightNode: r.Description.ValueNode, + Label: v3.DescriptionLabel, + Changes: &changes, + Breaking: false, + Original: l, + New: r, + }) + + // check everything. + CheckProperties(props) + sc := new(ServerVariableChanges) + sc.Changes = changes + return sc +} diff --git a/what-changed/model/server_variable_test.go b/what-changed/model/server_variable_test.go new file mode 100644 index 0000000..da55fc4 --- /dev/null +++ b/what-changed/model/server_variable_test.go @@ -0,0 +1,164 @@ +// Copyright 2022 Princess B33f Heavy Industries / Dave Shanley +// SPDX-License-Identifier: MIT + +package model + +import ( + "github.com/pb33f/libopenapi/datamodel/low" + v3 "github.com/pb33f/libopenapi/datamodel/low/v3" + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v3" + "testing" +) + +func TestCompareServerVariables(t *testing.T) { + + left := `description: hi +default: hello +enum: + - one + - two` + + right := `description: hi +default: hello +enum: + - one + - two` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc v3.ServerVariable + var rDoc v3.ServerVariable + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + + // compare. + extChanges := CompareServerVariables(&lDoc, &rDoc) + assert.Nil(t, extChanges) + +} + +func TestCompareServerVariables_EnumRemoved(t *testing.T) { + + left := `description: hi +default: hello +enum: + - one + - two` + + right := `description: hi +default: hello +enum: + - one` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc v3.ServerVariable + var rDoc v3.ServerVariable + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + + // compare. + extChanges := CompareServerVariables(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) + assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType) + +} + +func TestCompareServerVariables_Modified(t *testing.T) { + + left := `description: hi +default: hello +enum: + - one + - two` + + right := `description: hi +default: hello +enum: + - one + - two + - three` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc v3.ServerVariable + var rDoc v3.ServerVariable + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + + // compare. + extChanges := CompareServerVariables(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 0, extChanges.TotalBreakingChanges()) +} + +func TestCompareServerVariables_Added(t *testing.T) { + + left := `description: hi +default: hello +enum: + - one + - two` + + right := `description: hi +enum: + - one + - two` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc v3.ServerVariable + var rDoc v3.ServerVariable + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + + // compare. + extChanges := CompareServerVariables(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) + assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType) +} + +func TestCompareServerVariables_Removed(t *testing.T) { + + left := `description: hi +default: hello +enum: + - one + - two` + + right := `description: hi +enum: + - one + - two` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc v3.ServerVariable + var rDoc v3.ServerVariable + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + + // compare. + extChanges := CompareServerVariables(&rDoc, &lDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) + assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType) +}