code.gitea.io/gitea@v1.19.3/modules/packages/pub/metadata_test.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package pub 5 6 import ( 7 "archive/tar" 8 "bytes" 9 "compress/gzip" 10 "io" 11 "strings" 12 "testing" 13 14 "github.com/stretchr/testify/assert" 15 ) 16 17 const ( 18 packageName = "gitea" 19 packageVersion = "1.0.1" 20 description = "Package Description" 21 projectURL = "https://gitea.io" 22 repositoryURL = "https://gitea.io/gitea/gitea" 23 documentationURL = "https://docs.gitea.io" 24 ) 25 26 const pubspecContent = `name: ` + packageName + ` 27 version: ` + packageVersion + ` 28 description: ` + description + ` 29 homepage: ` + projectURL + ` 30 repository: ` + repositoryURL + ` 31 documentation: ` + documentationURL + ` 32 33 environment: 34 sdk: '>=2.16.0 <3.0.0' 35 36 dependencies: 37 flutter: 38 sdk: flutter 39 path: '>=1.8.0 <3.0.0' 40 41 dev_dependencies: 42 http: '>=0.13.0'` 43 44 func TestParsePackage(t *testing.T) { 45 createArchive := func(files map[string][]byte) io.Reader { 46 var buf bytes.Buffer 47 zw := gzip.NewWriter(&buf) 48 tw := tar.NewWriter(zw) 49 for filename, content := range files { 50 hdr := &tar.Header{ 51 Name: filename, 52 Mode: 0o600, 53 Size: int64(len(content)), 54 } 55 tw.WriteHeader(hdr) 56 tw.Write(content) 57 } 58 tw.Close() 59 zw.Close() 60 return &buf 61 } 62 63 t.Run("MissingPubspecFile", func(t *testing.T) { 64 data := createArchive(map[string][]byte{"dummy.txt": {}}) 65 66 pp, err := ParsePackage(data) 67 assert.Nil(t, pp) 68 assert.ErrorIs(t, err, ErrMissingPubspecFile) 69 }) 70 71 t.Run("PubspecFileTooLarge", func(t *testing.T) { 72 data := createArchive(map[string][]byte{"pubspec.yaml": make([]byte, 200*1024)}) 73 74 pp, err := ParsePackage(data) 75 assert.Nil(t, pp) 76 assert.ErrorIs(t, err, ErrPubspecFileTooLarge) 77 }) 78 79 t.Run("InvalidPubspecFile", func(t *testing.T) { 80 data := createArchive(map[string][]byte{"pubspec.yaml": {}}) 81 82 pp, err := ParsePackage(data) 83 assert.Nil(t, pp) 84 assert.Error(t, err) 85 }) 86 87 t.Run("Valid", func(t *testing.T) { 88 data := createArchive(map[string][]byte{"pubspec.yaml": []byte(pubspecContent)}) 89 90 pp, err := ParsePackage(data) 91 assert.NoError(t, err) 92 assert.NotNil(t, pp) 93 assert.Empty(t, pp.Metadata.Readme) 94 }) 95 96 t.Run("ValidWithReadme", func(t *testing.T) { 97 data := createArchive(map[string][]byte{"pubspec.yaml": []byte(pubspecContent), "README.md": []byte("readme")}) 98 99 pp, err := ParsePackage(data) 100 assert.NoError(t, err) 101 assert.NotNil(t, pp) 102 assert.Equal(t, "readme", pp.Metadata.Readme) 103 }) 104 } 105 106 func TestParsePubspecMetadata(t *testing.T) { 107 t.Run("InvalidName", func(t *testing.T) { 108 for _, name := range []string{"123abc", "ab-cd"} { 109 pp, err := ParsePubspecMetadata(strings.NewReader(`name: ` + name)) 110 assert.Nil(t, pp) 111 assert.ErrorIs(t, err, ErrInvalidName) 112 } 113 }) 114 115 t.Run("InvalidVersion", func(t *testing.T) { 116 pp, err := ParsePubspecMetadata(strings.NewReader(`name: dummy 117 version: invalid`)) 118 assert.Nil(t, pp) 119 assert.ErrorIs(t, err, ErrInvalidVersion) 120 }) 121 122 t.Run("Valid", func(t *testing.T) { 123 pp, err := ParsePubspecMetadata(strings.NewReader(pubspecContent)) 124 assert.NoError(t, err) 125 assert.NotNil(t, pp) 126 127 assert.Equal(t, packageName, pp.Name) 128 assert.Equal(t, packageVersion, pp.Version) 129 assert.Equal(t, description, pp.Metadata.Description) 130 assert.Equal(t, projectURL, pp.Metadata.ProjectURL) 131 assert.Equal(t, repositoryURL, pp.Metadata.RepositoryURL) 132 assert.Equal(t, documentationURL, pp.Metadata.DocumentationURL) 133 assert.NotNil(t, pp.Metadata.Pubspec) 134 }) 135 }