hub/internal/tracker/helpers_test.go

455 lines
10 KiB
Go

package tracker
import (
"context"
"errors"
"fmt"
"reflect"
"testing"
"github.com/artifacthub/hub/internal/hub"
"github.com/artifacthub/hub/internal/oci"
"github.com/artifacthub/hub/internal/repo"
"github.com/artifacthub/hub/internal/tests"
"github.com/spf13/viper"
"github.com/stretchr/testify/assert"
)
func TestGetRepositories(t *testing.T) {
ctx := context.Background()
repo1 := &hub.Repository{
Name: "repo1",
Kind: hub.Helm,
}
repo2 := &hub.Repository{
Name: "repo2",
Kind: hub.OLM,
}
repo3 := &hub.Repository{
Name: "repo3",
Kind: hub.OPA,
Disabled: true,
}
t.Run("error getting repository by name", func(t *testing.T) {
t.Parallel()
// Setup expectations
rm := &repo.ManagerMock{}
rm.On("GetByName", ctx, "repo1", true).Return(nil, tests.ErrFake)
// Run test and check expectations
cfg := viper.New()
cfg.Set("tracker.repositoriesNames", []string{"repo1"})
repos, err := GetRepositories(ctx, cfg, rm)
assert.True(t, errors.Is(err, tests.ErrFake))
assert.Nil(t, repos)
rm.AssertExpectations(t)
})
t.Run("get repositories by name", func(t *testing.T) {
t.Parallel()
// Setup expectations
rm := &repo.ManagerMock{}
rm.On("GetByName", ctx, "repo1", true).Return(repo1, nil)
rm.On("GetByName", ctx, "repo2", true).Return(repo2, nil)
// Run test and check expectations
cfg := viper.New()
cfg.Set("tracker.repositoriesNames", []string{"repo1", "repo2"})
repos, err := GetRepositories(ctx, cfg, rm)
assert.Nil(t, err)
assert.ElementsMatch(t, []*hub.Repository{repo1, repo2}, repos)
rm.AssertExpectations(t)
})
t.Run("error getting kind from name", func(t *testing.T) {
t.Parallel()
cfg := viper.New()
cfg.Set("tracker.repositoriesKinds", []string{"invalid"})
repos, err := GetRepositories(ctx, cfg, nil)
assert.Error(t, err)
assert.Nil(t, repos)
})
t.Run("error getting repository by kind", func(t *testing.T) {
t.Parallel()
// Setup expectations
rm := &repo.ManagerMock{}
rm.On("Search", ctx, &hub.SearchRepositoryInput{
Kinds: []hub.RepositoryKind{hub.Helm},
IncludeCredentials: true,
}).Return(nil, tests.ErrFake)
// Run test and check expectations
cfg := viper.New()
cfg.Set("tracker.repositoriesKinds", []string{"helm"})
repos, err := GetRepositories(ctx, cfg, rm)
assert.True(t, errors.Is(err, tests.ErrFake))
assert.Nil(t, repos)
rm.AssertExpectations(t)
})
t.Run("get repositories by kind", func(t *testing.T) {
t.Parallel()
// Setup expectations
rm := &repo.ManagerMock{}
rm.On("Search", ctx, &hub.SearchRepositoryInput{
Kinds: []hub.RepositoryKind{hub.Helm, hub.OLM},
IncludeCredentials: true,
}).Return(&hub.SearchRepositoryResult{
Repositories: []*hub.Repository{repo1, repo2},
}, nil)
// Run test and check expectations
cfg := viper.New()
cfg.Set("tracker.repositoriesKinds", []string{"helm", "olm"})
repos, err := GetRepositories(ctx, cfg, rm)
assert.Nil(t, err)
assert.ElementsMatch(t, []*hub.Repository{repo1, repo2}, repos)
rm.AssertExpectations(t)
})
t.Run("names have preference over kinds when both are provided", func(t *testing.T) {
t.Parallel()
// Setup expectations
rm := &repo.ManagerMock{}
rm.On("GetByName", ctx, "repo1", true).Return(repo1, nil)
rm.On("GetByName", ctx, "repo2", true).Return(repo2, nil)
// Run test and check expectations
cfg := viper.New()
cfg.Set("tracker.repositoriesNames", []string{"repo1", "repo2"})
cfg.Set("tracker.repositoriesKinds", []string{"helm", "olm"})
repos, err := GetRepositories(ctx, cfg, rm)
assert.Nil(t, err)
assert.ElementsMatch(t, []*hub.Repository{repo1, repo2}, repos)
rm.AssertExpectations(t)
})
t.Run("error getting all repositories", func(t *testing.T) {
t.Parallel()
// Setup expectations
rm := &repo.ManagerMock{}
rm.On("Search", ctx, &hub.SearchRepositoryInput{
IncludeCredentials: true,
}).Return(nil, tests.ErrFake)
// Run test and check expectations
cfg := viper.New()
repos, err := GetRepositories(ctx, cfg, rm)
assert.True(t, errors.Is(err, tests.ErrFake))
assert.Nil(t, repos)
rm.AssertExpectations(t)
})
t.Run("get all repositories", func(t *testing.T) {
t.Parallel()
// Setup expectations
rm := &repo.ManagerMock{}
rm.On("Search", ctx, &hub.SearchRepositoryInput{
IncludeCredentials: true,
}).Return(&hub.SearchRepositoryResult{
Repositories: []*hub.Repository{repo1, repo2, repo3},
}, nil)
// Run test and check expectations
cfg := viper.New()
repos, err := GetRepositories(ctx, cfg, rm)
assert.Nil(t, err)
assert.ElementsMatch(t, []*hub.Repository{repo1, repo2}, repos) // repo3 is disabled
rm.AssertExpectations(t)
})
}
func TestSetupSource(t *testing.T) {
testCases := []struct {
r *hub.Repository
expectedType string
}{
{
&hub.Repository{
Kind: hub.Falco,
URL: cloudNativeSecurityHub,
},
"*falco.TrackerSource",
},
{
&hub.Repository{
Kind: hub.Falco,
},
"*generic.TrackerSource",
},
{
&hub.Repository{
Kind: hub.Helm,
},
"*helm.TrackerSource",
},
{
&hub.Repository{
Kind: hub.HelmPlugin,
},
"*helmplugin.TrackerSource",
},
{
&hub.Repository{
Kind: hub.Krew,
},
"*krew.TrackerSource",
},
{
&hub.Repository{
Kind: hub.OLM,
},
"*olm.TrackerSource",
},
{
&hub.Repository{
Kind: hub.OPA,
},
"*generic.TrackerSource",
},
{
&hub.Repository{
Kind: hub.TBAction,
},
"*generic.TrackerSource",
},
{
&hub.Repository{
Kind: hub.TektonTask,
},
"*tekton.TrackerSource",
},
}
for i, tc := range testCases {
tc := tc
t.Run(fmt.Sprintf("Test case %d", i), func(t *testing.T) {
t.Parallel()
i := &hub.TrackerSourceInput{
Repository: tc.r,
Svc: &hub.TrackerSourceServices{
Op: &oci.PullerMock{},
},
}
source := SetupSource(i)
assert.Equal(t, tc.expectedType, reflect.TypeOf(source).String())
})
}
}
func TestSetVerifiedPublisherFlag(t *testing.T) {
ctx := context.Background()
// Setup some services required by tests
repo1ID := "00000000-0000-0000-0000-000000000001"
t.Run("verified publisher flag set to true successfully (remote url)", func(t *testing.T) {
t.Parallel()
// Setup expectations
r := &hub.Repository{
RepositoryID: repo1ID,
VerifiedPublisher: false,
}
md := &hub.RepositoryMetadata{
RepositoryID: r.RepositoryID,
}
rm := &repo.ManagerMock{}
rm.On("SetVerifiedPublisher", ctx, r.RepositoryID, true).Return(nil)
// Run test and check expectations
err := setVerifiedPublisherFlag(ctx, rm, r, md)
assert.Nil(t, err)
rm.AssertExpectations(t)
})
t.Run("verified publisher flag not set as it was already true", func(t *testing.T) {
t.Parallel()
// Setup expectations
r := &hub.Repository{
RepositoryID: repo1ID,
VerifiedPublisher: true,
}
md := &hub.RepositoryMetadata{
RepositoryID: r.RepositoryID,
}
rm := &repo.ManagerMock{}
// Run test and check expectations
err := setVerifiedPublisherFlag(ctx, rm, r, md)
assert.Nil(t, err)
rm.AssertExpectations(t)
})
t.Run("verified publisher flag not set: it was false and md file did not exist", func(t *testing.T) {
t.Parallel()
// Setup expectations
r := &hub.Repository{
RepositoryID: repo1ID,
VerifiedPublisher: false,
}
rm := &repo.ManagerMock{}
// Run test and check expectations
err := setVerifiedPublisherFlag(ctx, rm, r, nil)
assert.Nil(t, err)
rm.AssertExpectations(t)
})
t.Run("verified publisher flag set to false: it was true and md file did not exist", func(t *testing.T) {
t.Parallel()
// Setup expectations
r := &hub.Repository{
RepositoryID: repo1ID,
VerifiedPublisher: true,
}
rm := &repo.ManagerMock{}
rm.On("SetVerifiedPublisher", ctx, r.RepositoryID, false).Return(nil)
// Run test and check expectations
err := setVerifiedPublisherFlag(ctx, rm, r, nil)
assert.Nil(t, err)
rm.AssertExpectations(t)
})
t.Run("set verified publisher flag failed", func(t *testing.T) {
t.Parallel()
// Setup expectations
r := &hub.Repository{
RepositoryID: repo1ID,
VerifiedPublisher: false,
}
md := &hub.RepositoryMetadata{
RepositoryID: r.RepositoryID,
}
rm := &repo.ManagerMock{}
rm.On("SetVerifiedPublisher", ctx, r.RepositoryID, true).Return(tests.ErrFake)
// Run test and check expectations
err := setVerifiedPublisherFlag(ctx, rm, r, md)
assert.True(t, errors.Is(err, tests.ErrFake))
rm.AssertExpectations(t)
})
}
func TestShouldIgnorePackage(t *testing.T) {
testCases := []struct {
md *hub.RepositoryMetadata
name string
version string
expectedResult bool
}{
{
&hub.RepositoryMetadata{
Ignore: []*hub.RepositoryIgnoreEntry{
{
Name: "pkg1",
},
},
},
"pkg1",
"",
true,
},
{
&hub.RepositoryMetadata{
Ignore: []*hub.RepositoryIgnoreEntry{
{
Name: "pkg1",
},
},
},
"pkg1",
"1.0.0",
true,
},
{
&hub.RepositoryMetadata{
Ignore: []*hub.RepositoryIgnoreEntry{
{
Name: "pkg2",
},
},
},
"pkg1",
"1.0.0",
false,
},
{
&hub.RepositoryMetadata{
Ignore: []*hub.RepositoryIgnoreEntry{},
},
"pkg1",
"1.0.0",
false,
},
{
nil,
"pkg1",
"1.0.0",
false,
},
{
&hub.RepositoryMetadata{
Ignore: []*hub.RepositoryIgnoreEntry{
{
Name: "pkg1",
Version: "beta",
},
},
},
"pkg1",
"1.0.0-beta1",
true,
},
{
&hub.RepositoryMetadata{
Ignore: []*hub.RepositoryIgnoreEntry{
{
Name: "pkg1",
Version: "1.0.0",
},
},
},
"pkg1",
"1.0.0",
true,
},
{
&hub.RepositoryMetadata{
Ignore: []*hub.RepositoryIgnoreEntry{
{
Name: "pkg1",
Version: "1.0.0",
},
},
},
"pkg1",
"1.0.1",
false,
},
}
for i, tc := range testCases {
tc := tc
t.Run(fmt.Sprintf("Test case %d", i), func(t *testing.T) {
t.Parallel()
result := shouldIgnorePackage(tc.md, tc.name, tc.version)
assert.Equal(t, tc.expectedResult, result)
})
}
}