diff --git a/datamodel/high/v2/swagger_test.go b/datamodel/high/v2/swagger_test.go index 9d5c0df..e21eed4 100644 --- a/datamodel/high/v2/swagger_test.go +++ b/datamodel/high/v2/swagger_test.go @@ -218,26 +218,26 @@ func TestNewSwaggerDocument_Paths(t *testing.T) { assert.Equal(t, "uploadFile", upload.Post.OperationId) assert.Equal(t, "multipart/form-data", upload.Post.Consumes[0]) assert.Equal(t, "application/json", upload.Post.Produces[0]) - assert.Len(t, upload.Parameters, 3) - assert.Equal(t, "petId", upload.Parameters[0].Name) - assert.Equal(t, "path", upload.Parameters[0].In) - assert.Equal(t, "ID of pet to update", upload.Parameters[0].Description) - assert.True(t, *upload.Parameters[0].Required) - assert.Equal(t, "integer", upload.Parameters[0].Type) - assert.Equal(t, "int64", upload.Parameters[0].Format) - assert.True(t, *upload.Parameters[0].ExclusiveMaximum) - assert.True(t, *upload.Parameters[0].ExclusiveMinimum) - assert.Equal(t, 2, *upload.Parameters[0].MaxLength) - assert.Equal(t, 1, *upload.Parameters[0].MinLength) - assert.Equal(t, 1, *upload.Parameters[0].Minimum) - assert.Equal(t, 5, *upload.Parameters[0].Maximum) - assert.Equal(t, "hi!", upload.Parameters[0].Pattern) - assert.Equal(t, 1, *upload.Parameters[0].MinItems) - assert.Equal(t, 20, *upload.Parameters[0].MaxItems) - assert.True(t, *upload.Parameters[0].UniqueItems) - assert.Len(t, upload.Parameters[0].Enum, 2) - assert.Equal(t, "hello", upload.Parameters[0].Enum[0]) - def := upload.Parameters[0].Default.(map[string]interface{}) + assert.Len(t, upload.Post.Parameters, 3) + assert.Equal(t, "petId", upload.Post.Parameters[0].Name) + assert.Equal(t, "path", upload.Post.Parameters[0].In) + assert.Equal(t, "ID of pet to update", upload.Post.Parameters[0].Description) + assert.True(t, *upload.Post.Parameters[0].Required) + assert.Equal(t, "integer", upload.Post.Parameters[0].Type) + assert.Equal(t, "int64", upload.Post.Parameters[0].Format) + assert.True(t, *upload.Post.Parameters[0].ExclusiveMaximum) + assert.True(t, *upload.Post.Parameters[0].ExclusiveMinimum) + assert.Equal(t, 2, *upload.Post.Parameters[0].MaxLength) + assert.Equal(t, 1, *upload.Post.Parameters[0].MinLength) + assert.Equal(t, 1, *upload.Post.Parameters[0].Minimum) + assert.Equal(t, 5, *upload.Post.Parameters[0].Maximum) + assert.Equal(t, "hi!", upload.Post.Parameters[0].Pattern) + assert.Equal(t, 1, *upload.Post.Parameters[0].MinItems) + assert.Equal(t, 20, *upload.Post.Parameters[0].MaxItems) + assert.True(t, *upload.Post.Parameters[0].UniqueItems) + assert.Len(t, upload.Post.Parameters[0].Enum, 2) + assert.Equal(t, "hello", upload.Post.Parameters[0].Enum[0]) + def := upload.Post.Parameters[0].Default.(map[string]interface{}) assert.Equal(t, "here", def["something"]) assert.Equal(t, "https://pb33f.io", upload.Post.ExternalDocs.URL) diff --git a/datamodel/low/extraction_functions.go b/datamodel/low/extraction_functions.go index 4a1f324..9d876e2 100644 --- a/datamodel/low/extraction_functions.go +++ b/datamodel/low/extraction_functions.go @@ -221,7 +221,7 @@ func ExtractArray[T Buildable[N], N any](label string, root *yaml.Node, idx *ind root.Content[1].Value) } } else { - _, ln, vn = utils.FindKeyNodeFull(label, root.Content) + _, ln, vn = utils.FindKeyNodeFullTop(label, root.Content) if vn != nil { if h, _, _ := utils.IsNodeRefValue(vn); h { ref, err := LocateRefNode(vn, idx) diff --git a/datamodel/low/extraction_functions_test.go b/datamodel/low/extraction_functions_test.go index 1c0479e..b3c04c8 100644 --- a/datamodel/low/extraction_functions_test.go +++ b/datamodel/low/extraction_functions_test.go @@ -638,7 +638,7 @@ func TestExtractArray(t *testing.T) { var cNode yaml.Node _ = yaml.Unmarshal([]byte(yml), &cNode) - things, _, _, err := ExtractArray[*pizza]("things", &cNode, idx) + things, _, _, err := ExtractArray[*pizza]("things", cNode.Content[0], idx) assert.NoError(t, err) assert.NotNil(t, things) assert.Equal(t, "one", things[0].Value.Description.Value) diff --git a/datamodel/low/v2/swagger.go b/datamodel/low/v2/swagger.go index ed67ace..7a479b0 100644 --- a/datamodel/low/v2/swagger.go +++ b/datamodel/low/v2/swagger.go @@ -156,7 +156,7 @@ func CreateDocument(info *datamodel.SpecInfo) (*Swagger, []error) { doneChan := make(chan bool) errChan := make(chan error) for i := range extractionFuncs { - go extractionFuncs[i](info.RootNode, &doc, idx, doneChan, errChan) + go extractionFuncs[i](info.RootNode.Content[0], &doc, idx, doneChan, errChan) } completedExtractions := 0 for completedExtractions < len(extractionFuncs) { diff --git a/datamodel/low/v3/create_document.go b/datamodel/low/v3/create_document.go index 43c6b6e..990c520 100644 --- a/datamodel/low/v3/create_document.go +++ b/datamodel/low/v3/create_document.go @@ -71,7 +71,7 @@ func CreateDocument(info *datamodel.SpecInfo) (*Document, []error) { } func extractInfo(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) error { - _, ln, vn := utils.FindKeyNodeFull(base.InfoLabel, info.RootNode.Content) + _, ln, vn := utils.FindKeyNodeFullTop(base.InfoLabel, info.RootNode.Content[0].Content) if vn != nil { ir := base.Info{} _ = low.BuildModel(vn, &ir) @@ -83,7 +83,7 @@ func extractInfo(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) } func extractSecurity(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) error { - sec, ln, vn, err := low.ExtractArray[*base.SecurityRequirement](SecurityLabel, info.RootNode, idx) + sec, ln, vn, err := low.ExtractArray[*base.SecurityRequirement](SecurityLabel, info.RootNode.Content[0], idx) if err != nil { return err } @@ -96,7 +96,7 @@ func extractSecurity(info *datamodel.SpecInfo, doc *Document, idx *index.SpecInd } func extractExternalDocs(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) error { - extDocs, dErr := low.ExtractObject[*base.ExternalDoc](base.ExternalDocsLabel, info.RootNode, idx) + extDocs, dErr := low.ExtractObject[*base.ExternalDoc](base.ExternalDocsLabel, info.RootNode.Content[0], idx) if dErr != nil { return dErr } @@ -105,7 +105,7 @@ func extractExternalDocs(info *datamodel.SpecInfo, doc *Document, idx *index.Spe } func extractComponents(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) error { - _, ln, vn := utils.FindKeyNodeFull(ComponentsLabel, info.RootNode.Content) + _, ln, vn := utils.FindKeyNodeFullTop(ComponentsLabel, info.RootNode.Content[0].Content) if vn != nil { ir := Components{} _ = low.BuildModel(vn, &ir) @@ -120,7 +120,7 @@ func extractComponents(info *datamodel.SpecInfo, doc *Document, idx *index.SpecI } func extractServers(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) error { - _, ln, vn := utils.FindKeyNodeFull(ServersLabel, info.RootNode.Content) + _, ln, vn := utils.FindKeyNodeFull(ServersLabel, info.RootNode.Content[0].Content) if vn != nil { if utils.IsNodeArray(vn) { var servers []low.ValueReference[*Server] @@ -146,7 +146,7 @@ func extractServers(info *datamodel.SpecInfo, doc *Document, idx *index.SpecInde } func extractTags(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) error { - _, ln, vn := utils.FindKeyNodeFull(base.TagsLabel, info.RootNode.Content) + _, ln, vn := utils.FindKeyNodeFull(base.TagsLabel, info.RootNode.Content[0].Content) if vn != nil { if utils.IsNodeArray(vn) { var tags []low.ValueReference[*base.Tag] @@ -174,7 +174,7 @@ func extractTags(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) } func extractPaths(info *datamodel.SpecInfo, doc *Document, idx *index.SpecIndex) error { - _, ln, vn := utils.FindKeyNodeFull(PathsLabel, info.RootNode.Content) + _, ln, vn := utils.FindKeyNodeFull(PathsLabel, info.RootNode.Content[0].Content) if vn != nil { ir := Paths{} err := ir.Build(vn, idx) diff --git a/datamodel/low/v3/create_document_test.go b/datamodel/low/v3/create_document_test.go index 2e5797d..0097def 100644 --- a/datamodel/low/v3/create_document_test.go +++ b/datamodel/low/v3/create_document_test.go @@ -449,7 +449,8 @@ func TestCreateDocument_Components_Links(t *testing.T) { func TestCreateDocument_Doc_Security(t *testing.T) { initTest() - oAuth := doc.FindSecurityRequirement("OAuthScheme") + d := doc + oAuth := d.FindSecurityRequirement("OAuthScheme") assert.Len(t, oAuth, 2) } diff --git a/datamodel/low/v3/response.go b/datamodel/low/v3/response.go index b48c4e0..5e7bd1a 100644 --- a/datamodel/low/v3/response.go +++ b/datamodel/low/v3/response.go @@ -96,11 +96,10 @@ func (r *Response) Hash() [32]byte { if r.Description.Value != "" { f = append(f, r.Description.Value) } - keys := make([]string, len(r.Headers.Value)) z := 0 for k := range r.Headers.Value { - keys[z] = low.GenerateHashString(r.Headers.Value[k].Value) + keys[z] = fmt.Sprintf("%s-%s", k.Value, low.GenerateHashString(r.Headers.Value[k].Value)) z++ } sort.Strings(keys) @@ -108,7 +107,7 @@ func (r *Response) Hash() [32]byte { keys = make([]string, len(r.Content.Value)) z = 0 for k := range r.Content.Value { - keys[z] = low.GenerateHashString(r.Content.Value[k].Value) + keys[z] = fmt.Sprintf("%s-%s", k.Value, low.GenerateHashString(r.Content.Value[k].Value)) z++ } sort.Strings(keys) @@ -116,7 +115,7 @@ func (r *Response) Hash() [32]byte { keys = make([]string, len(r.Links.Value)) z = 0 for k := range r.Links.Value { - keys[z] = low.GenerateHashString(r.Links.Value[k].Value) + keys[z] = fmt.Sprintf("%s-%s", k.Value, low.GenerateHashString(r.Links.Value[k].Value)) z++ } sort.Strings(keys) diff --git a/datamodel/low/v3/response_test.go b/datamodel/low/v3/response_test.go index 3ffca2f..b679313 100644 --- a/datamodel/low/v3/response_test.go +++ b/datamodel/low/v3/response_test.go @@ -61,7 +61,7 @@ default: assert.Equal(t, "a link", link.Value.Description.Value) // check hash - assert.Equal(t, "4ab807033ce9ca57ab551d8569cc11da8722c4ae75c003bc23b495ab756f468a", + assert.Equal(t, "c009b2046101bc03df802b4cf23f78176931137e6115bf7b445ca46856c06b51", low.GenerateHashString(&n)) } @@ -95,7 +95,7 @@ x-shoes: old` err = n.Build(idxNode.Content[0], idx) // check hash - assert.Equal(t, "1b9161a7d31a9aa4580899f57092bcb6801b37045777bff28981bd2288c72b10", + assert.Equal(t, "54ab66e6cb8bd226940f421c2387e45215b84c946182435dfe2a3036043fa07c", low.GenerateHashString(&n)) } diff --git a/datamodel/low/v3/responses.go b/datamodel/low/v3/responses.go index 7bad3dc..bb81874 100644 --- a/datamodel/low/v3/responses.go +++ b/datamodel/low/v3/responses.go @@ -114,7 +114,7 @@ func (r *Responses) Hash() [32]byte { } sort.Strings(keys) for k := range keys { - f = append(f, low.GenerateHashString(cMap[keys[k]])) + f = append(f, fmt.Sprintf("%s-%s", keys[k], low.GenerateHashString(cMap[keys[k]]))) } if !r.Default.IsEmpty() { f = append(f, low.GenerateHashString(r.Default.Value)) diff --git a/test_specs/burgershop.openapi-modified.yaml b/test_specs/burgershop.openapi-modified.yaml index 9bf1e5b..b835cf9 100644 --- a/test_specs/burgershop.openapi-modified.yaml +++ b/test_specs/burgershop.openapi-modified.yaml @@ -185,12 +185,10 @@ paths: /burgers/{burgerId}/dressings: get: operationId: listBurgerDressings - tags: - - "Dressing" summary: Get a list of all dressings available description: Same as the summary, look up a tasty burger, by its ID - the burger identifier parameters: - - in: path + - in: query name: burgerId schema: type: string diff --git a/what-changed/model/path_item_test.go b/what-changed/model/path_item_test.go index 7044cf1..9a2eff0 100644 --- a/what-changed/model/path_item_test.go +++ b/what-changed/model/path_item_test.go @@ -621,3 +621,35 @@ trace: assert.Equal(t, 8, extChanges.TotalChanges()) assert.Equal(t, 8, extChanges.TotalBreakingChanges()) } + +func TestComparePathItem_V3_ChangeParam(t *testing.T) { + + left := `get: + operationId: listBurgerDressings + parameters: + - in: query + name: burgerId` + + right := `get: + operationId: listBurgerDressings + parameters: + - in: head + name: burgerId` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc v3.PathItem + var rDoc v3.PathItem + _ = 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 := ComparePathItems(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) +} diff --git a/what-changed/model/responses.go b/what-changed/model/responses.go index 230b4de..96959e2 100644 --- a/what-changed/model/responses.go +++ b/what-changed/model/responses.go @@ -87,7 +87,7 @@ func CompareResponses(l, r any) *ResponsesChanges { lResponses := l.(*v3.Responses) rResponses := r.(*v3.Responses) - // perform hash check to avoid further processing + //perform hash check to avoid further processing if low.AreEqual(lResponses, rResponses) { return nil } diff --git a/what-changed/model/responses_test.go b/what-changed/model/responses_test.go index 03d2c9a..e62c251 100644 --- a/what-changed/model/responses_test.go +++ b/what-changed/model/responses_test.go @@ -4,17 +4,17 @@ 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" + "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 TestCompareResponses_V2(t *testing.T) { - left := `x-coffee: roasty + left := `x-coffee: roasty default: schema: type: string @@ -27,27 +27,27 @@ default: schema: type: string` - right := left + right := left - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v2.Responses - var rDoc v2.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v2.Responses + var rDoc v2.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Nil(t, extChanges) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Nil(t, extChanges) } func TestCompareResponses_V2_ModifyCode(t *testing.T) { - left := `200: + left := `200: description: OK response schema: type: int @@ -57,7 +57,7 @@ func TestCompareResponses_V2_ModifyCode(t *testing.T) { type: int x-ting: tang` - right := `200: + right := `200: description: OK response schema: type: string @@ -67,27 +67,27 @@ x-ting: tang` type: string x-ting: tang` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v2.Responses - var rDoc v2.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v2.Responses + var rDoc v2.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Equal(t, 2, extChanges.TotalChanges()) - assert.Equal(t, 2, extChanges.TotalBreakingChanges()) - assert.Equal(t, Modified, extChanges.ResponseChanges["404"].SchemaChanges.Changes[0].ChangeType) - assert.Equal(t, Modified, extChanges.ResponseChanges["200"].SchemaChanges.Changes[0].ChangeType) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Equal(t, 2, extChanges.TotalChanges()) + assert.Equal(t, 2, extChanges.TotalBreakingChanges()) + assert.Equal(t, Modified, extChanges.ResponseChanges["404"].SchemaChanges.Changes[0].ChangeType) + assert.Equal(t, Modified, extChanges.ResponseChanges["200"].SchemaChanges.Changes[0].ChangeType) } func TestCompareResponses_V2_AddSchema(t *testing.T) { - left := `x-hack: code + left := `x-hack: code 200: description: OK response schema: @@ -98,7 +98,7 @@ x-apple: pie schema: type: int` - right := `404: + right := `404: description: not found response schema: type: int @@ -107,26 +107,26 @@ x-hack: all the code description: OK response x-apple: pie` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v2.Responses - var rDoc v2.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v2.Responses + var rDoc v2.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&rDoc, &lDoc) - assert.Equal(t, 2, extChanges.TotalChanges()) - assert.Equal(t, 1, extChanges.TotalBreakingChanges()) - assert.Equal(t, ObjectAdded, extChanges.ResponseChanges["200"].Changes[0].ChangeType) + extChanges := CompareResponses(&rDoc, &lDoc) + assert.Equal(t, 2, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) + assert.Equal(t, ObjectAdded, extChanges.ResponseChanges["200"].Changes[0].ChangeType) } func TestCompareResponses_V2_RemoveSchema(t *testing.T) { - left := `200: + left := `200: description: OK response schema: type: int @@ -135,38 +135,38 @@ func TestCompareResponses_V2_RemoveSchema(t *testing.T) { schema: type: int` - right := `200: + right := `200: description: OK response 404: description: not found response schema: type: int` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v2.Responses - var rDoc v2.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v2.Responses + var rDoc v2.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Equal(t, 1, extChanges.TotalChanges()) - assert.Equal(t, 1, extChanges.TotalBreakingChanges()) - assert.Equal(t, ObjectRemoved, extChanges.ResponseChanges["200"].Changes[0].ChangeType) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) + assert.Equal(t, ObjectRemoved, extChanges.ResponseChanges["200"].Changes[0].ChangeType) } func TestCompareResponses_V2_AddDefault(t *testing.T) { - left := `200: + left := `200: description: OK response schema: type: int` - right := `200: + right := `200: description: OK response schema: type: int @@ -175,31 +175,31 @@ default: schema: type: int` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v2.Responses - var rDoc v2.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v2.Responses + var rDoc v2.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Equal(t, 1, extChanges.TotalChanges()) - assert.Equal(t, 0, extChanges.TotalBreakingChanges()) - assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 0, extChanges.TotalBreakingChanges()) + assert.Equal(t, ObjectAdded, extChanges.Changes[0].ChangeType) } func TestCompareResponses_V2_RemoveDefault(t *testing.T) { - left := `200: + left := `200: description: OK response schema: type: int` - right := `200: + right := `200: description: OK response schema: type: int @@ -208,26 +208,26 @@ default: schema: type: int` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v2.Responses - var rDoc v2.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v2.Responses + var rDoc v2.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&rDoc, &lDoc) - assert.Equal(t, 1, extChanges.TotalChanges()) - assert.Equal(t, 1, extChanges.TotalBreakingChanges()) - assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType) + extChanges := CompareResponses(&rDoc, &lDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) + assert.Equal(t, ObjectRemoved, extChanges.Changes[0].ChangeType) } func TestCompareResponses_V2_ModifyDefault(t *testing.T) { - left := `200: + left := `200: description: OK response schema: type: int @@ -236,7 +236,7 @@ default: schema: type: string` - right := `200: + right := `200: description: OK response schema: type: int @@ -245,26 +245,26 @@ default: schema: type: int` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v2.Responses - var rDoc v2.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v2.Responses + var rDoc v2.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Equal(t, 2, extChanges.TotalChanges()) - assert.Equal(t, 1, extChanges.TotalBreakingChanges()) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Equal(t, 2, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) } func TestCompareResponses_V3(t *testing.T) { - left := `x-coffee: roasty + left := `x-coffee: roasty default: description: a thing 200: @@ -272,27 +272,27 @@ default: 404: description: not found response` - right := left + right := left - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v3.Responses - var rDoc v3.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v3.Responses + var rDoc v3.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Nil(t, extChanges) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Nil(t, extChanges) } func TestCompareResponses_V3_ModifyCode(t *testing.T) { - left := `x-coffee: roasty + left := `x-coffee: roasty default: description: a thing 200: @@ -300,7 +300,7 @@ default: 404: description: not found response` - right := `404: + right := `404: description: not found response but new! default: description: a thing that changed @@ -308,32 +308,32 @@ x-coffee: yum 200: description: blast off` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v3.Responses - var rDoc v3.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v3.Responses + var rDoc v3.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Equal(t, 4, extChanges.TotalChanges()) - assert.Equal(t, 0, extChanges.TotalBreakingChanges()) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Equal(t, 4, extChanges.TotalChanges()) + assert.Equal(t, 0, extChanges.TotalBreakingChanges()) } func TestCompareResponses_V3_AddDefault(t *testing.T) { - left := `x-coffee: roasty + left := `x-coffee: roasty 200: description: OK response 404: description: not found response` - right := `x-coffee: roasty + right := `x-coffee: roasty default: description: a thing 200: @@ -341,33 +341,33 @@ default: 404: description: not found response` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v3.Responses - var rDoc v3.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v3.Responses + var rDoc v3.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Equal(t, 1, extChanges.TotalChanges()) - assert.Equal(t, 0, extChanges.TotalBreakingChanges()) - assert.Equal(t, v3.DefaultLabel, extChanges.Changes[0].Property) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 0, extChanges.TotalBreakingChanges()) + assert.Equal(t, v3.DefaultLabel, extChanges.Changes[0].Property) } func TestCompareResponses_V3_RemoveDefault(t *testing.T) { - left := `x-coffee: roasty + left := `x-coffee: roasty 200: description: OK response 404: description: not found response` - right := `x-coffee: roasty + right := `x-coffee: roasty default: description: a thing 200: @@ -375,27 +375,27 @@ default: 404: description: not found response` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v3.Responses - var rDoc v3.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v3.Responses + var rDoc v3.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&rDoc, &lDoc) - assert.Equal(t, 1, extChanges.TotalChanges()) - assert.Equal(t, 1, extChanges.TotalBreakingChanges()) - assert.Equal(t, v3.DefaultLabel, extChanges.Changes[0].Property) + extChanges := CompareResponses(&rDoc, &lDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) + assert.Equal(t, v3.DefaultLabel, extChanges.Changes[0].Property) } func TestCompareResponses_V3_ModifyDefault(t *testing.T) { - left := `x-coffee: roasty + left := `x-coffee: roasty 200: description: OK response 404: @@ -403,7 +403,7 @@ func TestCompareResponses_V3_ModifyDefault(t *testing.T) { default: description: a thing` - right := `x-coffee: roasty + right := `x-coffee: roasty default: description: a thing that changed! 200: @@ -411,20 +411,51 @@ default: 404: description: not found response` - var lNode, rNode yaml.Node - _ = yaml.Unmarshal([]byte(left), &lNode) - _ = yaml.Unmarshal([]byte(right), &rNode) + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) - // create low level objects - var lDoc v3.Responses - var rDoc v3.Responses - _ = low.BuildModel(lNode.Content[0], &lDoc) - _ = low.BuildModel(rNode.Content[0], &rDoc) - _ = lDoc.Build(lNode.Content[0], nil) - _ = rDoc.Build(rNode.Content[0], nil) + // create low level objects + var lDoc v3.Responses + var rDoc v3.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) - extChanges := CompareResponses(&lDoc, &rDoc) - assert.Equal(t, 1, extChanges.TotalChanges()) - assert.Equal(t, 0, extChanges.TotalBreakingChanges()) + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Equal(t, 1, extChanges.TotalChanges()) + assert.Equal(t, 0, extChanges.TotalBreakingChanges()) assert.Equal(t, v3.DescriptionLabel, extChanges.DefaultChanges.Changes[0].Property) } + +func TestCompareResponses_V3_AddRemoveMediaType(t *testing.T) { + + left := `200: + content: + application/json: + schema: + type: int` + + right := `200: + content: + application/xml: + schema: + type: int` + + var lNode, rNode yaml.Node + _ = yaml.Unmarshal([]byte(left), &lNode) + _ = yaml.Unmarshal([]byte(right), &rNode) + + // create low level objects + var lDoc v3.Responses + var rDoc v3.Responses + _ = low.BuildModel(lNode.Content[0], &lDoc) + _ = low.BuildModel(rNode.Content[0], &rDoc) + _ = lDoc.Build(lNode.Content[0], nil) + _ = rDoc.Build(rNode.Content[0], nil) + + extChanges := CompareResponses(&lDoc, &rDoc) + assert.Equal(t, 2, extChanges.TotalChanges()) + assert.Equal(t, 1, extChanges.TotalBreakingChanges()) +} diff --git a/what-changed/what_changed_test.go b/what-changed/what_changed_test.go index ee5ea51..2d4a5e7 100644 --- a/what-changed/what_changed_test.go +++ b/what-changed/what_changed_test.go @@ -22,8 +22,8 @@ func TestCompareOpenAPIDocuments(t *testing.T) { modDoc, _ := v3.CreateDocument(infoMod) changes := CompareOpenAPIDocuments(origDoc, modDoc) - assert.Equal(t, 28, changes.TotalChanges()) - assert.Equal(t, 5, changes.TotalBreakingChanges()) + assert.Equal(t, 30, changes.TotalChanges()) + assert.Equal(t, 6, changes.TotalBreakingChanges()) }