mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 21:16:26 +01:00 
			
		
		
		
	This PR adds a [Swift](https://www.swift.org/) package registry. 
		
			
				
	
	
		
			145 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
						|
// SPDX-License-Identifier: MIT
 | 
						|
 | 
						|
package swift
 | 
						|
 | 
						|
import (
 | 
						|
	"archive/zip"
 | 
						|
	"bytes"
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/hashicorp/go-version"
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	packageName          = "gitea"
 | 
						|
	packageVersion       = "1.0.1"
 | 
						|
	packageDescription   = "Package Description"
 | 
						|
	packageRepositoryURL = "https://gitea.io/gitea/gitea"
 | 
						|
	packageAuthor        = "KN4CK3R"
 | 
						|
	packageLicense       = "MIT"
 | 
						|
)
 | 
						|
 | 
						|
func TestParsePackage(t *testing.T) {
 | 
						|
	createArchive := func(files map[string][]byte) *bytes.Reader {
 | 
						|
		var buf bytes.Buffer
 | 
						|
		zw := zip.NewWriter(&buf)
 | 
						|
		for filename, content := range files {
 | 
						|
			w, _ := zw.Create(filename)
 | 
						|
			w.Write(content)
 | 
						|
		}
 | 
						|
		zw.Close()
 | 
						|
		return bytes.NewReader(buf.Bytes())
 | 
						|
	}
 | 
						|
 | 
						|
	t.Run("MissingManifestFile", func(t *testing.T) {
 | 
						|
		data := createArchive(map[string][]byte{"dummy.txt": {}})
 | 
						|
 | 
						|
		p, err := ParsePackage(data, data.Size(), nil)
 | 
						|
		assert.Nil(t, p)
 | 
						|
		assert.ErrorIs(t, err, ErrMissingManifestFile)
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("ManifestFileTooLarge", func(t *testing.T) {
 | 
						|
		data := createArchive(map[string][]byte{
 | 
						|
			"Package.swift": make([]byte, maxManifestFileSize+1),
 | 
						|
		})
 | 
						|
 | 
						|
		p, err := ParsePackage(data, data.Size(), nil)
 | 
						|
		assert.Nil(t, p)
 | 
						|
		assert.ErrorIs(t, err, ErrManifestFileTooLarge)
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("WithoutMetadata", func(t *testing.T) {
 | 
						|
		content1 := "// swift-tools-version:5.7\n//\n//  Package.swift"
 | 
						|
		content2 := "// swift-tools-version:5.6\n//\n//  Package@swift-5.6.swift"
 | 
						|
 | 
						|
		data := createArchive(map[string][]byte{
 | 
						|
			"Package.swift":           []byte(content1),
 | 
						|
			"Package@swift-5.5.swift": []byte(content2),
 | 
						|
		})
 | 
						|
 | 
						|
		p, err := ParsePackage(data, data.Size(), nil)
 | 
						|
		assert.NotNil(t, p)
 | 
						|
		assert.NoError(t, err)
 | 
						|
 | 
						|
		assert.NotNil(t, p.Metadata)
 | 
						|
		assert.Empty(t, p.RepositoryURLs)
 | 
						|
		assert.Len(t, p.Metadata.Manifests, 2)
 | 
						|
		m := p.Metadata.Manifests[""]
 | 
						|
		assert.Equal(t, "5.7", m.ToolsVersion)
 | 
						|
		assert.Equal(t, content1, m.Content)
 | 
						|
		m = p.Metadata.Manifests["5.5"]
 | 
						|
		assert.Equal(t, "5.6", m.ToolsVersion)
 | 
						|
		assert.Equal(t, content2, m.Content)
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("WithMetadata", func(t *testing.T) {
 | 
						|
		data := createArchive(map[string][]byte{
 | 
						|
			"Package.swift": []byte("// swift-tools-version:5.7\n//\n//  Package.swift"),
 | 
						|
		})
 | 
						|
 | 
						|
		p, err := ParsePackage(
 | 
						|
			data,
 | 
						|
			data.Size(),
 | 
						|
			strings.NewReader(`{"name":"`+packageName+`","version":"`+packageVersion+`","description":"`+packageDescription+`","keywords":["swift","package"],"license":"`+packageLicense+`","codeRepository":"`+packageRepositoryURL+`","author":{"givenName":"`+packageAuthor+`"},"repositoryURLs":["`+packageRepositoryURL+`"]}`),
 | 
						|
		)
 | 
						|
		assert.NotNil(t, p)
 | 
						|
		assert.NoError(t, err)
 | 
						|
 | 
						|
		assert.NotNil(t, p.Metadata)
 | 
						|
		assert.Len(t, p.Metadata.Manifests, 1)
 | 
						|
		m := p.Metadata.Manifests[""]
 | 
						|
		assert.Equal(t, "5.7", m.ToolsVersion)
 | 
						|
 | 
						|
		assert.Equal(t, packageDescription, p.Metadata.Description)
 | 
						|
		assert.ElementsMatch(t, []string{"swift", "package"}, p.Metadata.Keywords)
 | 
						|
		assert.Equal(t, packageLicense, p.Metadata.License)
 | 
						|
		assert.Equal(t, packageAuthor, p.Metadata.Author.GivenName)
 | 
						|
		assert.Equal(t, packageRepositoryURL, p.Metadata.RepositoryURL)
 | 
						|
		assert.ElementsMatch(t, []string{packageRepositoryURL}, p.RepositoryURLs)
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
func TestTrimmedVersionString(t *testing.T) {
 | 
						|
	cases := []struct {
 | 
						|
		Version  *version.Version
 | 
						|
		Expected string
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			Version:  version.Must(version.NewVersion("1")),
 | 
						|
			Expected: "1.0",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Version:  version.Must(version.NewVersion("1.0")),
 | 
						|
			Expected: "1.0",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Version:  version.Must(version.NewVersion("1.0.0")),
 | 
						|
			Expected: "1.0",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Version:  version.Must(version.NewVersion("1.0.1")),
 | 
						|
			Expected: "1.0.1",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Version:  version.Must(version.NewVersion("1.0+meta")),
 | 
						|
			Expected: "1.0",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Version:  version.Must(version.NewVersion("1.0.0+meta")),
 | 
						|
			Expected: "1.0",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Version:  version.Must(version.NewVersion("1.0.1+meta")),
 | 
						|
			Expected: "1.0.1",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, c := range cases {
 | 
						|
		assert.Equal(t, c.Expected, TrimmedVersionString(c.Version))
 | 
						|
	}
 | 
						|
}
 |