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  }