From cb7df7c9b23c83effd209d017c83e5f61da12966 Mon Sep 17 00:00:00 2001 From: Dave Shanley Date: Thu, 29 Sep 2022 10:47:22 -0400 Subject: [PATCH] Adding more use cases Fleshing out design to see how it holds up, needs more work. --- what-changed/external_docs.go | 49 +++++++++++-- what-changed/external_docs_test.go | 106 +++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 7 deletions(-) diff --git a/what-changed/external_docs.go b/what-changed/external_docs.go index 6d7bd26..1eeac5b 100644 --- a/what-changed/external_docs.go +++ b/what-changed/external_docs.go @@ -24,8 +24,41 @@ func (e *ExternalDocChanges) TotalChanges() int { func CompareExternalDocs(l, r *lowbase.ExternalDoc) *ExternalDocChanges { var changes []*Change[*lowbase.ExternalDoc] - changeType := 0 - if l != nil && r != nil && l.URL.Value != r.URL.Value { + + skipURL := false + skipDescription := false + + // check if url was removed + if r.URL.Value == "" && l.URL.Value != "" { + CreateChange[*lowbase.ExternalDoc](&changes, PropertyRemoved, lowv3.URLLabel, l.URL.ValueNode, + nil, false, l, nil) + skipURL = true + } + + // check if description was removed + if r.Description.Value == "" && l.Description.Value != "" { + CreateChange[*lowbase.ExternalDoc](&changes, PropertyRemoved, lowv3.DescriptionLabel, l.Description.ValueNode, + nil, false, l, nil) + skipDescription = true + } + + // check if url was added + if r.URL.Value != "" && l.URL.Value == "" { + CreateChange[*lowbase.ExternalDoc](&changes, PropertyAdded, lowv3.URLLabel, nil, + r.URL.ValueNode, false, nil, r) + skipURL = true + } + + // check if description was added + if r.Description.Value != "" && l.Description.Value == "" { + CreateChange[*lowbase.ExternalDoc](&changes, PropertyAdded, lowv3.DescriptionLabel, nil, + r.Description.ValueNode, false, nil, r) + skipDescription = true + } + + // if left and right URLs are set but not equal + if !skipURL && l != nil && r != nil && l.URL.Value != r.URL.Value { + var changeType int changeType = Modified ctx := CreateContext(l.URL.ValueNode, r.URL.ValueNode) if ctx.HasChanged() { @@ -34,7 +67,10 @@ func CompareExternalDocs(l, r *lowbase.ExternalDoc) *ExternalDocChanges { CreateChange[*lowbase.ExternalDoc](&changes, changeType, lowv3.URLLabel, l.URL.ValueNode, r.URL.ValueNode, false, l, r) } - if l != nil && r != nil && l.Description.Value != r.Description.Value { + + // if left and right descriptions are set, but not equal + if !skipDescription && l != nil && r != nil && l.Description.Value != r.Description.Value { + var changeType int changeType = Modified ctx := CreateContext(l.Description.ValueNode, r.Description.ValueNode) if ctx.HasChanged() { @@ -43,10 +79,6 @@ func CompareExternalDocs(l, r *lowbase.ExternalDoc) *ExternalDocChanges { CreateChange[*lowbase.ExternalDoc](&changes, changeType, lowv3.DescriptionLabel, l.Description.ValueNode, r.Description.ValueNode, false, l, r) } - if changeType == 0 { - // no change, return nothing. - return nil - } dc := new(ExternalDocChanges) dc.Changes = changes var lExt, rExt map[low.KeyReference[string]]low.ValueReference[any] @@ -57,5 +89,8 @@ func CompareExternalDocs(l, r *lowbase.ExternalDoc) *ExternalDocChanges { rExt = r.Extensions } dc.ExtensionChanges = CompareExtensions(lExt, rExt) + if len(dc.Changes) <= 0 && dc.ExtensionChanges == nil { + return nil + } return dc } diff --git a/what-changed/external_docs_test.go b/what-changed/external_docs_test.go index fb9048f..df5cb84 100644 --- a/what-changed/external_docs_test.go +++ b/what-changed/external_docs_test.go @@ -153,3 +153,109 @@ x-testing: hello` extChanges := CompareExternalDocs(&lDoc, &rDoc) assert.Nil(t, extChanges) } + +func TestCompareExternalDocs_DescriptionAdded(t *testing.T) { + + left := `url: https://pb33f.io +x-testing: hello` + + right := `url: https://pb33f.io +description: this is a test +x-testing: hello` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc lowbase.ExternalDoc + var rDoc lowbase.ExternalDoc + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) + + // compare. + // compare. + extChanges := CompareExternalDocs(&lDoc, &rDoc) + assert.Equal(t, 2, extChanges.TotalChanges()) + assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType) +} + +func TestCompareExternalDocs_URLAdded(t *testing.T) { + + left := `description: hi!` + + right := `description: hi! +url: https://pb33f.io` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc lowbase.ExternalDoc + var rDoc lowbase.ExternalDoc + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) + + // compare. + // compare. + extChanges := CompareExternalDocs(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, PropertyAdded, extChanges.Changes[0].ChangeType) +} + +func TestCompareExternalDocs_DescriptionRemoved(t *testing.T) { + + left := `url: https://pb33f.io +description: something` + + right := `url: https://pb33f.io` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc lowbase.ExternalDoc + var rDoc lowbase.ExternalDoc + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) + + // compare. + // compare. + extChanges := CompareExternalDocs(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType) +} + +func TestCompareExternalDocs_URLRemoved(t *testing.T) { + + left := `url: https://pb33f.io +description: something` + + right := `description: something` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc lowbase.ExternalDoc + var rDoc lowbase.ExternalDoc + _ = low.BuildModel(&lNode, &lDoc) + _ = low.BuildModel(&rNode, &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) + + // compare. + // compare. + extChanges := CompareExternalDocs(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, PropertyRemoved, extChanges.Changes[0].ChangeType) +}