@@ -34,6 +34,7 @@ func TestPackageSwift(t *testing.T) {
3434 packageName := "test_package"
3535 packageID := packageScope + "." + packageName
3636 packageVersion := "1.0.3"
37+ packageVersion2 := "1.0.4"
3738 packageAuthor := "KN4CK3R"
3839 packageDescription := "Gitea Test Package"
3940 packageRepositoryURL := "https://gitea.io/gitea/gitea"
@@ -183,6 +184,94 @@ func TestPackageSwift(t *testing.T) {
183184 )
184185 })
185186
187+ t .Run ("UploadMultipart" , func (t * testing.T ) {
188+ defer tests .PrintCurrentTest (t )()
189+
190+ uploadPackage := func (t * testing.T , url string , expectedStatus int , sr io.Reader , metadata string ) {
191+ var body bytes.Buffer
192+ mpw := multipart .NewWriter (& body )
193+
194+ // Read the source archive content
195+ sourceContent , err := io .ReadAll (sr )
196+ assert .NoError (t , err )
197+ mpw .WriteField ("source-archive" , string (sourceContent ))
198+
199+ if metadata != "" {
200+ mpw .WriteField ("metadata" , metadata )
201+ }
202+
203+ mpw .Close ()
204+
205+ req := NewRequestWithBody (t , "PUT" , url , & body ).
206+ SetHeader ("Content-Type" , mpw .FormDataContentType ()).
207+ SetHeader ("Accept" , swift_router .AcceptJSON ).
208+ AddBasicAuth (user .Name )
209+ MakeRequest (t , req , expectedStatus )
210+ }
211+
212+ createArchive := func (files map [string ]string ) * bytes.Buffer {
213+ var buf bytes.Buffer
214+ zw := zip .NewWriter (& buf )
215+ for filename , content := range files {
216+ w , _ := zw .Create (filename )
217+ w .Write ([]byte (content ))
218+ }
219+ zw .Close ()
220+ return & buf
221+ }
222+
223+ uploadURL := fmt .Sprintf ("%s/%s/%s/%s" , url , packageScope , packageName , packageVersion2 )
224+
225+ req := NewRequestWithBody (t , "PUT" , uploadURL , bytes .NewReader ([]byte {}))
226+ MakeRequest (t , req , http .StatusUnauthorized )
227+
228+ // Test with metadata as form field
229+ uploadPackage (
230+ t ,
231+ uploadURL ,
232+ http .StatusCreated ,
233+ createArchive (map [string ]string {
234+ "Package.swift" : contentManifest1 ,
235+ "[email protected] " :
contentManifest2 ,
236+ }),
237+ `{"name":"` + packageName + `","version":"` + packageVersion2 + `","description":"` + packageDescription + `","codeRepository":"` + packageRepositoryURL + `","author":{"givenName":"` + packageAuthor + `"},"repositoryURLs":["` + packageRepositoryURL + `"]}` ,
238+ )
239+
240+ pvs , err := packages .GetVersionsByPackageType (db .DefaultContext , user .ID , packages .TypeSwift )
241+ assert .NoError (t , err )
242+ assert .Len (t , pvs , 2 )
243+
244+ pd , err := packages .GetPackageDescriptor (db .DefaultContext , pvs [1 ])
245+ assert .NoError (t , err )
246+ assert .NotNil (t , pd .SemVer )
247+ assert .Equal (t , packageID , pd .Package .Name )
248+ assert .Equal (t , packageVersion2 , pd .Version .Version )
249+ assert .IsType (t , & swift_module.Metadata {}, pd .Metadata )
250+ metadata := pd .Metadata .(* swift_module.Metadata )
251+ assert .Equal (t , packageDescription , metadata .Description )
252+ assert .Len (t , metadata .Manifests , 2 )
253+ assert .Equal (t , contentManifest1 , metadata .Manifests ["" ].Content )
254+ assert .Equal (t , contentManifest2 , metadata .Manifests ["5.6" ].Content )
255+ assert .Len (t , pd .VersionProperties , 1 )
256+ assert .Equal (t , packageRepositoryURL , pd .VersionProperties .GetByName (swift_module .PropertyRepositoryURL ))
257+
258+ pfs , err := packages .GetFilesByVersionID (db .DefaultContext , pvs [1 ].ID )
259+ assert .NoError (t , err )
260+ assert .Len (t , pfs , 1 )
261+ assert .Equal (t , fmt .Sprintf ("%s-%s.zip" , packageName , packageVersion2 ), pfs [0 ].Name )
262+ assert .True (t , pfs [0 ].IsLead )
263+
264+ uploadPackage (
265+ t ,
266+ uploadURL ,
267+ http .StatusConflict ,
268+ createArchive (map [string ]string {
269+ "Package.swift" : contentManifest1 ,
270+ }),
271+ "" ,
272+ )
273+ })
274+
186275 t .Run ("Download" , func (t * testing.T ) {
187276 defer tests .PrintCurrentTest (t )()
188277
@@ -211,7 +300,7 @@ func TestPackageSwift(t *testing.T) {
211300 SetHeader ("Accept" , swift_router .AcceptJSON )
212301 resp := MakeRequest (t , req , http .StatusOK )
213302
214- versionURL := setting .AppURL + url [1 :] + fmt .Sprintf ("/%s/%s/%s" , packageScope , packageName , packageVersion )
303+ versionURL := setting .AppURL + url [1 :] + fmt .Sprintf ("/%s/%s/%s" , packageScope , packageName , packageVersion2 )
215304
216305 assert .Equal (t , "1" , resp .Header ().Get ("Content-Version" ))
217306 assert .Equal (t , fmt .Sprintf (`<%s>; rel="latest-version"` , versionURL ), resp .Header ().Get ("Link" ))
@@ -221,9 +310,9 @@ func TestPackageSwift(t *testing.T) {
221310 var result * swift_router.EnumeratePackageVersionsResponse
222311 DecodeJSON (t , resp , & result )
223312
224- assert .Len (t , result .Releases , 1 )
225- assert .Contains (t , result .Releases , packageVersion )
226- assert .Equal (t , versionURL , result .Releases [packageVersion ].URL )
313+ assert .Len (t , result .Releases , 2 )
314+ assert .Contains (t , result .Releases , packageVersion2 )
315+ assert .Equal (t , versionURL , result .Releases [packageVersion2 ].URL )
227316
228317 req = NewRequest (t , "GET" , fmt .Sprintf ("%s/%s/%s.json" , url , packageScope , packageName )).
229318 AddBasicAuth (user .Name )
0 commit comments