gitea源码

metadata_test.go 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package swift
  4. import (
  5. "archive/zip"
  6. "bytes"
  7. "strings"
  8. "testing"
  9. "github.com/hashicorp/go-version"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. const (
  13. packageName = "gitea"
  14. packageVersion = "1.0.1"
  15. packageDescription = "Package Description"
  16. packageRepositoryURL = "https://gitea.io/gitea/gitea"
  17. packageAuthor = "KN4CK3R"
  18. packageLicense = "MIT"
  19. )
  20. func TestParsePackage(t *testing.T) {
  21. createArchive := func(files map[string][]byte) *bytes.Reader {
  22. var buf bytes.Buffer
  23. zw := zip.NewWriter(&buf)
  24. for filename, content := range files {
  25. w, _ := zw.Create(filename)
  26. w.Write(content)
  27. }
  28. zw.Close()
  29. return bytes.NewReader(buf.Bytes())
  30. }
  31. t.Run("MissingManifestFile", func(t *testing.T) {
  32. data := createArchive(map[string][]byte{"dummy.txt": {}})
  33. p, err := ParsePackage(data, data.Size(), nil)
  34. assert.Nil(t, p)
  35. assert.ErrorIs(t, err, ErrMissingManifestFile)
  36. })
  37. t.Run("ManifestFileTooLarge", func(t *testing.T) {
  38. data := createArchive(map[string][]byte{
  39. "Package.swift": make([]byte, maxManifestFileSize+1),
  40. })
  41. p, err := ParsePackage(data, data.Size(), nil)
  42. assert.Nil(t, p)
  43. assert.ErrorIs(t, err, ErrManifestFileTooLarge)
  44. })
  45. t.Run("WithoutMetadata", func(t *testing.T) {
  46. content1 := "// swift-tools-version:5.7\n//\n// Package.swift"
  47. content2 := "// swift-tools-version:5.6\n//\n// Package@swift-5.6.swift"
  48. data := createArchive(map[string][]byte{
  49. "Package.swift": []byte(content1),
  50. "Package@swift-5.5.swift": []byte(content2),
  51. })
  52. p, err := ParsePackage(data, data.Size(), nil)
  53. assert.NotNil(t, p)
  54. assert.NoError(t, err)
  55. assert.NotNil(t, p.Metadata)
  56. assert.Empty(t, p.RepositoryURLs)
  57. assert.Len(t, p.Metadata.Manifests, 2)
  58. m := p.Metadata.Manifests[""]
  59. assert.Equal(t, "5.7", m.ToolsVersion)
  60. assert.Equal(t, content1, m.Content)
  61. m = p.Metadata.Manifests["5.5"]
  62. assert.Equal(t, "5.6", m.ToolsVersion)
  63. assert.Equal(t, content2, m.Content)
  64. })
  65. t.Run("WithMetadata", func(t *testing.T) {
  66. data := createArchive(map[string][]byte{
  67. "Package.swift": []byte("// swift-tools-version:5.7\n//\n// Package.swift"),
  68. })
  69. p, err := ParsePackage(
  70. data,
  71. data.Size(),
  72. strings.NewReader(`{"name":"`+packageName+`","version":"`+packageVersion+`","description":"`+packageDescription+`","keywords":["swift","package"],"license":"`+packageLicense+`","codeRepository":"`+packageRepositoryURL+`","author":{"givenName":"`+packageAuthor+`"},"repositoryURLs":["`+packageRepositoryURL+`"]}`),
  73. )
  74. assert.NotNil(t, p)
  75. assert.NoError(t, err)
  76. assert.NotNil(t, p.Metadata)
  77. assert.Len(t, p.Metadata.Manifests, 1)
  78. m := p.Metadata.Manifests[""]
  79. assert.Equal(t, "5.7", m.ToolsVersion)
  80. assert.Equal(t, packageDescription, p.Metadata.Description)
  81. assert.ElementsMatch(t, []string{"swift", "package"}, p.Metadata.Keywords)
  82. assert.Equal(t, packageLicense, p.Metadata.License)
  83. assert.Equal(t, packageAuthor, p.Metadata.Author.Name)
  84. assert.Equal(t, packageAuthor, p.Metadata.Author.GivenName)
  85. assert.Equal(t, packageRepositoryURL, p.Metadata.RepositoryURL)
  86. assert.ElementsMatch(t, []string{packageRepositoryURL}, p.RepositoryURLs)
  87. })
  88. t.Run("WithExplicitNameField", func(t *testing.T) {
  89. data := createArchive(map[string][]byte{
  90. "Package.swift": []byte("// swift-tools-version:5.7\n//\n// Package.swift"),
  91. })
  92. authorName := "John Doe"
  93. p, err := ParsePackage(
  94. data,
  95. data.Size(),
  96. strings.NewReader(`{"name":"`+packageName+`","version":"`+packageVersion+`","description":"`+packageDescription+`","author":{"name":"`+authorName+`","givenName":"John","familyName":"Doe"}}`),
  97. )
  98. assert.NotNil(t, p)
  99. assert.NoError(t, err)
  100. assert.Equal(t, authorName, p.Metadata.Author.Name)
  101. assert.Equal(t, "John", p.Metadata.Author.GivenName)
  102. assert.Equal(t, "Doe", p.Metadata.Author.FamilyName)
  103. })
  104. t.Run("NameFieldGeneration", func(t *testing.T) {
  105. data := createArchive(map[string][]byte{
  106. "Package.swift": []byte("// swift-tools-version:5.7\n//\n// Package.swift"),
  107. })
  108. // Test with only individual name components - Name should be auto-generated
  109. p, err := ParsePackage(
  110. data,
  111. data.Size(),
  112. strings.NewReader(`{"author":{"givenName":"John","middleName":"Q","familyName":"Doe"}}`),
  113. )
  114. assert.NotNil(t, p)
  115. assert.NoError(t, err)
  116. assert.Equal(t, "John Q Doe", p.Metadata.Author.Name)
  117. assert.Equal(t, "John", p.Metadata.Author.GivenName)
  118. assert.Equal(t, "Q", p.Metadata.Author.MiddleName)
  119. assert.Equal(t, "Doe", p.Metadata.Author.FamilyName)
  120. })
  121. }
  122. func TestTrimmedVersionString(t *testing.T) {
  123. cases := []struct {
  124. Version *version.Version
  125. Expected string
  126. }{
  127. {
  128. Version: version.Must(version.NewVersion("1")),
  129. Expected: "1.0",
  130. },
  131. {
  132. Version: version.Must(version.NewVersion("1.0")),
  133. Expected: "1.0",
  134. },
  135. {
  136. Version: version.Must(version.NewVersion("1.0.0")),
  137. Expected: "1.0",
  138. },
  139. {
  140. Version: version.Must(version.NewVersion("1.0.1")),
  141. Expected: "1.0.1",
  142. },
  143. {
  144. Version: version.Must(version.NewVersion("1.0+meta")),
  145. Expected: "1.0",
  146. },
  147. {
  148. Version: version.Must(version.NewVersion("1.0.0+meta")),
  149. Expected: "1.0",
  150. },
  151. {
  152. Version: version.Must(version.NewVersion("1.0.1+meta")),
  153. Expected: "1.0.1",
  154. },
  155. }
  156. for _, c := range cases {
  157. assert.Equal(t, c.Expected, TrimmedVersionString(c.Version))
  158. }
  159. }
  160. func TestPersonNameString(t *testing.T) {
  161. cases := []struct {
  162. Name string
  163. Person Person
  164. Expected string
  165. }{
  166. {
  167. Name: "GivenNameOnly",
  168. Person: Person{GivenName: "John"},
  169. Expected: "John",
  170. },
  171. {
  172. Name: "GivenAndFamily",
  173. Person: Person{GivenName: "John", FamilyName: "Doe"},
  174. Expected: "John Doe",
  175. },
  176. {
  177. Name: "FullName",
  178. Person: Person{GivenName: "John", MiddleName: "Q", FamilyName: "Doe"},
  179. Expected: "John Q Doe",
  180. },
  181. {
  182. Name: "MiddleAndFamily",
  183. Person: Person{MiddleName: "Q", FamilyName: "Doe"},
  184. Expected: "Q Doe",
  185. },
  186. {
  187. Name: "Empty",
  188. Person: Person{},
  189. Expected: "",
  190. },
  191. }
  192. for _, c := range cases {
  193. t.Run(c.Name, func(t *testing.T) {
  194. assert.Equal(t, c.Expected, c.Person.String())
  195. })
  196. }
  197. }