code.gitea.io/gitea@v1.22.3/modules/packages/nuget/metadata_test.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package nuget
     5  
     6  import (
     7  	"archive/zip"
     8  	"bytes"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  const (
    15  	id                = "System.Gitea"
    16  	semver            = "1.0.1"
    17  	authors           = "Gitea Authors"
    18  	projectURL        = "https://gitea.io"
    19  	description       = "Package Description"
    20  	releaseNotes      = "Package Release Notes"
    21  	readme            = "Readme"
    22  	repositoryURL     = "https://gitea.io/gitea/gitea"
    23  	targetFramework   = ".NETStandard2.1"
    24  	dependencyID      = "System.Text.Json"
    25  	dependencyVersion = "5.0.0"
    26  )
    27  
    28  const nuspecContent = `<?xml version="1.0" encoding="utf-8"?>
    29  <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
    30    <metadata>
    31      <id>` + id + `</id>
    32      <version>` + semver + `</version>
    33      <authors>` + authors + `</authors>
    34      <requireLicenseAcceptance>true</requireLicenseAcceptance>
    35      <projectUrl>` + projectURL + `</projectUrl>
    36      <description>` + description + `</description>
    37      <releaseNotes>` + releaseNotes + `</releaseNotes>
    38      <repository url="` + repositoryURL + `" />
    39      <readme>README.md</readme>
    40      <dependencies>
    41        <group targetFramework="` + targetFramework + `">
    42          <dependency id="` + dependencyID + `" version="` + dependencyVersion + `" exclude="Build,Analyzers" />
    43        </group>
    44      </dependencies>
    45    </metadata>
    46  </package>`
    47  
    48  const symbolsNuspecContent = `<?xml version="1.0" encoding="utf-8"?>
    49  <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
    50    <metadata>
    51      <id>` + id + `</id>
    52      <version>` + semver + `</version>
    53      <description>` + description + `</description>
    54      <packageTypes>
    55        <packageType name="SymbolsPackage" />
    56      </packageTypes>
    57      <dependencies>
    58        <group targetFramework="` + targetFramework + `" />
    59      </dependencies>
    60    </metadata>
    61  </package>`
    62  
    63  func TestParsePackageMetaData(t *testing.T) {
    64  	createArchive := func(files map[string]string) []byte {
    65  		var buf bytes.Buffer
    66  		archive := zip.NewWriter(&buf)
    67  		for name, content := range files {
    68  			w, _ := archive.Create(name)
    69  			w.Write([]byte(content))
    70  		}
    71  		archive.Close()
    72  		return buf.Bytes()
    73  	}
    74  
    75  	t.Run("MissingNuspecFile", func(t *testing.T) {
    76  		data := createArchive(map[string]string{"dummy.txt": ""})
    77  
    78  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
    79  		assert.Nil(t, np)
    80  		assert.ErrorIs(t, err, ErrMissingNuspecFile)
    81  	})
    82  
    83  	t.Run("MissingNuspecFileInRoot", func(t *testing.T) {
    84  		data := createArchive(map[string]string{"sub/package.nuspec": ""})
    85  
    86  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
    87  		assert.Nil(t, np)
    88  		assert.ErrorIs(t, err, ErrMissingNuspecFile)
    89  	})
    90  
    91  	t.Run("InvalidNuspecFile", func(t *testing.T) {
    92  		data := createArchive(map[string]string{"package.nuspec": ""})
    93  
    94  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
    95  		assert.Nil(t, np)
    96  		assert.Error(t, err)
    97  	})
    98  
    99  	t.Run("InvalidPackageId", func(t *testing.T) {
   100  		data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?>
   101  		<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
   102  		  <metadata></metadata>
   103  		</package>`})
   104  
   105  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   106  		assert.Nil(t, np)
   107  		assert.ErrorIs(t, err, ErrNuspecInvalidID)
   108  	})
   109  
   110  	t.Run("InvalidPackageVersion", func(t *testing.T) {
   111  		data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?>
   112  		<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
   113  		  <metadata>
   114  			<id>` + id + `</id>
   115  		  </metadata>
   116  		</package>`})
   117  
   118  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   119  		assert.Nil(t, np)
   120  		assert.ErrorIs(t, err, ErrNuspecInvalidVersion)
   121  	})
   122  
   123  	t.Run("MissingReadme", func(t *testing.T) {
   124  		data := createArchive(map[string]string{"package.nuspec": nuspecContent})
   125  
   126  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   127  		assert.NoError(t, err)
   128  		assert.NotNil(t, np)
   129  		assert.Empty(t, np.Metadata.Readme)
   130  	})
   131  
   132  	t.Run("Dependency Package", func(t *testing.T) {
   133  		data := createArchive(map[string]string{
   134  			"package.nuspec": nuspecContent,
   135  			"README.md":      readme,
   136  		})
   137  
   138  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   139  		assert.NoError(t, err)
   140  		assert.NotNil(t, np)
   141  		assert.Equal(t, DependencyPackage, np.PackageType)
   142  
   143  		assert.Equal(t, id, np.ID)
   144  		assert.Equal(t, semver, np.Version)
   145  		assert.Equal(t, authors, np.Metadata.Authors)
   146  		assert.Equal(t, projectURL, np.Metadata.ProjectURL)
   147  		assert.Equal(t, description, np.Metadata.Description)
   148  		assert.Equal(t, releaseNotes, np.Metadata.ReleaseNotes)
   149  		assert.Equal(t, readme, np.Metadata.Readme)
   150  		assert.Equal(t, repositoryURL, np.Metadata.RepositoryURL)
   151  		assert.Len(t, np.Metadata.Dependencies, 1)
   152  		assert.Contains(t, np.Metadata.Dependencies, targetFramework)
   153  		deps := np.Metadata.Dependencies[targetFramework]
   154  		assert.Len(t, deps, 1)
   155  		assert.Equal(t, dependencyID, deps[0].ID)
   156  		assert.Equal(t, dependencyVersion, deps[0].Version)
   157  
   158  		t.Run("NormalizedVersion", func(t *testing.T) {
   159  			data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?>
   160  				<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
   161  				  <metadata>
   162  					<id>test</id>
   163  					<version>1.04.5.2.5-rc.1+metadata</version>
   164  				  </metadata>
   165  				</package>`})
   166  
   167  			np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   168  			assert.NoError(t, err)
   169  			assert.NotNil(t, np)
   170  			assert.Equal(t, "1.4.5.2-rc.1", np.Version)
   171  		})
   172  	})
   173  
   174  	t.Run("Symbols Package", func(t *testing.T) {
   175  		data := createArchive(map[string]string{"package.nuspec": symbolsNuspecContent})
   176  
   177  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   178  		assert.NoError(t, err)
   179  		assert.NotNil(t, np)
   180  		assert.Equal(t, SymbolsPackage, np.PackageType)
   181  
   182  		assert.Equal(t, id, np.ID)
   183  		assert.Equal(t, semver, np.Version)
   184  		assert.Equal(t, description, np.Metadata.Description)
   185  		assert.Empty(t, np.Metadata.Dependencies)
   186  	})
   187  }