blob: 085d4e5f20009070cca821f7f74d40a628a2bb1f [file]
/*
Copyright © 2021 Aspect Build Systems Inc
Not licensed for re-use.
*/
package clean_test
import (
"fmt"
"io/ioutil"
"os"
"strings"
"testing"
"github.com/golang/mock/gomock"
. "github.com/onsi/gomega"
"github.com/spf13/viper"
"aspect.build/cli/pkg/aspect/clean"
"aspect.build/cli/pkg/bazel/mock"
"aspect.build/cli/pkg/ioutils"
)
type confirm struct{}
func (p confirm) Run() (string, error) {
return "", nil
}
type deny struct{}
func (p deny) Run() (string, error) {
return "", fmt.Errorf("said no")
}
type chooseReclaim struct{}
func (p chooseReclaim) Run() (int, string, error) {
return 0, clean.ReclaimOption, nil
}
type chooseNonIncremental struct{}
func (p chooseNonIncremental) Run() (int, string, error) {
return 2, clean.NonIncrementalOption, nil
}
type chooseInvalidateRepos struct{}
func (p chooseInvalidateRepos) Run() (int, string, error) {
return 3, clean.InvalidateReposOption, nil
}
type chooseWorkaround struct{}
func (p chooseWorkaround) Run() (int, string, error) {
return 4, clean.WorkaroundOption, nil
}
func TestClean(t *testing.T) {
t.Run("clean calls bazel clean", func(t *testing.T) {
g := NewGomegaWithT(t)
ctrl := gomock.NewController(t)
defer ctrl.Finish()
spawner := mock.NewMockSpawner(ctrl)
spawner.
EXPECT().
Spawn([]string{"clean"}).
Return(0, nil)
b := clean.New(ioutils.Streams{}, spawner, false)
g.Expect(b.Run(nil, []string{})).Should(Succeed())
})
t.Run("clean expunge calls bazel clean expunge", func(t *testing.T) {
g := NewGomegaWithT(t)
ctrl := gomock.NewController(t)
defer ctrl.Finish()
spawner := mock.NewMockSpawner(ctrl)
spawner.
EXPECT().
Spawn([]string{"clean", "--expunge"}).
Return(0, nil)
b := clean.New(ioutils.Streams{}, spawner, false)
b.Expunge = true
g.Expect(b.Run(nil, []string{})).Should(Succeed())
})
t.Run("clean expunge_async calls bazel clean expunge_async", func(t *testing.T) {
g := NewGomegaWithT(t)
ctrl := gomock.NewController(t)
defer ctrl.Finish()
spawner := mock.NewMockSpawner(ctrl)
spawner.
EXPECT().
Spawn([]string{"clean", "--expunge_async"}).
Return(0, nil)
b := clean.New(ioutils.Streams{}, spawner, false)
b.ExpungeAsync = true
g.Expect(b.Run(nil, []string{})).Should(Succeed())
})
t.Run("interactive clean prompts for usage, option 1", func(t *testing.T) {
g := NewGomegaWithT(t)
ctrl := gomock.NewController(t)
defer ctrl.Finish()
spawner := mock.NewMockSpawner(ctrl)
spawner.
EXPECT().
Spawn([]string{"clean"}).
Return(0, nil)
var stdout strings.Builder
streams := ioutils.Streams{Stdout: &stdout}
b := clean.New(streams, spawner, true)
b.Behavior = chooseReclaim{}
b.Remember = deny{}
g.Expect(b.Run(nil, []string{})).Should(Succeed())
g.Expect(stdout.String()).To(ContainSubstring("skip this prompt"))
})
t.Run("interactive clean prompts for usage, option 1 and save", func(t *testing.T) {
g := NewGomegaWithT(t)
ctrl := gomock.NewController(t)
defer ctrl.Finish()
spawner := mock.NewMockSpawner(ctrl)
spawner.
EXPECT().
Spawn([]string{"clean"}).
Return(0, nil).AnyTimes()
var stdout strings.Builder
streams := ioutils.Streams{Stdout: &stdout}
b := clean.New(streams, spawner, true)
viper := *viper.New()
cfg, err := os.CreateTemp(os.Getenv("TEST_TMPDIR"), "cfg***.ini")
g.Expect(err).To(BeNil())
viper.SetConfigFile(cfg.Name())
b.Behavior = chooseReclaim{}
b.Remember = confirm{}
b.Prefs = viper
g.Expect(b.Run(nil, []string{})).Should(Succeed())
g.Expect(stdout.String()).To(ContainSubstring("skip this prompt"))
// Recorded your preference for next time
content, err := ioutil.ReadFile(cfg.Name())
g.Expect(err).To(BeNil())
g.Expect(string(content)).To(Equal("[clean]\nskip_prompt=true\n\n"))
// If we run it again, there should be no prompt
c := clean.New(streams, spawner, true)
c.Prefs = viper
g.Expect(c.Run(nil, []string{})).Should(Succeed())
})
t.Run("interactive clean prompts for usage, option 2", func(t *testing.T) {
g := NewGomegaWithT(t)
var stdout strings.Builder
streams := ioutils.Streams{Stdout: &stdout}
c := clean.New(streams, nil, true)
c.Behavior = chooseNonIncremental{}
g.Expect(c.Run(nil, []string{})).Should(Succeed())
g.Expect(stdout.String()).To(ContainSubstring("use the --output_base flag"))
})
t.Run("interactive clean prompts for usage, option 3", func(t *testing.T) {
g := NewGomegaWithT(t)
var stdout strings.Builder
streams := ioutils.Streams{Stdout: &stdout}
c := clean.New(streams, nil, true)
c.Behavior = chooseInvalidateRepos{}
g.Expect(c.Run(nil, []string{})).Should(Succeed())
g.Expect(stdout.String()).To(ContainSubstring("aspect sync --configure"))
})
t.Run("interactive clean prompts for usage, option 5", func(t *testing.T) {
g := NewGomegaWithT(t)
ctrl := gomock.NewController(t)
defer ctrl.Finish()
spawner := mock.NewMockSpawner(ctrl)
spawner.
EXPECT().
Spawn([]string{"clean"}).
Return(0, nil)
var stdout strings.Builder
streams := ioutils.Streams{Stdout: &stdout}
c := clean.New(streams, spawner, true)
c.Behavior = chooseWorkaround{}
c.Workaround = confirm{}
g.Expect(c.Run(nil, []string{})).Should(Succeed())
g.Expect(stdout.String()).To(ContainSubstring("recommend you file a bug"))
})
}