code.gitea.io/gitea@v1.22.3/modules/packages/nuget/metadata_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package nuget 5 6 import ( 7 "archive/zip" 8 "bytes" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 ) 13 14 const ( 15 id = "System.Gitea" 16 semver = "1.0.1" 17 authors = "Gitea Authors" 18 projectURL = "https://gitea.io" 19 description = "Package Description" 20 releaseNotes = "Package Release Notes" 21 readme = "Readme" 22 repositoryURL = "https://gitea.io/gitea/gitea" 23 targetFramework = ".NETStandard2.1" 24 dependencyID = "System.Text.Json" 25 dependencyVersion = "5.0.0" 26 ) 27 28 const nuspecContent = `<?xml version="1.0" encoding="utf-8"?> 29 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 30 <metadata> 31 <id>` + id + `</id> 32 <version>` + semver + `</version> 33 <authors>` + authors + `</authors> 34 <requireLicenseAcceptance>true</requireLicenseAcceptance> 35 <projectUrl>` + projectURL + `</projectUrl> 36 <description>` + description + `</description> 37 <releaseNotes>` + releaseNotes + `</releaseNotes> 38 <repository url="` + repositoryURL + `" /> 39 <readme>README.md</readme> 40 <dependencies> 41 <group targetFramework="` + targetFramework + `"> 42 <dependency id="` + dependencyID + `" version="` + dependencyVersion + `" exclude="Build,Analyzers" /> 43 </group> 44 </dependencies> 45 </metadata> 46 </package>` 47 48 const symbolsNuspecContent = `<?xml version="1.0" encoding="utf-8"?> 49 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 50 <metadata> 51 <id>` + id + `</id> 52 <version>` + semver + `</version> 53 <description>` + description + `</description> 54 <packageTypes> 55 <packageType name="SymbolsPackage" /> 56 </packageTypes> 57 <dependencies> 58 <group targetFramework="` + targetFramework + `" /> 59 </dependencies> 60 </metadata> 61 </package>` 62 63 func TestParsePackageMetaData(t *testing.T) { 64 createArchive := func(files map[string]string) []byte { 65 var buf bytes.Buffer 66 archive := zip.NewWriter(&buf) 67 for name, content := range files { 68 w, _ := archive.Create(name) 69 w.Write([]byte(content)) 70 } 71 archive.Close() 72 return buf.Bytes() 73 } 74 75 t.Run("MissingNuspecFile", func(t *testing.T) { 76 data := createArchive(map[string]string{"dummy.txt": ""}) 77 78 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 79 assert.Nil(t, np) 80 assert.ErrorIs(t, err, ErrMissingNuspecFile) 81 }) 82 83 t.Run("MissingNuspecFileInRoot", func(t *testing.T) { 84 data := createArchive(map[string]string{"sub/package.nuspec": ""}) 85 86 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 87 assert.Nil(t, np) 88 assert.ErrorIs(t, err, ErrMissingNuspecFile) 89 }) 90 91 t.Run("InvalidNuspecFile", func(t *testing.T) { 92 data := createArchive(map[string]string{"package.nuspec": ""}) 93 94 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 95 assert.Nil(t, np) 96 assert.Error(t, err) 97 }) 98 99 t.Run("InvalidPackageId", func(t *testing.T) { 100 data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?> 101 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 102 <metadata></metadata> 103 </package>`}) 104 105 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 106 assert.Nil(t, np) 107 assert.ErrorIs(t, err, ErrNuspecInvalidID) 108 }) 109 110 t.Run("InvalidPackageVersion", func(t *testing.T) { 111 data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?> 112 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 113 <metadata> 114 <id>` + id + `</id> 115 </metadata> 116 </package>`}) 117 118 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 119 assert.Nil(t, np) 120 assert.ErrorIs(t, err, ErrNuspecInvalidVersion) 121 }) 122 123 t.Run("MissingReadme", func(t *testing.T) { 124 data := createArchive(map[string]string{"package.nuspec": nuspecContent}) 125 126 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 127 assert.NoError(t, err) 128 assert.NotNil(t, np) 129 assert.Empty(t, np.Metadata.Readme) 130 }) 131 132 t.Run("Dependency Package", func(t *testing.T) { 133 data := createArchive(map[string]string{ 134 "package.nuspec": nuspecContent, 135 "README.md": readme, 136 }) 137 138 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 139 assert.NoError(t, err) 140 assert.NotNil(t, np) 141 assert.Equal(t, DependencyPackage, np.PackageType) 142 143 assert.Equal(t, id, np.ID) 144 assert.Equal(t, semver, np.Version) 145 assert.Equal(t, authors, np.Metadata.Authors) 146 assert.Equal(t, projectURL, np.Metadata.ProjectURL) 147 assert.Equal(t, description, np.Metadata.Description) 148 assert.Equal(t, releaseNotes, np.Metadata.ReleaseNotes) 149 assert.Equal(t, readme, np.Metadata.Readme) 150 assert.Equal(t, repositoryURL, np.Metadata.RepositoryURL) 151 assert.Len(t, np.Metadata.Dependencies, 1) 152 assert.Contains(t, np.Metadata.Dependencies, targetFramework) 153 deps := np.Metadata.Dependencies[targetFramework] 154 assert.Len(t, deps, 1) 155 assert.Equal(t, dependencyID, deps[0].ID) 156 assert.Equal(t, dependencyVersion, deps[0].Version) 157 158 t.Run("NormalizedVersion", func(t *testing.T) { 159 data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?> 160 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 161 <metadata> 162 <id>test</id> 163 <version>1.04.5.2.5-rc.1+metadata</version> 164 </metadata> 165 </package>`}) 166 167 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 168 assert.NoError(t, err) 169 assert.NotNil(t, np) 170 assert.Equal(t, "1.4.5.2-rc.1", np.Version) 171 }) 172 }) 173 174 t.Run("Symbols Package", func(t *testing.T) { 175 data := createArchive(map[string]string{"package.nuspec": symbolsNuspecContent}) 176 177 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 178 assert.NoError(t, err) 179 assert.NotNil(t, np) 180 assert.Equal(t, SymbolsPackage, np.PackageType) 181 182 assert.Equal(t, id, np.ID) 183 assert.Equal(t, semver, np.Version) 184 assert.Equal(t, description, np.Metadata.Description) 185 assert.Empty(t, np.Metadata.Dependencies) 186 }) 187 }