code.gitea.io/gitea@v1.22.3/modules/packages/swift/metadata_test.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package swift
     5  
     6  import (
     7  	"archive/zip"
     8  	"bytes"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/hashicorp/go-version"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  const (
    17  	packageName          = "gitea"
    18  	packageVersion       = "1.0.1"
    19  	packageDescription   = "Package Description"
    20  	packageRepositoryURL = "https://gitea.io/gitea/gitea"
    21  	packageAuthor        = "KN4CK3R"
    22  	packageLicense       = "MIT"
    23  )
    24  
    25  func TestParsePackage(t *testing.T) {
    26  	createArchive := func(files map[string][]byte) *bytes.Reader {
    27  		var buf bytes.Buffer
    28  		zw := zip.NewWriter(&buf)
    29  		for filename, content := range files {
    30  			w, _ := zw.Create(filename)
    31  			w.Write(content)
    32  		}
    33  		zw.Close()
    34  		return bytes.NewReader(buf.Bytes())
    35  	}
    36  
    37  	t.Run("MissingManifestFile", func(t *testing.T) {
    38  		data := createArchive(map[string][]byte{"dummy.txt": {}})
    39  
    40  		p, err := ParsePackage(data, data.Size(), nil)
    41  		assert.Nil(t, p)
    42  		assert.ErrorIs(t, err, ErrMissingManifestFile)
    43  	})
    44  
    45  	t.Run("ManifestFileTooLarge", func(t *testing.T) {
    46  		data := createArchive(map[string][]byte{
    47  			"Package.swift": make([]byte, maxManifestFileSize+1),
    48  		})
    49  
    50  		p, err := ParsePackage(data, data.Size(), nil)
    51  		assert.Nil(t, p)
    52  		assert.ErrorIs(t, err, ErrManifestFileTooLarge)
    53  	})
    54  
    55  	t.Run("WithoutMetadata", func(t *testing.T) {
    56  		content1 := "// swift-tools-version:5.7\n//\n//  Package.swift"
    57  		content2 := "// swift-tools-version:5.6\n//\n//  Package@swift-5.6.swift"
    58  
    59  		data := createArchive(map[string][]byte{
    60  			"Package.swift":           []byte(content1),
    61  			"Package@swift-5.5.swift": []byte(content2),
    62  		})
    63  
    64  		p, err := ParsePackage(data, data.Size(), nil)
    65  		assert.NotNil(t, p)
    66  		assert.NoError(t, err)
    67  
    68  		assert.NotNil(t, p.Metadata)
    69  		assert.Empty(t, p.RepositoryURLs)
    70  		assert.Len(t, p.Metadata.Manifests, 2)
    71  		m := p.Metadata.Manifests[""]
    72  		assert.Equal(t, "5.7", m.ToolsVersion)
    73  		assert.Equal(t, content1, m.Content)
    74  		m = p.Metadata.Manifests["5.5"]
    75  		assert.Equal(t, "5.6", m.ToolsVersion)
    76  		assert.Equal(t, content2, m.Content)
    77  	})
    78  
    79  	t.Run("WithMetadata", func(t *testing.T) {
    80  		data := createArchive(map[string][]byte{
    81  			"Package.swift": []byte("// swift-tools-version:5.7\n//\n//  Package.swift"),
    82  		})
    83  
    84  		p, err := ParsePackage(
    85  			data,
    86  			data.Size(),
    87  			strings.NewReader(`{"name":"`+packageName+`","version":"`+packageVersion+`","description":"`+packageDescription+`","keywords":["swift","package"],"license":"`+packageLicense+`","codeRepository":"`+packageRepositoryURL+`","author":{"givenName":"`+packageAuthor+`"},"repositoryURLs":["`+packageRepositoryURL+`"]}`),
    88  		)
    89  		assert.NotNil(t, p)
    90  		assert.NoError(t, err)
    91  
    92  		assert.NotNil(t, p.Metadata)
    93  		assert.Len(t, p.Metadata.Manifests, 1)
    94  		m := p.Metadata.Manifests[""]
    95  		assert.Equal(t, "5.7", m.ToolsVersion)
    96  
    97  		assert.Equal(t, packageDescription, p.Metadata.Description)
    98  		assert.ElementsMatch(t, []string{"swift", "package"}, p.Metadata.Keywords)
    99  		assert.Equal(t, packageLicense, p.Metadata.License)
   100  		assert.Equal(t, packageAuthor, p.Metadata.Author.GivenName)
   101  		assert.Equal(t, packageRepositoryURL, p.Metadata.RepositoryURL)
   102  		assert.ElementsMatch(t, []string{packageRepositoryURL}, p.RepositoryURLs)
   103  	})
   104  }
   105  
   106  func TestTrimmedVersionString(t *testing.T) {
   107  	cases := []struct {
   108  		Version  *version.Version
   109  		Expected string
   110  	}{
   111  		{
   112  			Version:  version.Must(version.NewVersion("1")),
   113  			Expected: "1.0",
   114  		},
   115  		{
   116  			Version:  version.Must(version.NewVersion("1.0")),
   117  			Expected: "1.0",
   118  		},
   119  		{
   120  			Version:  version.Must(version.NewVersion("1.0.0")),
   121  			Expected: "1.0",
   122  		},
   123  		{
   124  			Version:  version.Must(version.NewVersion("1.0.1")),
   125  			Expected: "1.0.1",
   126  		},
   127  		{
   128  			Version:  version.Must(version.NewVersion("1.0+meta")),
   129  			Expected: "1.0",
   130  		},
   131  		{
   132  			Version:  version.Must(version.NewVersion("1.0.0+meta")),
   133  			Expected: "1.0",
   134  		},
   135  		{
   136  			Version:  version.Must(version.NewVersion("1.0.1+meta")),
   137  			Expected: "1.0.1",
   138  		},
   139  	}
   140  
   141  	for _, c := range cases {
   142  		assert.Equal(t, c.Expected, TrimmedVersionString(c.Version))
   143  	}
   144  }