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