186 lines
4.8 KiB
Go
186 lines
4.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/apex/log"
|
|
"github.com/stretchr/testify/assert"
|
|
"gitlab.com/unboundsoftware/apex-mocks"
|
|
|
|
"gitlab.com/unboundsoftware/gitlab-cleanup-handler/gitlab"
|
|
)
|
|
|
|
func Test_handle(t *testing.T) {
|
|
type args struct {
|
|
cli CLI
|
|
kubeClient func(t *testing.T) KubeClient
|
|
gitlabClient func(t *testing.T) GitlabClient
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
wantLogged []string
|
|
wantErr assert.ErrorAssertionFunc
|
|
}{
|
|
{
|
|
name: "unable to get images",
|
|
args: args{
|
|
cli: CLI{
|
|
Namespaces: []string{"default"},
|
|
},
|
|
kubeClient: func(t *testing.T) KubeClient {
|
|
return &MockKube{
|
|
GetFn: func(ctx context.Context, logger log.Interface, namespaces []string) (map[string][]string, error) {
|
|
assert.Equal(t, []string{"default"}, namespaces)
|
|
return nil, fmt.Errorf("error")
|
|
},
|
|
}
|
|
},
|
|
gitlabClient: func(t *testing.T) GitlabClient {
|
|
return nil
|
|
},
|
|
},
|
|
wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
|
|
return assert.EqualError(t, err, "error")
|
|
},
|
|
},
|
|
{
|
|
name: "unable to fetch tags",
|
|
args: args{
|
|
cli: CLI{
|
|
Namespaces: []string{"default"},
|
|
},
|
|
kubeClient: func(t *testing.T) KubeClient {
|
|
return &MockKube{
|
|
GetFn: func(ctx context.Context, logger log.Interface, namespaces []string) (map[string][]string, error) {
|
|
return map[string][]string{
|
|
"unboundsoftware/dummy": {"abc123"},
|
|
}, nil
|
|
},
|
|
}
|
|
},
|
|
gitlabClient: func(t *testing.T) GitlabClient {
|
|
return &MockGitlab{
|
|
TagsFn: func(image string) ([]gitlab.Tag, error) {
|
|
assert.Equal(t, "unboundsoftware/dummy", image)
|
|
return nil, fmt.Errorf("tags error")
|
|
},
|
|
}
|
|
},
|
|
},
|
|
wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
|
|
return assert.EqualError(t, err, "tags error")
|
|
},
|
|
},
|
|
{
|
|
name: "unable to update policy",
|
|
args: args{
|
|
cli: CLI{
|
|
Namespaces: []string{"default"},
|
|
},
|
|
kubeClient: func(t *testing.T) KubeClient {
|
|
return &MockKube{
|
|
GetFn: func(ctx context.Context, logger log.Interface, namespaces []string) (map[string][]string, error) {
|
|
return map[string][]string{
|
|
"unboundsoftware/dummy": {"abc123"},
|
|
}, nil
|
|
},
|
|
}
|
|
},
|
|
gitlabClient: func(t *testing.T) GitlabClient {
|
|
return &MockGitlab{
|
|
TagsFn: func(image string) ([]gitlab.Tag, error) {
|
|
return []gitlab.Tag{
|
|
{Name: "1.0"},
|
|
}, nil
|
|
},
|
|
UpdateFn: func(project string, versions []string) error {
|
|
assert.Equal(t, "unboundsoftware/dummy", project)
|
|
assert.Equal(t, []string{"abc123", "1.0"}, versions)
|
|
return fmt.Errorf("update error")
|
|
},
|
|
}
|
|
},
|
|
},
|
|
wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
|
|
return assert.EqualError(t, err, "update error")
|
|
},
|
|
},
|
|
{
|
|
name: "success",
|
|
args: args{
|
|
cli: CLI{
|
|
Namespaces: []string{"default"},
|
|
},
|
|
kubeClient: func(t *testing.T) KubeClient {
|
|
return &MockKube{
|
|
GetFn: func(ctx context.Context, logger log.Interface, namespaces []string) (map[string][]string, error) {
|
|
return map[string][]string{
|
|
"unboundsoftware/dummy": {"abc123"},
|
|
}, nil
|
|
},
|
|
}
|
|
},
|
|
gitlabClient: func(t *testing.T) GitlabClient {
|
|
return &MockGitlab{
|
|
TagsFn: func(image string) ([]gitlab.Tag, error) {
|
|
return []gitlab.Tag{
|
|
{Name: "1.0"},
|
|
}, nil
|
|
},
|
|
UpdateFn: func(project string, versions []string) error {
|
|
return nil
|
|
},
|
|
}
|
|
},
|
|
},
|
|
wantErr: assert.NoError,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
logger := apex.New()
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
kubeClient := tt.args.kubeClient(t)
|
|
gitlabClient := tt.args.gitlabClient(t)
|
|
tt.wantErr(t, handle(tt.args.cli, logger, kubeClient, gitlabClient), fmt.Sprintf("handle(%v, %v, %v, %v)", tt.args.cli, logger, kubeClient, gitlabClient))
|
|
})
|
|
logger.Check(t, tt.wantLogged)
|
|
}
|
|
}
|
|
|
|
type MockKube struct {
|
|
GetFn func(ctx context.Context, logger log.Interface, namespaces []string) (map[string][]string, error)
|
|
}
|
|
|
|
func (m *MockKube) GetImages(ctx context.Context, logger log.Interface, namespaces []string) (map[string][]string, error) {
|
|
if m.GetFn == nil {
|
|
return nil, nil
|
|
}
|
|
return m.GetFn(ctx, logger, namespaces)
|
|
}
|
|
|
|
var _ KubeClient = &MockKube{}
|
|
|
|
type MockGitlab struct {
|
|
TagsFn func(image string) ([]gitlab.Tag, error)
|
|
UpdateFn func(project string, versions []string) error
|
|
}
|
|
|
|
func (m *MockGitlab) GetTags(image string) ([]gitlab.Tag, error) {
|
|
if m.TagsFn == nil {
|
|
return nil, nil
|
|
}
|
|
return m.TagsFn(image)
|
|
}
|
|
|
|
func (m *MockGitlab) UpdateCleanupPolicy(project string, versions []string) error {
|
|
if m.UpdateFn == nil {
|
|
return nil
|
|
}
|
|
return m.UpdateFn(project, versions)
|
|
}
|
|
|
|
var _ GitlabClient = &MockGitlab{}
|