mirror of https://github.com/artifacthub/hub.git
455 lines
10 KiB
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)
|
|
})
|
|
}
|
|
}
|