gitea源码

metadata_test.go 7.4KB

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