You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

metadata_test.go 5.4KB

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