code.gitea.io/gitea@v1.19.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 "strings" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 ) 14 15 const ( 16 id = "System.Gitea" 17 semver = "1.0.1" 18 authors = "Gitea Authors" 19 projectURL = "https://gitea.io" 20 description = "Package Description" 21 releaseNotes = "Package Release Notes" 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 <dependencies> 40 <group targetFramework="` + targetFramework + `"> 41 <dependency id="` + dependencyID + `" version="` + dependencyVersion + `" exclude="Build,Analyzers" /> 42 </group> 43 </dependencies> 44 </metadata> 45 </package>` 46 47 const symbolsNuspecContent = `<?xml version="1.0" encoding="utf-8"?> 48 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 49 <metadata> 50 <id>` + id + `</id> 51 <version>` + semver + `</version> 52 <description>` + description + `</description> 53 <packageTypes> 54 <packageType name="SymbolsPackage" /> 55 </packageTypes> 56 <dependencies> 57 <group targetFramework="` + targetFramework + `" /> 58 </dependencies> 59 </metadata> 60 </package>` 61 62 func TestParsePackageMetaData(t *testing.T) { 63 createArchive := func(name, content string) []byte { 64 var buf bytes.Buffer 65 archive := zip.NewWriter(&buf) 66 w, _ := archive.Create(name) 67 w.Write([]byte(content)) 68 archive.Close() 69 return buf.Bytes() 70 } 71 72 t.Run("MissingNuspecFile", func(t *testing.T) { 73 data := createArchive("dummy.txt", "") 74 75 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 76 assert.Nil(t, np) 77 assert.ErrorIs(t, err, ErrMissingNuspecFile) 78 }) 79 80 t.Run("MissingNuspecFileInRoot", func(t *testing.T) { 81 data := createArchive("sub/package.nuspec", "") 82 83 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 84 assert.Nil(t, np) 85 assert.ErrorIs(t, err, ErrMissingNuspecFile) 86 }) 87 88 t.Run("InvalidNuspecFile", func(t *testing.T) { 89 data := createArchive("package.nuspec", "") 90 91 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 92 assert.Nil(t, np) 93 assert.Error(t, err) 94 }) 95 96 t.Run("InvalidPackageId", func(t *testing.T) { 97 data := createArchive("package.nuspec", `<?xml version="1.0" encoding="utf-8"?> 98 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 99 <metadata></metadata> 100 </package>`) 101 102 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 103 assert.Nil(t, np) 104 assert.ErrorIs(t, err, ErrNuspecInvalidID) 105 }) 106 107 t.Run("InvalidPackageVersion", func(t *testing.T) { 108 data := createArchive("package.nuspec", `<?xml version="1.0" encoding="utf-8"?> 109 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 110 <metadata> 111 <id>`+id+`</id> 112 </metadata> 113 </package>`) 114 115 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 116 assert.Nil(t, np) 117 assert.ErrorIs(t, err, ErrNuspecInvalidVersion) 118 }) 119 120 t.Run("Valid", func(t *testing.T) { 121 data := createArchive("package.nuspec", nuspecContent) 122 123 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 124 assert.NoError(t, err) 125 assert.NotNil(t, np) 126 }) 127 } 128 129 func TestParseNuspecMetaData(t *testing.T) { 130 t.Run("Dependency Package", func(t *testing.T) { 131 np, err := ParseNuspecMetaData(strings.NewReader(nuspecContent)) 132 assert.NoError(t, err) 133 assert.NotNil(t, np) 134 assert.Equal(t, DependencyPackage, np.PackageType) 135 136 assert.Equal(t, id, np.ID) 137 assert.Equal(t, semver, np.Version) 138 assert.Equal(t, authors, np.Metadata.Authors) 139 assert.Equal(t, projectURL, np.Metadata.ProjectURL) 140 assert.Equal(t, description, np.Metadata.Description) 141 assert.Equal(t, releaseNotes, np.Metadata.ReleaseNotes) 142 assert.Equal(t, repositoryURL, np.Metadata.RepositoryURL) 143 assert.Len(t, np.Metadata.Dependencies, 1) 144 assert.Contains(t, np.Metadata.Dependencies, targetFramework) 145 deps := np.Metadata.Dependencies[targetFramework] 146 assert.Len(t, deps, 1) 147 assert.Equal(t, dependencyID, deps[0].ID) 148 assert.Equal(t, dependencyVersion, deps[0].Version) 149 150 t.Run("NormalizedVersion", func(t *testing.T) { 151 np, err := ParseNuspecMetaData(strings.NewReader(`<?xml version="1.0" encoding="utf-8"?> 152 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 153 <metadata> 154 <id>test</id> 155 <version>1.04.5.2.5-rc.1+metadata</version> 156 </metadata> 157 </package>`)) 158 assert.NoError(t, err) 159 assert.NotNil(t, np) 160 assert.Equal(t, "1.4.5.2-rc.1", np.Version) 161 }) 162 }) 163 164 t.Run("Symbols Package", func(t *testing.T) { 165 np, err := ParseNuspecMetaData(strings.NewReader(symbolsNuspecContent)) 166 assert.NoError(t, err) 167 assert.NotNil(t, np) 168 assert.Equal(t, SymbolsPackage, np.PackageType) 169 170 assert.Equal(t, id, np.ID) 171 assert.Equal(t, semver, np.Version) 172 assert.Equal(t, description, np.Metadata.Description) 173 assert.Empty(t, np.Metadata.Dependencies) 174 }) 175 }