Skip to content

Commit 46053c0

Browse files
authored
Enforce grouped NuGet search results (#21442) (#21480)
Backport of #21442
1 parent 3f03275 commit 46053c0

File tree

2 files changed

+72
-35
lines changed

2 files changed

+72
-35
lines changed

integrations/api_packages_nuget_test.go

Lines changed: 66 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"encoding/base64"
1111
"fmt"
1212
"io"
13+
"io/ioutil"
1314
"net/http"
1415
"testing"
1516

@@ -43,23 +44,29 @@ func TestPackageNuGet(t *testing.T) {
4344
symbolFilename := "test.pdb"
4445
symbolID := "d910bb6948bd4c6cb40155bcf52c3c94"
4546

46-
var buf bytes.Buffer
47-
archive := zip.NewWriter(&buf)
48-
w, _ := archive.Create("package.nuspec")
49-
w.Write([]byte(`<?xml version="1.0" encoding="utf-8"?>
50-
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
51-
<metadata>
52-
<id>` + packageName + `</id>
53-
<version>` + packageVersion + `</version>
54-
<authors>` + packageAuthors + `</authors>
55-
<description>` + packageDescription + `</description>
56-
<group targetFramework=".NETStandard2.0">
57-
<dependency id="Microsoft.CSharp" version="4.5.0" />
58-
</group>
59-
</metadata>
60-
</package>`))
61-
archive.Close()
62-
content := buf.Bytes()
47+
createPackage := func(id, version string) io.Reader {
48+
var buf bytes.Buffer
49+
archive := zip.NewWriter(&buf)
50+
w, _ := archive.Create("package.nuspec")
51+
w.Write([]byte(`<?xml version="1.0" encoding="utf-8"?>
52+
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
53+
<metadata>
54+
<id>` + id + `</id>
55+
<version>` + version + `</version>
56+
<authors>` + packageAuthors + `</authors>
57+
<description>` + packageDescription + `</description>
58+
<dependencies>
59+
<group targetFramework=".NETStandard2.0">
60+
<dependency id="Microsoft.CSharp" version="4.5.0" />
61+
</group>
62+
</dependencies>
63+
</metadata>
64+
</package>`))
65+
archive.Close()
66+
return &buf
67+
}
68+
69+
content, _ := ioutil.ReadAll(createPackage(packageName, packageVersion))
6370

6471
url := fmt.Sprintf("/api/packages/%s/nuget", user.Name)
6572

@@ -159,7 +166,7 @@ func TestPackageNuGet(t *testing.T) {
159166
t.Run("SymbolPackage", func(t *testing.T) {
160167
defer PrintCurrentTest(t)()
161168

162-
createPackage := func(id, packageType string) io.Reader {
169+
createSymbolPackage := func(id, packageType string) io.Reader {
163170
var buf bytes.Buffer
164171
archive := zip.NewWriter(&buf)
165172

@@ -185,15 +192,15 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
185192
return &buf
186193
}
187194

188-
req := NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createPackage("unknown-package", "SymbolsPackage"))
195+
req := NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createSymbolPackage("unknown-package", "SymbolsPackage"))
189196
req = AddBasicAuthHeader(req, user.Name)
190197
MakeRequest(t, req, http.StatusNotFound)
191198

192-
req = NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createPackage(packageName, "DummyPackage"))
199+
req = NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createSymbolPackage(packageName, "DummyPackage"))
193200
req = AddBasicAuthHeader(req, user.Name)
194201
MakeRequest(t, req, http.StatusBadRequest)
195202

196-
req = NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createPackage(packageName, "SymbolsPackage"))
203+
req = NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createSymbolPackage(packageName, "SymbolsPackage"))
197204
req = AddBasicAuthHeader(req, user.Name)
198205
MakeRequest(t, req, http.StatusCreated)
199206

@@ -237,7 +244,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
237244
}
238245
}
239246

240-
req = NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createPackage(packageName, "SymbolsPackage"))
247+
req = NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createSymbolPackage(packageName, "SymbolsPackage"))
241248
req = AddBasicAuthHeader(req, user.Name)
242249
MakeRequest(t, req, http.StatusConflict)
243250
})
@@ -315,6 +322,43 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
315322
assert.Equal(t, c.ExpectedTotal, result.TotalHits, "case %d: unexpected total hits", i)
316323
assert.Len(t, result.Data, c.ExpectedResults, "case %d: unexpected result count", i)
317324
}
325+
326+
t.Run("EnforceGrouped", func(t *testing.T) {
327+
defer PrintCurrentTest(t)()
328+
329+
req := NewRequestWithBody(t, "PUT", url, createPackage(packageName+".dummy", "1.0.0"))
330+
req = AddBasicAuthHeader(req, user.Name)
331+
MakeRequest(t, req, http.StatusCreated)
332+
333+
req = NewRequestWithBody(t, "PUT", url, createPackage(packageName, "1.0.99"))
334+
req = AddBasicAuthHeader(req, user.Name)
335+
MakeRequest(t, req, http.StatusCreated)
336+
337+
req = NewRequest(t, "GET", fmt.Sprintf("%s/query?q=%s", url, packageName))
338+
req = AddBasicAuthHeader(req, user.Name)
339+
resp := MakeRequest(t, req, http.StatusOK)
340+
341+
var result nuget.SearchResultResponse
342+
DecodeJSON(t, resp, &result)
343+
344+
assert.EqualValues(t, 3, result.TotalHits)
345+
assert.Len(t, result.Data, 2)
346+
for _, sr := range result.Data {
347+
if sr.ID == packageName {
348+
assert.Len(t, sr.Versions, 2)
349+
} else {
350+
assert.Len(t, sr.Versions, 1)
351+
}
352+
}
353+
354+
req = NewRequest(t, "DELETE", fmt.Sprintf("%s/%s/%s", url, packageName+".dummy", "1.0.0"))
355+
req = AddBasicAuthHeader(req, user.Name)
356+
MakeRequest(t, req, http.StatusNoContent)
357+
358+
req = NewRequest(t, "DELETE", fmt.Sprintf("%s/%s/%s", url, packageName, "1.0.99"))
359+
req = AddBasicAuthHeader(req, user.Name)
360+
MakeRequest(t, req, http.StatusNoContent)
361+
})
318362
})
319363

320364
t.Run("RegistrationService", func(t *testing.T) {

routers/api/packages/nuget/api.go

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -224,20 +224,13 @@ type SearchResultVersion struct {
224224
}
225225

226226
func createSearchResultResponse(l *linkBuilder, totalHits int64, pds []*packages_model.PackageDescriptor) *SearchResultResponse {
227-
data := make([]*SearchResult, 0, len(pds))
227+
grouped := make(map[string][]*packages_model.PackageDescriptor)
228+
for _, pd := range pds {
229+
grouped[pd.Package.Name] = append(grouped[pd.Package.Name], pd)
230+
}
228231

229-
if len(pds) > 0 {
230-
groupID := pds[0].Package.Name
231-
group := make([]*packages_model.PackageDescriptor, 0, 10)
232-
233-
for i := 0; i < len(pds); i++ {
234-
if groupID != pds[i].Package.Name {
235-
data = append(data, createSearchResult(l, group))
236-
groupID = pds[i].Package.Name
237-
group = group[:0]
238-
}
239-
group = append(group, pds[i])
240-
}
232+
data := make([]*SearchResult, 0, len(pds))
233+
for _, group := range grouped {
241234
data = append(data, createSearchResult(l, group))
242235
}
243236

0 commit comments

Comments
 (0)