From 7d8762fdd973d36154ce3fcaedbbb2a4dd6bc8ad Mon Sep 17 00:00:00 2001 From: quobix Date: Fri, 3 Nov 2023 18:25:27 -0400 Subject: [PATCH] added more coverage and resolved param ref issue Signed-off-by: quobix --- datamodel/low/extraction_functions.go | 3 -- datamodel/low/extraction_functions_test.go | 34 ++++++++++++++++++++++ index/extract_refs.go | 13 ++++----- index/resolver.go | 6 +++- index/resolver_test.go | 24 +++++++++++++++ index/search_index.go | 15 ++++------ index/utility_methods.go | 3 ++ 7 files changed, 76 insertions(+), 22 deletions(-) diff --git a/datamodel/low/extraction_functions.go b/datamodel/low/extraction_functions.go index 6998f47..986b1ca 100644 --- a/datamodel/low/extraction_functions.go +++ b/datamodel/low/extraction_functions.go @@ -164,13 +164,10 @@ func LocateRefNodeWithContext(ctx context.Context, root *yaml.Node, idx *index.S u.Path = abs rv = u.String() } - } } - } } - } foundRef, fIdx, newCtx := idx.SearchIndexForReferenceWithContext(ctx, rv) diff --git a/datamodel/low/extraction_functions_test.go b/datamodel/low/extraction_functions_test.go index 76316e2..5e55d93 100644 --- a/datamodel/low/extraction_functions_test.go +++ b/datamodel/low/extraction_functions_test.go @@ -915,6 +915,29 @@ func TestExtractArray_BadBuild(t *testing.T) { assert.Len(t, things, 0) } +func TestExtractArray_BadRefPropsTupe(t *testing.T) { + + yml := `components: + parameters: + cakes: + limes: cake` + + var idxNode yaml.Node + mErr := yaml.Unmarshal([]byte(yml), &idxNode) + assert.NoError(t, mErr) + idx := index.NewSpecIndexWithConfig(&idxNode, index.CreateClosedAPIIndexConfig()) + + yml = `limes: + $ref: '#/components/parameters/cakes'` + + var cNode yaml.Node + e := yaml.Unmarshal([]byte(yml), &cNode) + assert.NoError(t, e) + things, _, _, err := ExtractArray[*test_noGood](context.Background(), "limes", cNode.Content[0], idx) + assert.Error(t, err) + assert.Len(t, things, 0) +} + func TestExtractExample_String(t *testing.T) { yml := `hi` var e yaml.Node @@ -1573,6 +1596,17 @@ func TestExtractMapFlat_Ref_Bad(t *testing.T) { assert.Len(t, things, 0) } +/* + '/companies/{companyId}/data/payments/{paymentId}': + parameters: + - $ref: '#/components/parameters/companyId' + get: + tags: + - Accounts receivable + parameters: + - $ref: '#/paths/~1companies~1%7BcompanyId%7D~1connections~1%7BconnectionId%7D~1data~1commerce-payments~1%7BpaymentId%7D/parameters/2' +*/ + func TestExtractExtensions(t *testing.T) { yml := `x-bing: ding diff --git a/index/extract_refs.go b/index/extract_refs.go index 6fe165a..d6ed838 100644 --- a/index/extract_refs.go +++ b/index/extract_refs.go @@ -557,23 +557,20 @@ func (index *SpecIndex) ExtractComponentsFromRefs(refs []*Reference) []*Referenc located := index.FindComponent(ref.FullDefinition) if located != nil { - index.refLock.Lock() // have we already mapped this? + index.refLock.Lock() if index.allMappedRefs[ref.FullDefinition] == nil { found = append(found, located) - if located.FullDefinition != ref.FullDefinition { - located.FullDefinition = ref.FullDefinition - } - - index.allMappedRefs[ref.FullDefinition] = located + index.allMappedRefs[located.FullDefinition] = located rm := &ReferenceMapped{ Reference: located, - Definition: ref.Definition, - FullDefinition: ref.FullDefinition, + Definition: located.Definition, + FullDefinition: located.FullDefinition, } sequence[refIndex] = rm } index.refLock.Unlock() + } else { _, path := utils.ConvertComponentIdIntoFriendlyPathSearch(ref.Definition) diff --git a/index/resolver.go b/index/resolver.go index fe8c8e0..a1b5374 100644 --- a/index/resolver.go +++ b/index/resolver.go @@ -539,7 +539,11 @@ func (resolver *Resolver) extractRelatives(ref *Reference, node, parent *yaml.No } if resolve { - ref.Node = locatedRef.Node + // if this is a reference also, we want to resolve it. + if ok, _, _ := utils.IsNodeRefValue(ref.Node); ok { + ref.Node = locatedRef.Node + ref.Resolved = true + } } schemaType := "" diff --git a/index/resolver_test.go b/index/resolver_test.go index c9d16c5..f60cb2a 100644 --- a/index/resolver_test.go +++ b/index/resolver_test.go @@ -536,6 +536,30 @@ components: assert.Equal(t, "cannot resolve reference `go home, I am drunk`, it's missing: $go home, I am drunk [18:11]", err[0].Error()) } +func TestResolver_ResolveThroughPaths(t *testing.T) { + yml := `paths: + /pizza/{cake}/{pizza}/pie: + parameters: + - name: juicy + /companies/{companyId}/data/payments/{paymentId}: + get: + tags: + - Accounts receivable + parameters: + - $ref: '#/paths/~1pizza~1%7Bcake%7D~1%7Bpizza%7D~1pie/parameters/0'` + + var rootNode yaml.Node + _ = yaml.Unmarshal([]byte(yml), &rootNode) + + idx := NewSpecIndexWithConfig(&rootNode, CreateClosedAPIIndexConfig()) + + resolver := NewResolver(idx) + assert.NotNil(t, resolver) + + err := resolver.Resolve() + assert.Len(t, err, 0) +} + func TestResolver_ResolveComponents_MixedRef(t *testing.T) { mixedref, _ := os.ReadFile("../test_specs/mixedref-burgershop.openapi.yaml") var rootNode yaml.Node diff --git a/index/search_index.go b/index/search_index.go index 16d107c..f2b2747 100644 --- a/index/search_index.go +++ b/index/search_index.go @@ -6,6 +6,7 @@ package index import ( "context" "fmt" + "net/url" "path/filepath" "strings" ) @@ -89,6 +90,10 @@ func (index *SpecIndex) SearchIndexForReferenceByReferenceWithContext(ctx contex } ref = uri[0] } + if strings.Contains(ref, "%") { + // decode the url. + ref, _ = url.QueryUnescape(ref) + } if r, ok := index.allMappedRefs[ref]; ok { index.cache.Store(ref, r) @@ -164,16 +169,6 @@ func (index *SpecIndex) SearchIndexForReferenceByReferenceWithContext(ctx contex } } } - } else { - if r, ok := index.allMappedRefs[ref]; ok { - index.cache.Store(ref, r) - return r, r.Index, context.WithValue(ctx, CurrentPathKey, r.RemoteLocation) - } - - if r, ok := index.allMappedRefs[refAlt]; ok { - index.cache.Store(refAlt, r) - return r, r.Index, context.WithValue(ctx, CurrentPathKey, r.RemoteLocation) - } } if index.logger != nil { diff --git a/index/utility_methods.go b/index/utility_methods.go index 48a710c..0da56d5 100644 --- a/index/utility_methods.go +++ b/index/utility_methods.go @@ -367,6 +367,9 @@ func (index *SpecIndex) scanOperationParams(params []*yaml.Node, pathItemNode *y ref := seekRefEnd(index, paramRefName) if ref != nil { paramRef = ref + if strings.Contains(paramRefName, "%") { + paramRefName, _ = url.QueryUnescape(paramRefName) + } } }