code.gitea.io/gitea@v1.19.3/modules/packages/composer/metadata_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package composer 5 6 import ( 7 "archive/zip" 8 "bytes" 9 "strings" 10 "testing" 11 12 "code.gitea.io/gitea/modules/json" 13 14 "github.com/stretchr/testify/assert" 15 ) 16 17 const ( 18 name = "gitea/composer-package" 19 description = "Package Description" 20 packageType = "composer-plugin" 21 author = "Gitea Authors" 22 email = "no.reply@gitea.io" 23 homepage = "https://gitea.io" 24 license = "MIT" 25 ) 26 27 const composerContent = `{ 28 "name": "` + name + `", 29 "description": "` + description + `", 30 "type": "` + packageType + `", 31 "license": "` + license + `", 32 "authors": [ 33 { 34 "name": "` + author + `", 35 "email": "` + email + `" 36 } 37 ], 38 "homepage": "` + homepage + `", 39 "autoload": { 40 "psr-4": {"Gitea\\ComposerPackage\\": "src/"} 41 }, 42 "require": { 43 "php": ">=7.2 || ^8.0" 44 } 45 }` 46 47 func TestLicenseUnmarshal(t *testing.T) { 48 var l Licenses 49 assert.NoError(t, json.NewDecoder(strings.NewReader(`["MIT"]`)).Decode(&l)) 50 assert.Len(t, l, 1) 51 assert.Equal(t, "MIT", l[0]) 52 assert.NoError(t, json.NewDecoder(strings.NewReader(`"MIT"`)).Decode(&l)) 53 assert.Len(t, l, 1) 54 assert.Equal(t, "MIT", l[0]) 55 } 56 57 func TestParsePackage(t *testing.T) { 58 createArchive := func(name, content string) []byte { 59 var buf bytes.Buffer 60 archive := zip.NewWriter(&buf) 61 w, _ := archive.Create(name) 62 w.Write([]byte(content)) 63 archive.Close() 64 return buf.Bytes() 65 } 66 67 t.Run("MissingComposerFile", func(t *testing.T) { 68 data := createArchive("dummy.txt", "") 69 70 cp, err := ParsePackage(bytes.NewReader(data), int64(len(data))) 71 assert.Nil(t, cp) 72 assert.ErrorIs(t, err, ErrMissingComposerFile) 73 }) 74 75 t.Run("MissingComposerFileInRoot", func(t *testing.T) { 76 data := createArchive("sub/sub/composer.json", "") 77 78 cp, err := ParsePackage(bytes.NewReader(data), int64(len(data))) 79 assert.Nil(t, cp) 80 assert.ErrorIs(t, err, ErrMissingComposerFile) 81 }) 82 83 t.Run("InvalidComposerFile", func(t *testing.T) { 84 data := createArchive("composer.json", "") 85 86 cp, err := ParsePackage(bytes.NewReader(data), int64(len(data))) 87 assert.Nil(t, cp) 88 assert.Error(t, err) 89 }) 90 91 t.Run("Valid", func(t *testing.T) { 92 data := createArchive("composer.json", composerContent) 93 94 cp, err := ParsePackage(bytes.NewReader(data), int64(len(data))) 95 assert.NoError(t, err) 96 assert.NotNil(t, cp) 97 }) 98 } 99 100 func TestParseComposerFile(t *testing.T) { 101 t.Run("InvalidPackageName", func(t *testing.T) { 102 cp, err := ParseComposerFile(strings.NewReader(`{}`)) 103 assert.Nil(t, cp) 104 assert.ErrorIs(t, err, ErrInvalidName) 105 }) 106 107 t.Run("InvalidPackageVersion", func(t *testing.T) { 108 cp, err := ParseComposerFile(strings.NewReader(`{"name": "gitea/composer-package", "version": "1.a.3"}`)) 109 assert.Nil(t, cp) 110 assert.ErrorIs(t, err, ErrInvalidVersion) 111 }) 112 113 t.Run("Valid", func(t *testing.T) { 114 cp, err := ParseComposerFile(strings.NewReader(composerContent)) 115 assert.NoError(t, err) 116 assert.NotNil(t, cp) 117 118 assert.Equal(t, name, cp.Name) 119 assert.Empty(t, cp.Version) 120 assert.Equal(t, description, cp.Metadata.Description) 121 assert.Len(t, cp.Metadata.Authors, 1) 122 assert.Equal(t, author, cp.Metadata.Authors[0].Name) 123 assert.Equal(t, email, cp.Metadata.Authors[0].Email) 124 assert.Equal(t, homepage, cp.Metadata.Homepage) 125 assert.Equal(t, packageType, cp.Type) 126 assert.Len(t, cp.Metadata.License, 1) 127 assert.Equal(t, license, cp.Metadata.License[0]) 128 }) 129 }