1
1
mirror of https://github.com/go-gitea/gitea synced 2025-07-22 10:18:38 +00:00

Improve NuGet API Parity (#21291) (#34940)

Fixes #21291, allowing icons and other missing attributes to appear for
NuGet packages from inside Visual Studio like they do with GitHub Nuget
packages.

Adds additional NuGet package information, particularly `IconURL`, to
bring the Gitea NuGet API more in-line with GitHub's NuGet API.

ref: https://learn.microsoft.com/en-us/nuget/api/search-query-service-resource
This commit is contained in:
Scion
2025-07-07 03:43:58 -07:00
committed by GitHub
parent ddfa2e4a3e
commit f88800d545
4 changed files with 184 additions and 59 deletions

View File

@@ -14,6 +14,7 @@ import (
"net/http/httptest"
neturl "net/url"
"strconv"
"strings"
"testing"
"time"
@@ -100,6 +101,7 @@ func TestPackageNuGet(t *testing.T) {
packageVersion := "1.0.3"
packageAuthors := "KN4CK3R"
packageDescription := "Gitea Test Package"
isPrerelease := strings.Contains(packageVersion, "-")
symbolFilename := "test.pdb"
symbolID := "d910bb6948bd4c6cb40155bcf52c3c94"
@@ -112,11 +114,17 @@ func TestPackageNuGet(t *testing.T) {
packageOwners := "Package Owners"
packageProjectURL := "https://gitea.io"
packageReleaseNotes := "Package Release Notes"
summary := "This is a test package."
packageTags := "tag_1 tag_2 tag_3"
packageTitle := "Package Title"
packageDevelopmentDependency := true
packageRequireLicenseAcceptance := true
dependencyCount := 1
dependencyTargetFramework := ".NETStandard2.0"
dependencyID := "Microsoft.CSharp"
dependencyVersion := "4.5.0"
createNuspec := func(id, version string) string {
return `<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
@@ -133,12 +141,13 @@ func TestPackageNuGet(t *testing.T) {
<projectUrl>` + packageProjectURL + `</projectUrl>
<releaseNotes>` + packageReleaseNotes + `</releaseNotes>
<requireLicenseAcceptance>true</requireLicenseAcceptance>
<summary>` + summary + `</summary>
<tags>` + packageTags + `</tags>
<title>` + packageTitle + `</title>
<version>` + version + `</version>
<dependencies>
<group targetFramework=".NETStandard2.0">
<dependency id="Microsoft.CSharp" version="4.5.0" />
<group targetFramework="` + dependencyTargetFramework + `">
<dependency id="` + dependencyID + `" version="` + dependencyVersion + `" />
</group>
</dependencies>
</metadata>
@@ -428,7 +437,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID)
assert.NoError(t, err)
assert.Equal(t, int64(610), pb.Size)
assert.Equal(t, int64(633), pb.Size)
case fmt.Sprintf("%s.%s.snupkg", packageName, packageVersion):
assert.False(t, pf.IsLead)
@@ -440,7 +449,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID)
assert.NoError(t, err)
assert.Equal(t, int64(996), pb.Size)
assert.Equal(t, int64(1043), pb.Size)
case symbolFilename:
assert.False(t, pf.IsLead)
@@ -747,17 +756,39 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
assert.Equal(t, indexURL, result.RegistrationIndexURL)
assert.Equal(t, 1, result.Count)
assert.Len(t, result.Pages, 1)
assert.Equal(t, indexURL, result.Pages[0].RegistrationPageURL)
assert.Equal(t, packageVersion, result.Pages[0].Lower)
assert.Equal(t, packageVersion, result.Pages[0].Upper)
assert.Equal(t, 1, result.Pages[0].Count)
assert.Len(t, result.Pages[0].Items, 1)
assert.Equal(t, packageName, result.Pages[0].Items[0].CatalogEntry.ID)
assert.Equal(t, packageVersion, result.Pages[0].Items[0].CatalogEntry.Version)
assert.Equal(t, packageAuthors, result.Pages[0].Items[0].CatalogEntry.Authors)
assert.Equal(t, packageDescription, result.Pages[0].Items[0].CatalogEntry.Description)
assert.Equal(t, leafURL, result.Pages[0].Items[0].CatalogEntry.CatalogLeafURL)
assert.Equal(t, contentURL, result.Pages[0].Items[0].CatalogEntry.PackageContentURL)
page := result.Pages[0]
assert.Equal(t, indexURL, page.RegistrationPageURL)
assert.Equal(t, packageVersion, page.Lower)
assert.Equal(t, packageVersion, page.Upper)
assert.Equal(t, 1, page.Count)
assert.Len(t, page.Items, 1)
item := page.Items[0]
assert.Equal(t, packageName, item.CatalogEntry.ID)
assert.Equal(t, packageVersion, item.CatalogEntry.Version)
assert.Equal(t, packageAuthors, item.CatalogEntry.Authors)
assert.Equal(t, packageDescription, item.CatalogEntry.Description)
assert.Equal(t, leafURL, item.CatalogEntry.CatalogLeafURL)
assert.Equal(t, contentURL, item.CatalogEntry.PackageContentURL)
assert.Equal(t, packageIconURL, item.CatalogEntry.IconURL)
assert.Equal(t, packageLanguage, item.CatalogEntry.Language)
assert.Equal(t, packageLicenseURL, item.CatalogEntry.LicenseURL)
assert.Equal(t, packageProjectURL, item.CatalogEntry.ProjectURL)
assert.Equal(t, packageReleaseNotes, item.CatalogEntry.ReleaseNotes)
assert.Equal(t, packageRequireLicenseAcceptance, item.CatalogEntry.RequireLicenseAcceptance)
assert.Equal(t, packageTags, item.CatalogEntry.Tags)
assert.Equal(t, summary, item.CatalogEntry.Summary)
assert.Equal(t, isPrerelease, item.CatalogEntry.IsPrerelease)
assert.Len(t, item.CatalogEntry.DependencyGroups, dependencyCount)
dependencyGroup := item.CatalogEntry.DependencyGroups[0]
assert.Equal(t, dependencyTargetFramework, dependencyGroup.TargetFramework)
assert.Len(t, dependencyGroup.Dependencies, dependencyCount)
dependency := dependencyGroup.Dependencies[0]
assert.Equal(t, dependencyID, dependency.ID)
assert.Equal(t, dependencyVersion, dependency.Range)
})
t.Run("RegistrationLeaf", func(t *testing.T) {
@@ -789,7 +820,8 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
assert.Equal(t, packageTags, result.Properties.Tags)
assert.Equal(t, packageTitle, result.Properties.Title)
assert.Equal(t, "Microsoft.CSharp:4.5.0:.NETStandard2.0", result.Properties.Dependencies)
packageVersion := strings.Join([]string{dependencyID, dependencyVersion, dependencyTargetFramework}, ":")
assert.Equal(t, packageVersion, result.Properties.Dependencies)
})
t.Run("v3", func(t *testing.T) {
@@ -803,8 +835,30 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
DecodeJSON(t, resp, &result)
assert.Equal(t, leafURL, result.RegistrationLeafURL)
assert.Equal(t, contentURL, result.PackageContentURL)
assert.Equal(t, indexURL, result.RegistrationIndexURL)
assert.Equal(t, packageAuthors, result.CatalogEntry.Authors)
assert.Equal(t, packageCopyright, result.CatalogEntry.Copyright)
dependencyGroup := result.CatalogEntry.DependencyGroups[0]
assert.Equal(t, dependencyTargetFramework, dependencyGroup.TargetFramework)
assert.Len(t, dependencyGroup.Dependencies, dependencyCount)
dependency := dependencyGroup.Dependencies[0]
assert.Equal(t, dependencyID, dependency.ID)
assert.Equal(t, dependencyVersion, dependency.Range)
assert.Equal(t, packageDescription, result.CatalogEntry.Description)
assert.Equal(t, packageID, result.CatalogEntry.ID)
assert.Equal(t, packageIconURL, result.CatalogEntry.IconURL)
assert.Equal(t, isPrerelease, result.CatalogEntry.IsPrerelease)
assert.Equal(t, packageLanguage, result.CatalogEntry.Language)
assert.Equal(t, packageLicenseURL, result.CatalogEntry.LicenseURL)
assert.Equal(t, contentURL, result.PackageContentURL)
assert.Equal(t, packageProjectURL, result.CatalogEntry.ProjectURL)
assert.Equal(t, packageRequireLicenseAcceptance, result.CatalogEntry.RequireLicenseAcceptance)
assert.Equal(t, summary, result.CatalogEntry.Summary)
assert.Equal(t, packageTags, result.CatalogEntry.Tags)
assert.Equal(t, packageVersion, result.CatalogEntry.Version)
})
})
})