diff --git a/datamodel/low/reference.go b/datamodel/low/reference.go index 2ae2580..cd40588 100644 --- a/datamodel/low/reference.go +++ b/datamodel/low/reference.go @@ -40,8 +40,10 @@ func (n NodeReference[T]) GenerateMapKey() string { return fmt.Sprintf("%d:%d", n.ValueNode.Line, n.ValueNode.Column) } -func (n NodeReference[T]) Mutate(value T) { +func (n NodeReference[T]) Mutate(value T) NodeReference[T] { n.ValueNode.Value = fmt.Sprintf("%v", value) + n.Value = value + return n } func (n ValueReference[T]) IsEmpty() bool { @@ -60,8 +62,10 @@ func (n KeyReference[T]) GenerateMapKey() string { return fmt.Sprintf("%d:%d", n.KeyNode.Line, n.KeyNode.Column) } -func (n ValueReference[T]) Mutate(value T) { +func (n ValueReference[T]) Mutate(value T) ValueReference[T] { n.ValueNode.Value = fmt.Sprintf("%v", value) + n.Value = value + return n } func IsCircular(node *yaml.Node, idx *index.SpecIndex) bool { diff --git a/datamodel/low/reference_test.go b/datamodel/low/reference_test.go index 6c88e29..0c697e7 100644 --- a/datamodel/low/reference_test.go +++ b/datamodel/low/reference_test.go @@ -4,58 +4,80 @@ package low import ( - "github.com/pb33f/libopenapi/index" - "github.com/pb33f/libopenapi/resolver" - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" - "testing" + "github.com/pb33f/libopenapi/index" + "github.com/pb33f/libopenapi/resolver" + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v3" + "testing" ) func TestNodeReference_IsEmpty(t *testing.T) { - nr := new(NodeReference[string]) - assert.True(t, nr.IsEmpty()) + nr := new(NodeReference[string]) + assert.True(t, nr.IsEmpty()) } func TestNodeReference_GenerateMapKey(t *testing.T) { - nr := new(NodeReference[string]) - nr.ValueNode = &yaml.Node{ - Line: 22, - Column: 23, - } - assert.Equal(t, "22:23", nr.GenerateMapKey()) + nr := new(NodeReference[string]) + nr.ValueNode = &yaml.Node{ + Line: 22, + Column: 23, + } + assert.Equal(t, "22:23", nr.GenerateMapKey()) +} + +func TestNodeReference_Mutate(t *testing.T) { + nr := new(NodeReference[string]) + nr.ValueNode = &yaml.Node{ + Line: 22, + Column: 23, + } + n := nr.Mutate("nice one!") + assert.Equal(t, "nice one!", n.Value) + assert.Equal(t, "nice one!", nr.ValueNode.Value) +} + +func TestValueReference_Mutate(t *testing.T) { + nr := new(ValueReference[string]) + nr.ValueNode = &yaml.Node{ + Line: 22, + Column: 23, + } + n := nr.Mutate("nice one!") + assert.Equal(t, "nice one!", n.Value) + assert.Equal(t, "nice one!", nr.ValueNode.Value) } func TestValueReference_IsEmpty(t *testing.T) { - nr := new(ValueReference[string]) - assert.True(t, nr.IsEmpty()) + nr := new(ValueReference[string]) + assert.True(t, nr.IsEmpty()) } func TestValueReference_GenerateMapKey(t *testing.T) { - nr := new(ValueReference[string]) - nr.ValueNode = &yaml.Node{ - Line: 22, - Column: 23, - } - assert.Equal(t, "22:23", nr.GenerateMapKey()) + nr := new(ValueReference[string]) + nr.ValueNode = &yaml.Node{ + Line: 22, + Column: 23, + } + assert.Equal(t, "22:23", nr.GenerateMapKey()) } func TestKeyReference_IsEmpty(t *testing.T) { - nr := new(KeyReference[string]) - assert.True(t, nr.IsEmpty()) + nr := new(KeyReference[string]) + assert.True(t, nr.IsEmpty()) } func TestKeyReference_GenerateMapKey(t *testing.T) { - nr := new(KeyReference[string]) - nr.KeyNode = &yaml.Node{ - Line: 22, - Column: 23, - } - assert.Equal(t, "22:23", nr.GenerateMapKey()) + nr := new(KeyReference[string]) + nr.KeyNode = &yaml.Node{ + Line: 22, + Column: 23, + } + assert.Equal(t, "22:23", nr.GenerateMapKey()) } func TestIsCircular_LookupFromJourney(t *testing.T) { - yml := `components: + yml := `components: schemas: Something: properties: @@ -66,28 +88,28 @@ func TestIsCircular_LookupFromJourney(t *testing.T) { something: $ref: '#/components/schemas/Something'` - var iNode yaml.Node - mErr := yaml.Unmarshal([]byte(yml), &iNode) - assert.NoError(t, mErr) - idx := index.NewSpecIndex(&iNode) + var iNode yaml.Node + mErr := yaml.Unmarshal([]byte(yml), &iNode) + assert.NoError(t, mErr) + idx := index.NewSpecIndex(&iNode) - yml = `$ref: '#/components/schemas/Something'` + yml = `$ref: '#/components/schemas/Something'` - resolve := resolver.NewResolver(idx) - errs := resolve.CheckForCircularReferences() - assert.Len(t, errs, 1) + resolve := resolver.NewResolver(idx) + errs := resolve.CheckForCircularReferences() + assert.Len(t, errs, 1) - var idxNode yaml.Node - _ = yaml.Unmarshal([]byte(yml), &idxNode) + var idxNode yaml.Node + _ = yaml.Unmarshal([]byte(yml), &idxNode) - ref, err := LocateRefNode(idxNode.Content[0], idx) - assert.NoError(t, err) - assert.True(t, IsCircular(ref, idx)) + ref, err := LocateRefNode(idxNode.Content[0], idx) + assert.NoError(t, err) + assert.True(t, IsCircular(ref, idx)) } func TestIsCircular_LookupFromLoopPoint(t *testing.T) { - yml := `components: + yml := `components: schemas: Something: properties: @@ -98,28 +120,28 @@ func TestIsCircular_LookupFromLoopPoint(t *testing.T) { something: $ref: '#/components/schemas/Something'` - var iNode yaml.Node - mErr := yaml.Unmarshal([]byte(yml), &iNode) - assert.NoError(t, mErr) - idx := index.NewSpecIndex(&iNode) + var iNode yaml.Node + mErr := yaml.Unmarshal([]byte(yml), &iNode) + assert.NoError(t, mErr) + idx := index.NewSpecIndex(&iNode) - yml = `$ref: '#/components/schemas/Nothing'` + yml = `$ref: '#/components/schemas/Nothing'` - resolve := resolver.NewResolver(idx) - errs := resolve.CheckForCircularReferences() - assert.Len(t, errs, 1) + resolve := resolver.NewResolver(idx) + errs := resolve.CheckForCircularReferences() + assert.Len(t, errs, 1) - var idxNode yaml.Node - _ = yaml.Unmarshal([]byte(yml), &idxNode) + var idxNode yaml.Node + _ = yaml.Unmarshal([]byte(yml), &idxNode) - ref, err := LocateRefNode(idxNode.Content[0], idx) - assert.NoError(t, err) - assert.True(t, IsCircular(ref, idx)) + ref, err := LocateRefNode(idxNode.Content[0], idx) + assert.NoError(t, err) + assert.True(t, IsCircular(ref, idx)) } func TestIsCircular_FromRefLookup(t *testing.T) { - yml := `components: + yml := `components: schemas: NotCircle: description: not a circle @@ -132,38 +154,38 @@ func TestIsCircular_FromRefLookup(t *testing.T) { something: $ref: '#/components/schemas/Something'` - var iNode yaml.Node - mErr := yaml.Unmarshal([]byte(yml), &iNode) - assert.NoError(t, mErr) - idx := index.NewSpecIndex(&iNode) + var iNode yaml.Node + mErr := yaml.Unmarshal([]byte(yml), &iNode) + assert.NoError(t, mErr) + idx := index.NewSpecIndex(&iNode) - resolve := resolver.NewResolver(idx) - errs := resolve.CheckForCircularReferences() - assert.Len(t, errs, 1) + resolve := resolver.NewResolver(idx) + errs := resolve.CheckForCircularReferences() + assert.Len(t, errs, 1) - yml = `$ref: '#/components/schemas/Nothing'` - var idxNode yaml.Node - _ = yaml.Unmarshal([]byte(yml), &idxNode) + yml = `$ref: '#/components/schemas/Nothing'` + var idxNode yaml.Node + _ = yaml.Unmarshal([]byte(yml), &idxNode) - assert.True(t, IsCircular(idxNode.Content[0], idx)) + assert.True(t, IsCircular(idxNode.Content[0], idx)) - yml = `$ref: '#/components/schemas/NotCircle'` - _ = yaml.Unmarshal([]byte(yml), &idxNode) + yml = `$ref: '#/components/schemas/NotCircle'` + _ = yaml.Unmarshal([]byte(yml), &idxNode) - assert.False(t, IsCircular(idxNode.Content[0], idx)) + assert.False(t, IsCircular(idxNode.Content[0], idx)) } func TestIsCircular_NoNode(t *testing.T) { - assert.False(t, IsCircular(nil, nil)) + assert.False(t, IsCircular(nil, nil)) } func TestGetCircularReferenceResult_NoNode(t *testing.T) { - assert.Nil(t, GetCircularReferenceResult(nil, nil)) + assert.Nil(t, GetCircularReferenceResult(nil, nil)) } func TestGetCircularReferenceResult_FromJourney(t *testing.T) { - yml := `components: + yml := `components: schemas: Something: properties: @@ -174,31 +196,31 @@ func TestGetCircularReferenceResult_FromJourney(t *testing.T) { something: $ref: '#/components/schemas/Something'` - var iNode yaml.Node - mErr := yaml.Unmarshal([]byte(yml), &iNode) - assert.NoError(t, mErr) - idx := index.NewSpecIndex(&iNode) + var iNode yaml.Node + mErr := yaml.Unmarshal([]byte(yml), &iNode) + assert.NoError(t, mErr) + idx := index.NewSpecIndex(&iNode) - yml = `$ref: '#/components/schemas/Something'` + yml = `$ref: '#/components/schemas/Something'` - resolve := resolver.NewResolver(idx) - errs := resolve.CheckForCircularReferences() - assert.Len(t, errs, 1) + resolve := resolver.NewResolver(idx) + errs := resolve.CheckForCircularReferences() + assert.Len(t, errs, 1) - var idxNode yaml.Node - _ = yaml.Unmarshal([]byte(yml), &idxNode) + var idxNode yaml.Node + _ = yaml.Unmarshal([]byte(yml), &idxNode) - ref, err := LocateRefNode(idxNode.Content[0], idx) - assert.NoError(t, err) - circ := GetCircularReferenceResult(ref, idx) - assert.NotNil(t, circ) - assert.Equal(t, "Nothing -> Something -> Nothing", circ.GenerateJourneyPath()) + ref, err := LocateRefNode(idxNode.Content[0], idx) + assert.NoError(t, err) + circ := GetCircularReferenceResult(ref, idx) + assert.NotNil(t, circ) + assert.Equal(t, "Nothing -> Something -> Nothing", circ.GenerateJourneyPath()) } func TestGetCircularReferenceResult_FromLoopPoint(t *testing.T) { - yml := `components: + yml := `components: schemas: Something: properties: @@ -209,31 +231,31 @@ func TestGetCircularReferenceResult_FromLoopPoint(t *testing.T) { something: $ref: '#/components/schemas/Something'` - var iNode yaml.Node - mErr := yaml.Unmarshal([]byte(yml), &iNode) - assert.NoError(t, mErr) - idx := index.NewSpecIndex(&iNode) + var iNode yaml.Node + mErr := yaml.Unmarshal([]byte(yml), &iNode) + assert.NoError(t, mErr) + idx := index.NewSpecIndex(&iNode) - yml = `$ref: '#/components/schemas/Nothing'` + yml = `$ref: '#/components/schemas/Nothing'` - resolve := resolver.NewResolver(idx) - errs := resolve.CheckForCircularReferences() - assert.Len(t, errs, 1) + resolve := resolver.NewResolver(idx) + errs := resolve.CheckForCircularReferences() + assert.Len(t, errs, 1) - var idxNode yaml.Node - _ = yaml.Unmarshal([]byte(yml), &idxNode) + var idxNode yaml.Node + _ = yaml.Unmarshal([]byte(yml), &idxNode) - ref, err := LocateRefNode(idxNode.Content[0], idx) - assert.NoError(t, err) - circ := GetCircularReferenceResult(ref, idx) - assert.NotNil(t, circ) - assert.Equal(t, "Nothing -> Something -> Nothing", circ.GenerateJourneyPath()) + ref, err := LocateRefNode(idxNode.Content[0], idx) + assert.NoError(t, err) + circ := GetCircularReferenceResult(ref, idx) + assert.NotNil(t, circ) + assert.Equal(t, "Nothing -> Something -> Nothing", circ.GenerateJourneyPath()) } func TestGetCircularReferenceResult_FromMappedRef(t *testing.T) { - yml := `components: + yml := `components: schemas: Something: properties: @@ -244,46 +266,46 @@ func TestGetCircularReferenceResult_FromMappedRef(t *testing.T) { something: $ref: '#/components/schemas/Something'` - var iNode yaml.Node - mErr := yaml.Unmarshal([]byte(yml), &iNode) - assert.NoError(t, mErr) - idx := index.NewSpecIndex(&iNode) + var iNode yaml.Node + mErr := yaml.Unmarshal([]byte(yml), &iNode) + assert.NoError(t, mErr) + idx := index.NewSpecIndex(&iNode) - yml = `$ref: '#/components/schemas/Nothing'` + yml = `$ref: '#/components/schemas/Nothing'` - resolve := resolver.NewResolver(idx) - errs := resolve.CheckForCircularReferences() - assert.Len(t, errs, 1) + resolve := resolver.NewResolver(idx) + errs := resolve.CheckForCircularReferences() + assert.Len(t, errs, 1) - var idxNode yaml.Node - _ = yaml.Unmarshal([]byte(yml), &idxNode) + var idxNode yaml.Node + _ = yaml.Unmarshal([]byte(yml), &idxNode) - circ := GetCircularReferenceResult(idxNode.Content[0], idx) - assert.NotNil(t, circ) - assert.Equal(t, "Nothing -> Something -> Nothing", circ.GenerateJourneyPath()) + circ := GetCircularReferenceResult(idxNode.Content[0], idx) + assert.NotNil(t, circ) + assert.Equal(t, "Nothing -> Something -> Nothing", circ.GenerateJourneyPath()) } func TestGetCircularReferenceResult_NothingFound(t *testing.T) { - yml := `components: + yml := `components: schemas: NotCircle: description: not a circle` - var iNode yaml.Node - mErr := yaml.Unmarshal([]byte(yml), &iNode) - assert.NoError(t, mErr) - idx := index.NewSpecIndex(&iNode) + var iNode yaml.Node + mErr := yaml.Unmarshal([]byte(yml), &iNode) + assert.NoError(t, mErr) + idx := index.NewSpecIndex(&iNode) - resolve := resolver.NewResolver(idx) - errs := resolve.CheckForCircularReferences() - assert.Len(t, errs, 0) + resolve := resolver.NewResolver(idx) + errs := resolve.CheckForCircularReferences() + assert.Len(t, errs, 0) - var idxNode yaml.Node - yml = `$ref: '#/components/schemas/NotCircle'` - _ = yaml.Unmarshal([]byte(yml), &idxNode) + var idxNode yaml.Node + yml = `$ref: '#/components/schemas/NotCircle'` + _ = yaml.Unmarshal([]byte(yml), &idxNode) - assert.Nil(t, GetCircularReferenceResult(idxNode.Content[0], idx)) + assert.Nil(t, GetCircularReferenceResult(idxNode.Content[0], idx)) -} \ No newline at end of file +} diff --git a/document_test.go b/document_test.go index f4c8101..c8e78a3 100644 --- a/document_test.go +++ b/document_test.go @@ -160,7 +160,12 @@ func TestDocument_Serialize_JSON_Modified(t *testing.T) { v3Doc, _ := doc.BuildV3Document() - v3Doc.Model.Info.GoLow().Title.Mutate("The magic API - but now, altered!") + // eventually this will be encapsulated up high. + // mutation does not replace low model, eventually pointers will be used. + newTitle := v3Doc.Model.Info.GoLow().Title.Mutate("The magic API - but now, altered!") + v3Doc.Model.Info.GoLow().Title = newTitle + + assert.Equal(t, "The magic API - but now, altered!", v3Doc.Model.Info.GoLow().Title.Value) serial, err := doc.Serialize() assert.NoError(t, err) diff --git a/libopenapi.go b/libopenapi.go deleted file mode 100644 index 320b093..0000000 --- a/libopenapi.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -//func main() { -// -// testData := `openapi: 3.0.1 -//info: -// title: this is a title -// description: this is a description -//tags: -// - name: Tag A -// description: cake -// x-hack: true -// - name: Tag B -// description: coffee -// x-code: hack` -// -// data := []byte(testData) -// _ = ioutil.WriteFile("sample.yaml", data, 0664) -// -// info, _ := datamodel.ExtractSpecInfo(data) -// lowDoc, err := low.CreateDocument(info) -// if len(err) > 0 { -// for e := range err { -// fmt.Printf("%e\n", err[e]) -// } -// return -// } -// highDoc := high.NewDocument(lowDoc) -// -// highDoc.Info.GoLow().Title.ValueNode.Value = "let's hack this" -// //highDoc.Tags[0].SetName("We are a new name now") -// //highDoc.Tags[0].SetDescription("and a new description") -// -// //newTag := lowDoc.AddTag() -// //fmt.Println(newTag) -// modified, _ := yaml.Marshal(info.RootNode) -// fmt.Println(string(modified)) -// -// os.Remove("sample.yaml") -// -//}