From 115de1a813b34f145b0c8f42f02e64a1fb8e5681 Mon Sep 17 00:00:00 2001 From: Tayler Geiger Date: Fri, 19 Apr 2024 21:28:08 -0500 Subject: [PATCH] Add more tests Added list, prune, disable, and remove tests. --- .vscode/launch.json | 2 +- cmd/disable.go | 11 ++- cmd/disable_test.go | 68 +++++++++++++++++++ cmd/enable_test.go | 3 - cmd/list.go | 22 +++--- cmd/list_test.go | 45 ++++++++++++ cmd/prune.go | 2 - cmd/prune_test.go | 53 +++++++++++++++ cmd/remove.go | 11 ++- cmd/remove_test.go | 58 ++++++++++++++++ ...cloud.org:bieszczaders:kernel-cachyos.repo | 10 +++ ...infracloud.org:kylegospo:bazzite-copy.repo | 10 +++ ...nfracloud.org:kylegospo:bazzite-copy2.repo | 10 +++ internal/app/copr-repo.go | 6 +- internal/app/util.go | 4 +- 15 files changed, 286 insertions(+), 29 deletions(-) create mode 100644 cmd/disable_test.go create mode 100644 cmd/list_test.go create mode 100644 cmd/prune_test.go create mode 100644 cmd/remove_test.go create mode 100644 cmd/test/enabled/_copr:copr.fedorainfracloud.org:bieszczaders:kernel-cachyos.repo create mode 100644 cmd/test/enabled/_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy.repo create mode 100644 cmd/test/enabled/_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy2.repo diff --git a/.vscode/launch.json b/.vscode/launch.json index 6731fc3..76bb340 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ "version": "0.2.0", "configurations": [ { - "name": "Test enable", + "name": "Test", "type": "go", "request": "launch", "mode": "test", diff --git a/cmd/disable.go b/cmd/disable.go index 95e5fb8..a43da5f 100644 --- a/cmd/disable.go +++ b/cmd/disable.go @@ -6,7 +6,6 @@ package cmd import ( "fmt" "io" - "os" "github.com/spf13/afero" "github.com/spf13/cobra" @@ -23,11 +22,11 @@ func NewDisableCmd(fs afero.Fs, out io.Writer) *cobra.Command { repo, err := app.NewCoprRepo(arg) if err != nil { fmt.Fprintln(out, err) - } - err = app.ToggleRepo(repo, fs, out, app.Disabled) - if err != nil { - app.SudoMessage(err, out) - os.Exit(1) + } else { + err = app.ToggleRepo(repo, fs, out, app.Disabled) + if err != nil { + app.SudoMessage(err, out) + } } } }, diff --git a/cmd/disable_test.go b/cmd/disable_test.go new file mode 100644 index 0000000..03612e2 --- /dev/null +++ b/cmd/disable_test.go @@ -0,0 +1,68 @@ +package cmd + +import ( + "bytes" + "testing" + + "github.com/trgeiger/copr-tool/internal/testutil" +) + +func TestDisableCmd(t *testing.T) { + tests := []struct { + name string + args []string + repoFiles [][]string // format: file/reponame, test directory folder + otherFiles [][]string // format: filename, path, test directory folder + expected string + }{ + { + name: "Disable invalid repo name", + args: []string{ + "copr-tool", + }, + expected: "invalid repository name: copr-tool\n", + }, + { + name: "Repo does not exist", + args: []string{ + "example/example", + }, + expected: "repository example/example is not installed\n", + }, + { + name: "Repo already exists and already disabled", + args: []string{ + "kylegospo/bazzite", + }, + repoFiles: [][]string{ + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite.repo", "disabled"}, + }, + expected: "Repository kylegospo/bazzite is already disabled.\n", + }, + { + name: "Repo already exists but not disabled", + args: []string{ + "kylegospo/bazzite", + }, + repoFiles: [][]string{ + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite.repo", "enabled"}, + }, + expected: "Repository kylegospo/bazzite disabled.\n", + }, + } + + for _, test := range tests { + + b := new(bytes.Buffer) + fs := testutil.AssembleTestFs(test.repoFiles, test.otherFiles) + cmd := NewDisableCmd(fs, b) + cmd.SetOut(b) + cmd.SetArgs(test.args) + + cmd.Execute() + + if b.String() != test.expected { + t.Fatalf("Test \"%s\" failed", test.name) + } + } +} diff --git a/cmd/enable_test.go b/cmd/enable_test.go index b256727..8b0d4eb 100644 --- a/cmd/enable_test.go +++ b/cmd/enable_test.go @@ -2,7 +2,6 @@ package cmd import ( "bytes" - "fmt" "testing" "github.com/trgeiger/copr-tool/internal/testutil" @@ -82,8 +81,6 @@ func TestEnableCmd(t *testing.T) { cmd.Execute() - outB := b.String() - fmt.Print(outB) if b.String() != test.expected { t.Fatalf("Test: \"%s\" failed", test.name) } diff --git a/cmd/list.go b/cmd/list.go index 6d8d5a0..1dd0fbd 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -27,16 +27,20 @@ func NewListCmd(fs afero.Fs, out io.Writer) *cobra.Command { if err != nil { fmt.Fprintf(out, "Error when retrieving locally installed repositories: %s", err) } - showDupesMessage := false - for _, r := range repos { - r.FindLocalFiles(fs) - if len(r.LocalFiles) > 1 { - showDupesMessage = true + if len(repos) == 0 { + fmt.Fprintln(out, "No installed Copr repositories.") + } else { + showDupesMessage := false + for _, r := range repos { + r.FindLocalFiles(fs) + if len(r.LocalFiles) > 1 { + showDupesMessage = true + } + fmt.Fprintln(out, r.Name()) + } + if showDupesMessage { + fmt.Fprintln(out, "\nDuplicate entries found. Consider running the prune command.") } - fmt.Fprintln(out, r.Name()) - } - if showDupesMessage { - fmt.Fprintln(out, "\nDuplicate entries found. Consider running the prune command.") } }, } diff --git a/cmd/list_test.go b/cmd/list_test.go new file mode 100644 index 0000000..26cccd8 --- /dev/null +++ b/cmd/list_test.go @@ -0,0 +1,45 @@ +package cmd + +import ( + "bytes" + "testing" + + "github.com/trgeiger/copr-tool/internal/testutil" +) + +func TestListCmd(t *testing.T) { + tests := []struct { + name string + repoFiles [][]string // format: file/reponame, test directory folder + otherFiles [][]string // format: filename, path, test directory folder + expected string + }{ + { + name: "List existing repos", + repoFiles: [][]string{ + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite.repo", "enabled"}, + {"_copr:copr.fedorainfracloud.org:bieszczaders:kernel-cachyos.repo", "enabled"}, + }, + expected: "bieszczaders/kernel-cachyos\nkylegospo/bazzite\n", + }, + { + name: "No repos to list", + expected: "No installed Copr repositories.\n", + }, + } + + for _, test := range tests { + + b := new(bytes.Buffer) + fs := testutil.AssembleTestFs(test.repoFiles, test.otherFiles) + cmd := NewListCmd(fs, b) + cmd.SetOut(b) + + cmd.Execute() + + if b.String() != test.expected { + t.Fatalf("Test \"%s\" failed", test.name) + } + } + +} diff --git a/cmd/prune.go b/cmd/prune.go index e6675e5..c1d93a5 100644 --- a/cmd/prune.go +++ b/cmd/prune.go @@ -46,10 +46,8 @@ func NewPruneCmd(fs afero.Fs, out io.Writer) *cobra.Command { pruneCount++ } else if pruned && err != nil { fmt.Fprintf(out, "Pruning attempted on %s but encountered error: %s", r.Name(), err) - os.Exit(1) } else if err != nil { fmt.Fprintf(out, "Error encountered: %s", err) - os.Exit(1) } } if pruneCount == 0 { diff --git a/cmd/prune_test.go b/cmd/prune_test.go new file mode 100644 index 0000000..8aeabbf --- /dev/null +++ b/cmd/prune_test.go @@ -0,0 +1,53 @@ +package cmd + +import ( + "bytes" + "testing" + + "github.com/trgeiger/copr-tool/internal/testutil" +) + +func TestPruneCmd(t *testing.T) { + tests := []struct { + name string + repoFiles [][]string // format: file/reponame, test directory folder + otherFiles [][]string // format: filename, path, test directory folder + expected string + }{ + { + name: "No repositories installed", + expected: "Nothing to prune.\n", + }, + { + name: "Remove 1 duplicate", + repoFiles: [][]string{ + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite.repo", "enabled"}, + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy.repo", "enabled"}, + }, + expected: "Removed 1 duplicate entry for kylegospo/bazzite.\n", + }, + { + name: "Remove multiple duplicates", + repoFiles: [][]string{ + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite.repo", "enabled"}, + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy.repo", "enabled"}, + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy2.repo", "enabled"}, + }, + expected: "Removed 2 duplicate entries for kylegospo/bazzite.\n", + }, + } + + for _, test := range tests { + + b := new(bytes.Buffer) + fs := testutil.AssembleTestFs(test.repoFiles, test.otherFiles) + cmd := NewPruneCmd(fs, b) + cmd.SetOut(b) + + cmd.Execute() + + if b.String() != test.expected { + t.Fatalf("Test \"%s\" failed", test.name) + } + } +} diff --git a/cmd/remove.go b/cmd/remove.go index e81dde0..9d75e08 100644 --- a/cmd/remove.go +++ b/cmd/remove.go @@ -6,7 +6,6 @@ package cmd import ( "fmt" "io" - "os" "github.com/spf13/afero" "github.com/spf13/cobra" @@ -24,11 +23,11 @@ func NewRemoveCmd(fs afero.Fs, out io.Writer) *cobra.Command { repo, err := app.NewCoprRepo(arg) if err != nil { fmt.Fprintln(out, err) - } - err = app.DeleteRepo(repo, fs, out) - if err != nil { - app.SudoMessage(err, out) - os.Exit(1) + } else { + err = app.DeleteRepo(repo, fs, out) + if err != nil { + app.SudoMessage(err, out) + } } } }, diff --git a/cmd/remove_test.go b/cmd/remove_test.go new file mode 100644 index 0000000..a4048bd --- /dev/null +++ b/cmd/remove_test.go @@ -0,0 +1,58 @@ +package cmd + +import ( + "bytes" + "testing" + + "github.com/trgeiger/copr-tool/internal/testutil" +) + +func TestRemoveCmd(t *testing.T) { + tests := []struct { + name string + args []string + repoFiles [][]string // format: file/reponame, test directory folder + otherFiles [][]string // format: filename, path, test directory folder + expected string + }{ + { + name: "Remove invalid repo name", + args: []string{ + "copr-tool", + }, + expected: "invalid repository name: copr-tool\n", + }, + { + name: "Remove uninstalled repo", + args: []string{ + "example/example", + }, + expected: "Repository example/example does not exist locally. Nothing to delete.\n", + }, + { + name: "Remove installed repo", + args: []string{ + "kylegospo/bazzite", + }, + repoFiles: [][]string{ + {"_copr:copr.fedorainfracloud.org:kylegospo:bazzite.repo", "enabled"}, + }, + expected: "Repository kylegospo/bazzite deleted.\n", + }, + } + + for _, test := range tests { + + b := new(bytes.Buffer) + fs := testutil.AssembleTestFs(test.repoFiles, test.otherFiles) + cmd := NewRemoveCmd(fs, b) + cmd.SetOut(b) + cmd.SetArgs(test.args) + + cmd.Execute() + + if b.String() != test.expected { + t.Fatalf("Test \"%s\" failed", test.name) + } + } +} diff --git a/cmd/test/enabled/_copr:copr.fedorainfracloud.org:bieszczaders:kernel-cachyos.repo b/cmd/test/enabled/_copr:copr.fedorainfracloud.org:bieszczaders:kernel-cachyos.repo new file mode 100644 index 0000000..d273a03 --- /dev/null +++ b/cmd/test/enabled/_copr:copr.fedorainfracloud.org:bieszczaders:kernel-cachyos.repo @@ -0,0 +1,10 @@ +[copr:copr.fedorainfracloud.org:bieszczaders:kernel-cachyos] +name=Copr repo for kernel-cachyos owned by bieszczaders +baseurl=https://download.copr.fedorainfracloud.org/results/bieszczaders/kernel-cachyos/fedora-$releasever-$basearch/ +type=rpm-md +skip_if_unavailable=True +gpgcheck=1 +gpgkey=https://download.copr.fedorainfracloud.org/results/bieszczaders/kernel-cachyos/pubkey.gpg +repo_gpgcheck=0 +enabled=1 +enabled_metadata=1 diff --git a/cmd/test/enabled/_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy.repo b/cmd/test/enabled/_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy.repo new file mode 100644 index 0000000..6db2e69 --- /dev/null +++ b/cmd/test/enabled/_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy.repo @@ -0,0 +1,10 @@ +[copr:copr.fedorainfracloud.org:kylegospo:bazzite] +name=Copr repo for bazzite owned by kylegospo +baseurl=https://download.copr.fedorainfracloud.org/results/kylegospo/bazzite/fedora-$releasever-$basearch/ +type=rpm-md +skip_if_unavailable=True +gpgcheck=1 +gpgkey=https://download.copr.fedorainfracloud.org/results/kylegospo/bazzite/pubkey.gpg +repo_gpgcheck=0 +enabled=1 +enabled_metadata=1 diff --git a/cmd/test/enabled/_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy2.repo b/cmd/test/enabled/_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy2.repo new file mode 100644 index 0000000..6db2e69 --- /dev/null +++ b/cmd/test/enabled/_copr:copr.fedorainfracloud.org:kylegospo:bazzite-copy2.repo @@ -0,0 +1,10 @@ +[copr:copr.fedorainfracloud.org:kylegospo:bazzite] +name=Copr repo for bazzite owned by kylegospo +baseurl=https://download.copr.fedorainfracloud.org/results/kylegospo/bazzite/fedora-$releasever-$basearch/ +type=rpm-md +skip_if_unavailable=True +gpgcheck=1 +gpgkey=https://download.copr.fedorainfracloud.org/results/kylegospo/bazzite/pubkey.gpg +repo_gpgcheck=0 +enabled=1 +enabled_metadata=1 diff --git a/internal/app/copr-repo.go b/internal/app/copr-repo.go index e21a38c..b677a8f 100644 --- a/internal/app/copr-repo.go +++ b/internal/app/copr-repo.go @@ -112,7 +112,11 @@ func (c *CoprRepo) PruneDuplicates(fs afero.Fs, out io.Writer) (bool, error) { //TODO remove the element from LocalFiles } } - fmt.Fprintf(out, "Pruned %d duplicate entries for %s\n", pruneCount, c.Name()) + if pruneCount == 1 { + fmt.Fprintf(out, "Removed 1 duplicate entry for %s.\n", c.Name()) + } else if pruneCount > 1 { + fmt.Fprintf(out, "Removed %d duplicate entries for %s.\n", pruneCount, c.Name()) + } return true, nil } return false, nil diff --git a/internal/app/util.go b/internal/app/util.go index be9e36a..d0dd4c9 100644 --- a/internal/app/util.go +++ b/internal/app/util.go @@ -55,6 +55,9 @@ func ToggleRepo(r *CoprRepo, fs afero.Fs, out io.Writer, desiredState RepoState) repoFile := r.LocalFilePath() contents, err := afero.ReadFile(fs, repoFile) if err != nil { + if errors.Is(err, afero.ErrFileNotFound) { + return fmt.Errorf("repository %s/%s is not installed", r.User, r.Project) + } return err } fileLines := strings.Split(string(contents), "\n") @@ -134,7 +137,6 @@ func GetAllRepos(fs afero.Fs, out io.Writer) ([]*CoprRepo, error) { for scanner.Scan() { if strings.Contains(scanner.Text(), "[copr:copr") { t := strings.Split(strings.Trim(scanner.Text(), "[]"), ":") - // r, _ := app.NewCoprRepo(t[len(t)-2] + "/" + t[len(t)-1]) repoName := t[len(t)-2] + "/" + t[len(t)-1] if !slices.Contains(reposStrings, repoName) { r, err := NewCoprRepo(repoName)