code.gitea.io/gitea@v1.22.3/modules/packages/cran/metadata_test.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package cran 5 6 import ( 7 "archive/tar" 8 "archive/zip" 9 "bytes" 10 "compress/gzip" 11 "fmt" 12 "testing" 13 14 "github.com/stretchr/testify/assert" 15 ) 16 17 const ( 18 packageName = "gitea" 19 packageVersion = "1.0.1" 20 author = "KN4CK3R" 21 description = "Package Description" 22 projectURL = "https://gitea.io" 23 license = "GPL (>= 2)" 24 ) 25 26 func createDescription(name, version string) *bytes.Buffer { 27 var buf bytes.Buffer 28 fmt.Fprintln(&buf, "Package:", name) 29 fmt.Fprintln(&buf, "Version:", version) 30 fmt.Fprintln(&buf, "Description:", "Package\n\n Description") 31 fmt.Fprintln(&buf, "URL:", projectURL) 32 fmt.Fprintln(&buf, "Imports: abc,\n123") 33 fmt.Fprintln(&buf, "NeedsCompilation: yes") 34 fmt.Fprintln(&buf, "License:", license) 35 fmt.Fprintln(&buf, "Author:", author) 36 return &buf 37 } 38 39 func TestParsePackage(t *testing.T) { 40 t.Run(".tar.gz", func(t *testing.T) { 41 createArchive := func(filename string, content []byte) *bytes.Reader { 42 var buf bytes.Buffer 43 gw := gzip.NewWriter(&buf) 44 tw := tar.NewWriter(gw) 45 hdr := &tar.Header{ 46 Name: filename, 47 Mode: 0o600, 48 Size: int64(len(content)), 49 } 50 tw.WriteHeader(hdr) 51 tw.Write(content) 52 tw.Close() 53 gw.Close() 54 return bytes.NewReader(buf.Bytes()) 55 } 56 57 t.Run("MissingDescriptionFile", func(t *testing.T) { 58 buf := createArchive( 59 "dummy.txt", 60 []byte{}, 61 ) 62 63 p, err := ParsePackage(buf, buf.Size()) 64 assert.Nil(t, p) 65 assert.ErrorIs(t, err, ErrMissingDescriptionFile) 66 }) 67 68 t.Run("Valid", func(t *testing.T) { 69 buf := createArchive( 70 "package/DESCRIPTION", 71 createDescription(packageName, packageVersion).Bytes(), 72 ) 73 74 p, err := ParsePackage(buf, buf.Size()) 75 76 assert.NotNil(t, p) 77 assert.NoError(t, err) 78 79 assert.Equal(t, packageName, p.Name) 80 assert.Equal(t, packageVersion, p.Version) 81 }) 82 }) 83 84 t.Run(".zip", func(t *testing.T) { 85 createArchive := func(filename string, content []byte) *bytes.Reader { 86 var buf bytes.Buffer 87 archive := zip.NewWriter(&buf) 88 w, _ := archive.Create(filename) 89 w.Write(content) 90 archive.Close() 91 return bytes.NewReader(buf.Bytes()) 92 } 93 94 t.Run("MissingDescriptionFile", func(t *testing.T) { 95 buf := createArchive( 96 "dummy.txt", 97 []byte{}, 98 ) 99 100 p, err := ParsePackage(buf, buf.Size()) 101 assert.Nil(t, p) 102 assert.ErrorIs(t, err, ErrMissingDescriptionFile) 103 }) 104 105 t.Run("Valid", func(t *testing.T) { 106 buf := createArchive( 107 "package/DESCRIPTION", 108 createDescription(packageName, packageVersion).Bytes(), 109 ) 110 111 p, err := ParsePackage(buf, buf.Size()) 112 assert.NotNil(t, p) 113 assert.NoError(t, err) 114 115 assert.Equal(t, packageName, p.Name) 116 assert.Equal(t, packageVersion, p.Version) 117 }) 118 }) 119 } 120 121 func TestParseDescription(t *testing.T) { 122 t.Run("InvalidName", func(t *testing.T) { 123 for _, name := range []string{"123abc", "ab-cd", "ab cd", "ab/cd"} { 124 p, err := ParseDescription(createDescription(name, packageVersion)) 125 assert.Nil(t, p) 126 assert.ErrorIs(t, err, ErrInvalidName) 127 } 128 }) 129 130 t.Run("InvalidVersion", func(t *testing.T) { 131 for _, version := range []string{"1", "1 0", "1.2.3.4.5", "1-2-3-4-5", "1.", "1.0.", "1-", "1-0-"} { 132 p, err := ParseDescription(createDescription(packageName, version)) 133 assert.Nil(t, p) 134 assert.ErrorIs(t, err, ErrInvalidVersion) 135 } 136 }) 137 138 t.Run("Valid", func(t *testing.T) { 139 p, err := ParseDescription(createDescription(packageName, packageVersion)) 140 assert.NoError(t, err) 141 assert.NotNil(t, p) 142 143 assert.Equal(t, packageName, p.Name) 144 assert.Equal(t, packageVersion, p.Version) 145 assert.Equal(t, description, p.Metadata.Description) 146 assert.ElementsMatch(t, []string{projectURL}, p.Metadata.ProjectURL) 147 assert.ElementsMatch(t, []string{author}, p.Metadata.Authors) 148 assert.Equal(t, license, p.Metadata.License) 149 assert.ElementsMatch(t, []string{"abc", "123"}, p.Metadata.Imports) 150 assert.True(t, p.Metadata.NeedsCompilation) 151 }) 152 }