code.gitea.io/gitea@v1.19.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  	"strings"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  const (
    16  	id                = "System.Gitea"
    17  	semver            = "1.0.1"
    18  	authors           = "Gitea Authors"
    19  	projectURL        = "https://gitea.io"
    20  	description       = "Package Description"
    21  	releaseNotes      = "Package Release Notes"
    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      <dependencies>
    40        <group targetFramework="` + targetFramework + `">
    41          <dependency id="` + dependencyID + `" version="` + dependencyVersion + `" exclude="Build,Analyzers" />
    42        </group>
    43      </dependencies>
    44    </metadata>
    45  </package>`
    46  
    47  const symbolsNuspecContent = `<?xml version="1.0" encoding="utf-8"?>
    48  <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
    49    <metadata>
    50      <id>` + id + `</id>
    51      <version>` + semver + `</version>
    52      <description>` + description + `</description>
    53      <packageTypes>
    54        <packageType name="SymbolsPackage" />
    55      </packageTypes>
    56      <dependencies>
    57        <group targetFramework="` + targetFramework + `" />
    58      </dependencies>
    59    </metadata>
    60  </package>`
    61  
    62  func TestParsePackageMetaData(t *testing.T) {
    63  	createArchive := func(name, content string) []byte {
    64  		var buf bytes.Buffer
    65  		archive := zip.NewWriter(&buf)
    66  		w, _ := archive.Create(name)
    67  		w.Write([]byte(content))
    68  		archive.Close()
    69  		return buf.Bytes()
    70  	}
    71  
    72  	t.Run("MissingNuspecFile", func(t *testing.T) {
    73  		data := createArchive("dummy.txt", "")
    74  
    75  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
    76  		assert.Nil(t, np)
    77  		assert.ErrorIs(t, err, ErrMissingNuspecFile)
    78  	})
    79  
    80  	t.Run("MissingNuspecFileInRoot", func(t *testing.T) {
    81  		data := createArchive("sub/package.nuspec", "")
    82  
    83  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
    84  		assert.Nil(t, np)
    85  		assert.ErrorIs(t, err, ErrMissingNuspecFile)
    86  	})
    87  
    88  	t.Run("InvalidNuspecFile", func(t *testing.T) {
    89  		data := createArchive("package.nuspec", "")
    90  
    91  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
    92  		assert.Nil(t, np)
    93  		assert.Error(t, err)
    94  	})
    95  
    96  	t.Run("InvalidPackageId", func(t *testing.T) {
    97  		data := createArchive("package.nuspec", `<?xml version="1.0" encoding="utf-8"?>
    98  		<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
    99  		  <metadata></metadata>
   100  		</package>`)
   101  
   102  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   103  		assert.Nil(t, np)
   104  		assert.ErrorIs(t, err, ErrNuspecInvalidID)
   105  	})
   106  
   107  	t.Run("InvalidPackageVersion", func(t *testing.T) {
   108  		data := createArchive("package.nuspec", `<?xml version="1.0" encoding="utf-8"?>
   109  		<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
   110  		  <metadata>
   111  			<id>`+id+`</id>
   112  		  </metadata>
   113  		</package>`)
   114  
   115  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   116  		assert.Nil(t, np)
   117  		assert.ErrorIs(t, err, ErrNuspecInvalidVersion)
   118  	})
   119  
   120  	t.Run("Valid", func(t *testing.T) {
   121  		data := createArchive("package.nuspec", nuspecContent)
   122  
   123  		np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data)))
   124  		assert.NoError(t, err)
   125  		assert.NotNil(t, np)
   126  	})
   127  }
   128  
   129  func TestParseNuspecMetaData(t *testing.T) {
   130  	t.Run("Dependency Package", func(t *testing.T) {
   131  		np, err := ParseNuspecMetaData(strings.NewReader(nuspecContent))
   132  		assert.NoError(t, err)
   133  		assert.NotNil(t, np)
   134  		assert.Equal(t, DependencyPackage, np.PackageType)
   135  
   136  		assert.Equal(t, id, np.ID)
   137  		assert.Equal(t, semver, np.Version)
   138  		assert.Equal(t, authors, np.Metadata.Authors)
   139  		assert.Equal(t, projectURL, np.Metadata.ProjectURL)
   140  		assert.Equal(t, description, np.Metadata.Description)
   141  		assert.Equal(t, releaseNotes, np.Metadata.ReleaseNotes)
   142  		assert.Equal(t, repositoryURL, np.Metadata.RepositoryURL)
   143  		assert.Len(t, np.Metadata.Dependencies, 1)
   144  		assert.Contains(t, np.Metadata.Dependencies, targetFramework)
   145  		deps := np.Metadata.Dependencies[targetFramework]
   146  		assert.Len(t, deps, 1)
   147  		assert.Equal(t, dependencyID, deps[0].ID)
   148  		assert.Equal(t, dependencyVersion, deps[0].Version)
   149  
   150  		t.Run("NormalizedVersion", func(t *testing.T) {
   151  			np, err := ParseNuspecMetaData(strings.NewReader(`<?xml version="1.0" encoding="utf-8"?>
   152  <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
   153    <metadata>
   154  	<id>test</id>
   155  	<version>1.04.5.2.5-rc.1+metadata</version>
   156    </metadata>
   157  </package>`))
   158  			assert.NoError(t, err)
   159  			assert.NotNil(t, np)
   160  			assert.Equal(t, "1.4.5.2-rc.1", np.Version)
   161  		})
   162  	})
   163  
   164  	t.Run("Symbols Package", func(t *testing.T) {
   165  		np, err := ParseNuspecMetaData(strings.NewReader(symbolsNuspecContent))
   166  		assert.NoError(t, err)
   167  		assert.NotNil(t, np)
   168  		assert.Equal(t, SymbolsPackage, np.PackageType)
   169  
   170  		assert.Equal(t, id, np.ID)
   171  		assert.Equal(t, semver, np.Version)
   172  		assert.Equal(t, description, np.Metadata.Description)
   173  		assert.Empty(t, np.Metadata.Dependencies)
   174  	})
   175  }