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  }