hub/internal/pkg/metadata_test.go

355 lines
7.7 KiB
Go

package pkg
import (
"errors"
"os"
"strconv"
"testing"
"github.com/artifacthub/hub/internal/hub"
"github.com/stretchr/testify/assert"
)
func TestGetPackageMetadata(t *testing.T) {
t.Run("error reading package metadata file", func(t *testing.T) {
t.Parallel()
_, err := GetPackageMetadata("testdata/not-exists")
assert.Error(t, err)
assert.Contains(t, err.Error(), "error reading package metadata file")
assert.True(t, errors.Is(err, os.ErrNotExist))
})
t.Run("error unmarshaling package metadata file", func(t *testing.T) {
t.Parallel()
_, err := GetPackageMetadata("testdata/invalid")
assert.Error(t, err)
assert.Contains(t, err.Error(), "error unmarshaling package metadata file")
})
t.Run("error validating package metadata file", func(t *testing.T) {
t.Parallel()
_, err := GetPackageMetadata("testdata/no-version")
assert.Error(t, err)
assert.Contains(t, err.Error(), "error validating package metadata file")
})
t.Run("success with .yml", func(t *testing.T) {
t.Parallel()
_, err := GetPackageMetadata("testdata/valid1")
assert.NoError(t, err)
})
t.Run("success with .yaml", func(t *testing.T) {
t.Parallel()
_, err := GetPackageMetadata("testdata/valid2")
assert.NoError(t, err)
})
}
func TestPreparePackageFromMetadata(t *testing.T) {
testCases := []struct {
md *hub.PackageMetadata
expectedPkg *hub.Package
expectedErr error
}{
{
&hub.PackageMetadata{},
nil,
ErrInvalidMetadata,
},
{
&hub.PackageMetadata{
Version: "v1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
CreatedAt: "2006-01-02T15:04:05Z",
Description: "Package description",
Digest: "0123456789",
License: "Apache-2.0",
HomeURL: "https://home.url",
AppVersion: "10.0.0",
PublisherID: "1234",
ContainersImages: []*hub.ContainerImage{
{
Image: "registry/org/image:tag",
},
},
Operator: false,
Deprecated: false,
Keywords: []string{
"kw1",
"kw2",
},
Links: []*hub.Link{
{
Name: "link1",
URL: "https://link1.url",
},
},
Readme: "Package readme",
Install: "Package install",
Changes: []*hub.Change{
{
Kind: "Added",
Description: "feature 1",
},
{
Kind: "Fixed",
Description: "issue 1",
},
},
ContainsSecurityUpdates: true,
Prerelease: true,
Maintainers: []*hub.Maintainer{
{
Name: "maintainer1",
Email: "maintainer1@email.com",
},
},
Provider: &hub.Provider{
Name: "Package provider",
},
Recommendations: []*hub.Recommendation{
{
URL: "https://artifacthub.io/packages/helm/artifact-hub/artifact-hub",
},
},
},
&hub.Package{
Name: "pkg1",
IsOperator: false,
DisplayName: "Package 1",
Description: "Package description",
Keywords: []string{
"kw1",
"kw2",
},
HomeURL: "https://home.url",
Readme: "Package readme",
Install: "Package install",
Links: []*hub.Link{
{
Name: "link1",
URL: "https://link1.url",
},
},
Version: "1.0.0",
AppVersion: "10.0.0",
Digest: "0123456789",
Deprecated: false,
License: "Apache-2.0",
ContainersImages: []*hub.ContainerImage{
{
Image: "registry/org/image:tag",
},
},
Provider: "Package provider",
Changes: []*hub.Change{
{
Kind: "added",
Description: "feature 1",
},
{
Kind: "fixed",
Description: "issue 1",
},
},
ContainsSecurityUpdates: true,
Prerelease: true,
Maintainers: []*hub.Maintainer{
{
Name: "maintainer1",
Email: "maintainer1@email.com",
},
},
Recommendations: []*hub.Recommendation{
{
URL: "https://artifacthub.io/packages/helm/artifact-hub/artifact-hub",
},
},
TS: 1136214245,
},
nil,
},
}
for i, tc := range testCases {
tc := tc
t.Run(strconv.Itoa(i), func(t *testing.T) {
t.Parallel()
pkg, err := PreparePackageFromMetadata(tc.md)
if tc.expectedErr == nil {
assert.Nil(t, err)
} else {
assert.True(t, errors.Is(err, tc.expectedErr))
}
assert.Equal(t, tc.expectedPkg, pkg)
})
}
}
func TestValidatePackageMetadata(t *testing.T) {
t.Run("invalid metadata", func(t *testing.T) {
testCases := []struct {
md *hub.PackageMetadata
errMsg string
}{
{
&hub.PackageMetadata{},
"version not provided",
},
{
&hub.PackageMetadata{
Version: "invalid",
},
"invalid version (semver expected)",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
},
"name not provided",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
},
"display name not provided",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
},
"createdAt not provided",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
CreatedAt: "2006-01-02 15:04",
},
"invalid createdAt (RFC3339 expected)",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
CreatedAt: "2006-01-02T15:04:05Z",
},
"description not provided",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
CreatedAt: "2006-01-02T15:04:05Z",
Description: "description",
Changes: []*hub.Change{
{
Kind: "test",
Description: "description",
},
},
},
"invalid change: invalid kind: test",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
CreatedAt: "2006-01-02T15:04:05Z",
Description: "description",
Changes: []*hub.Change{
{
Kind: "added",
},
},
},
"invalid change: description not provided",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
CreatedAt: "2006-01-02T15:04:05Z",
Description: "description",
Changes: []*hub.Change{
{
Kind: "added",
Description: "feature 1",
Links: []*hub.Link{
{
URL: "https://link1.url",
},
},
},
},
},
"invalid change: link name not provided",
},
{
&hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
CreatedAt: "2006-01-02T15:04:05Z",
Description: "description",
Changes: []*hub.Change{
{
Kind: "added",
Description: "feature 1",
Links: []*hub.Link{
{
Name: "link1",
},
},
},
},
},
"invalid change: link url not provided",
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.errMsg, func(t *testing.T) {
t.Parallel()
err := ValidatePackageMetadata(tc.md)
assert.True(t, errors.Is(err, ErrInvalidMetadata))
assert.Contains(t, err.Error(), tc.errMsg)
})
}
})
t.Run("valid metadata", func(t *testing.T) {
t.Parallel()
md := &hub.PackageMetadata{
Version: "1.0.0",
Name: "pkg1",
DisplayName: "Package 1",
CreatedAt: "2006-01-02T15:04:05Z",
Description: "Package description",
Changes: []*hub.Change{
{
Kind: "Added",
Description: "feature 1",
Links: []*hub.Link{
{
Name: "link1",
URL: "https://link1.url",
},
},
},
},
}
err := ValidatePackageMetadata(md)
assert.Nil(t, err)
})
}