gitea源码

creator_test.go 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package npm
  4. import (
  5. "bytes"
  6. "encoding/base64"
  7. "fmt"
  8. "strings"
  9. "testing"
  10. "code.gitea.io/gitea/modules/json"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. func TestParsePackage(t *testing.T) {
  14. packageScope := "@scope"
  15. packageName := "test-package"
  16. packageFullName := packageScope + "/" + packageName
  17. packageVersion := "1.0.1-pre"
  18. packageTag := "latest"
  19. packageAuthor := "KN4CK3R"
  20. packageBin := "gitea"
  21. packageDescription := "Test Description"
  22. data := "H4sIAAAAAAAA/ytITM5OTE/VL4DQelnF+XkMVAYGBgZmJiYK2MRBwNDcSIHB2NTMwNDQzMwAqA7IMDUxA9LUdgg2UFpcklgEdAql5kD8ogCnhwio5lJQUMpLzE1VslJQcihOzi9I1S9JLS7RhSYIJR2QgrLUouLM/DyQGkM9Az1D3YIiqExKanFyUWZBCVQ2BKhVwQVJDKwosbQkI78IJO/tZ+LsbRykxFXLNdA+HwWjYBSMgpENACgAbtAACAAA"
  23. integrity := "sha512-yA4FJsVhetynGfOC1jFf79BuS+jrHbm0fhh+aHzCQkOaOBXKf9oBnC4a6DnLLnEsHQDRLYd00cwj8sCXpC+wIg=="
  24. repository := Repository{
  25. Type: "gitea",
  26. URL: "http://localhost:3000/gitea/test.git",
  27. }
  28. t.Run("InvalidUpload", func(t *testing.T) {
  29. p, err := ParsePackage(bytes.NewReader([]byte{0}))
  30. assert.Nil(t, p)
  31. assert.Error(t, err)
  32. })
  33. t.Run("InvalidUploadNoData", func(t *testing.T) {
  34. b, _ := json.Marshal(packageUpload{})
  35. p, err := ParsePackage(bytes.NewReader(b))
  36. assert.Nil(t, p)
  37. assert.ErrorIs(t, err, ErrInvalidPackage)
  38. })
  39. t.Run("InvalidPackageName", func(t *testing.T) {
  40. test := func(t *testing.T, name string) {
  41. b, _ := json.Marshal(packageUpload{
  42. PackageMetadata: PackageMetadata{
  43. ID: name,
  44. Name: name,
  45. Versions: map[string]*PackageMetadataVersion{
  46. packageVersion: {
  47. Name: name,
  48. },
  49. },
  50. },
  51. })
  52. p, err := ParsePackage(bytes.NewReader(b))
  53. assert.Nil(t, p)
  54. assert.ErrorIs(t, err, ErrInvalidPackageName)
  55. }
  56. test(t, " test ")
  57. test(t, " test")
  58. test(t, "test ")
  59. test(t, "te st")
  60. test(t, "Test")
  61. test(t, "_test")
  62. test(t, ".test")
  63. test(t, "^test")
  64. test(t, "te^st")
  65. test(t, "te|st")
  66. test(t, "te)(st")
  67. test(t, "te'st")
  68. test(t, "te!st")
  69. test(t, "te*st")
  70. test(t, "te~st")
  71. test(t, "invalid/scope")
  72. test(t, "@invalid/_name")
  73. test(t, "@invalid/.name")
  74. })
  75. t.Run("ValidPackageName", func(t *testing.T) {
  76. test := func(t *testing.T, name string) {
  77. b, _ := json.Marshal(packageUpload{
  78. PackageMetadata: PackageMetadata{
  79. ID: name,
  80. Name: name,
  81. Versions: map[string]*PackageMetadataVersion{
  82. packageVersion: {
  83. Name: name,
  84. },
  85. },
  86. },
  87. })
  88. p, err := ParsePackage(bytes.NewReader(b))
  89. assert.Nil(t, p)
  90. assert.ErrorIs(t, err, ErrInvalidPackageVersion)
  91. }
  92. test(t, "test")
  93. test(t, "@scope/name")
  94. test(t, "@scope/q")
  95. test(t, "q")
  96. test(t, "@scope/package-name")
  97. test(t, "@scope/package.name")
  98. test(t, "@scope/package_name")
  99. test(t, "123name")
  100. test(t, "----")
  101. test(t, packageFullName)
  102. })
  103. t.Run("InvalidPackageVersion", func(t *testing.T) {
  104. version := "first-version"
  105. b, _ := json.Marshal(packageUpload{
  106. PackageMetadata: PackageMetadata{
  107. ID: packageFullName,
  108. Name: packageFullName,
  109. Versions: map[string]*PackageMetadataVersion{
  110. version: {
  111. Name: packageFullName,
  112. Version: version,
  113. },
  114. },
  115. },
  116. })
  117. p, err := ParsePackage(bytes.NewReader(b))
  118. assert.Nil(t, p)
  119. assert.ErrorIs(t, err, ErrInvalidPackageVersion)
  120. })
  121. t.Run("InvalidAttachment", func(t *testing.T) {
  122. b, _ := json.Marshal(packageUpload{
  123. PackageMetadata: PackageMetadata{
  124. ID: packageFullName,
  125. Name: packageFullName,
  126. Versions: map[string]*PackageMetadataVersion{
  127. packageVersion: {
  128. Name: packageFullName,
  129. Version: packageVersion,
  130. },
  131. },
  132. },
  133. Attachments: map[string]*PackageAttachment{
  134. "dummy.tgz": {},
  135. },
  136. })
  137. p, err := ParsePackage(bytes.NewReader(b))
  138. assert.Nil(t, p)
  139. assert.ErrorIs(t, err, ErrInvalidAttachment)
  140. })
  141. t.Run("InvalidData", func(t *testing.T) {
  142. filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
  143. b, _ := json.Marshal(packageUpload{
  144. PackageMetadata: PackageMetadata{
  145. ID: packageFullName,
  146. Name: packageFullName,
  147. Versions: map[string]*PackageMetadataVersion{
  148. packageVersion: {
  149. Name: packageFullName,
  150. Version: packageVersion,
  151. },
  152. },
  153. },
  154. Attachments: map[string]*PackageAttachment{
  155. filename: {
  156. Data: "/",
  157. },
  158. },
  159. })
  160. p, err := ParsePackage(bytes.NewReader(b))
  161. assert.Nil(t, p)
  162. assert.ErrorIs(t, err, ErrInvalidAttachment)
  163. })
  164. t.Run("InvalidIntegrity", func(t *testing.T) {
  165. filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
  166. b, _ := json.Marshal(packageUpload{
  167. PackageMetadata: PackageMetadata{
  168. ID: packageFullName,
  169. Name: packageFullName,
  170. Versions: map[string]*PackageMetadataVersion{
  171. packageVersion: {
  172. Name: packageFullName,
  173. Version: packageVersion,
  174. Dist: PackageDistribution{
  175. Integrity: "sha512-test==",
  176. },
  177. },
  178. },
  179. },
  180. Attachments: map[string]*PackageAttachment{
  181. filename: {
  182. Data: data,
  183. },
  184. },
  185. })
  186. p, err := ParsePackage(bytes.NewReader(b))
  187. assert.Nil(t, p)
  188. assert.ErrorIs(t, err, ErrInvalidIntegrity)
  189. })
  190. t.Run("InvalidIntegrity2", func(t *testing.T) {
  191. filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
  192. b, _ := json.Marshal(packageUpload{
  193. PackageMetadata: PackageMetadata{
  194. ID: packageFullName,
  195. Name: packageFullName,
  196. Versions: map[string]*PackageMetadataVersion{
  197. packageVersion: {
  198. Name: packageFullName,
  199. Version: packageVersion,
  200. Dist: PackageDistribution{
  201. Integrity: integrity,
  202. },
  203. },
  204. },
  205. },
  206. Attachments: map[string]*PackageAttachment{
  207. filename: {
  208. Data: base64.StdEncoding.EncodeToString([]byte("data")),
  209. },
  210. },
  211. })
  212. p, err := ParsePackage(bytes.NewReader(b))
  213. assert.Nil(t, p)
  214. assert.ErrorIs(t, err, ErrInvalidIntegrity)
  215. })
  216. t.Run("Valid", func(t *testing.T) {
  217. filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
  218. b, _ := json.Marshal(packageUpload{
  219. PackageMetadata: PackageMetadata{
  220. ID: packageFullName,
  221. Name: packageFullName,
  222. DistTags: map[string]string{
  223. packageTag: packageVersion,
  224. },
  225. Versions: map[string]*PackageMetadataVersion{
  226. packageVersion: {
  227. Name: packageFullName,
  228. Version: packageVersion,
  229. Description: packageDescription,
  230. Author: User{Name: packageAuthor},
  231. License: "MIT",
  232. Homepage: "https://gitea.io/",
  233. Readme: packageDescription,
  234. Dependencies: map[string]string{
  235. "package": "1.2.0",
  236. },
  237. Bin: map[string]string{
  238. "bin": packageBin,
  239. },
  240. Dist: PackageDistribution{
  241. Integrity: integrity,
  242. },
  243. Repository: repository,
  244. },
  245. },
  246. },
  247. Attachments: map[string]*PackageAttachment{
  248. filename: {
  249. Data: data,
  250. },
  251. },
  252. })
  253. p, err := ParsePackage(bytes.NewReader(b))
  254. assert.NotNil(t, p)
  255. assert.NoError(t, err)
  256. assert.Equal(t, packageFullName, p.Name)
  257. assert.Equal(t, packageVersion, p.Version)
  258. assert.Equal(t, []string{packageTag}, p.DistTags)
  259. assert.Equal(t, fmt.Sprintf("%s-%s.tgz", strings.Split(packageFullName, "/")[1], packageVersion), p.Filename)
  260. b, _ = base64.StdEncoding.DecodeString(data)
  261. assert.Equal(t, b, p.Data)
  262. assert.Equal(t, packageName, p.Metadata.Name)
  263. assert.Equal(t, packageScope, p.Metadata.Scope)
  264. assert.Equal(t, packageDescription, p.Metadata.Description)
  265. assert.Equal(t, packageDescription, p.Metadata.Readme)
  266. assert.Equal(t, packageAuthor, p.Metadata.Author)
  267. assert.Equal(t, packageBin, p.Metadata.Bin["bin"])
  268. assert.Equal(t, "MIT", p.Metadata.License)
  269. assert.Equal(t, "https://gitea.io/", p.Metadata.ProjectURL)
  270. assert.Contains(t, p.Metadata.Dependencies, "package")
  271. assert.Equal(t, "1.2.0", p.Metadata.Dependencies["package"])
  272. assert.Equal(t, repository.Type, p.Metadata.Repository.Type)
  273. assert.Equal(t, repository.URL, p.Metadata.Repository.URL)
  274. })
  275. }