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  }