Skip to content
This repository was archived by the owner on Jul 12, 2022. It is now read-only.

Added tests to update repo command #515

Merged
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions pkg/cmd/mocks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -515,3 +515,16 @@ func (c ConfigRunnerMock) Create(runType formula.RunnerType) error {
func (c ConfigRunnerMock) Find() (formula.RunnerType, error) {
return c.runType, c.findErr
}

type RepositoryListUpdaterCustomMock struct {
list func() (formula.Repos, error)
update func(name formula.RepoName, version formula.RepoVersion) error
}

func (m RepositoryListUpdaterCustomMock) List() (formula.Repos, error) {
return m.list()
}

func (m RepositoryListUpdaterCustomMock) Update(name formula.RepoName, version formula.RepoVersion) error {
return m.update(name, version)
}
13 changes: 8 additions & 5 deletions pkg/cmd/update_repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package cmd
import (
"fmt"
"net/http"
"os"

"github.com/spf13/cobra"

Expand All @@ -28,6 +27,11 @@ import (
"github.com/ZupIT/ritchie-cli/pkg/stdin"
)

const (
questionSelectARepo = "Select a repository to update: "
questionAVersion = "Select your new version: "
)

type updateRepoCmd struct {
client *http.Client
repo formula.RepositoryListUpdater
Expand Down Expand Up @@ -86,7 +90,7 @@ func (up updateRepoCmd) runPrompt() CommandRunnerFunc {
reposName = append(reposName, repos[i].Name.String())
}

name, err := up.List("Select a repository to update: ", reposName)
name, err := up.List(questionSelectARepo, reposName)
if err != nil {
return err
}
Expand All @@ -107,7 +111,7 @@ func (up updateRepoCmd) runPrompt() CommandRunnerFunc {
return err
}

version, err := up.List("Select your new version:", tags.Names())
version, err := up.List(questionAVersion, tags.Names())
if err != nil {
return err
}
Expand All @@ -127,8 +131,7 @@ func (up updateRepoCmd) runStdin() CommandRunnerFunc {
return func(cmd *cobra.Command, args []string) error {
r := formula.Repo{}

err := stdin.ReadJson(os.Stdin, &r)
if err != nil {
if err := stdin.ReadJson(cmd.InOrStdin(), &r); err != nil {
return err
}

Expand Down
256 changes: 256 additions & 0 deletions pkg/cmd/update_repo_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
/*
* Copyright 2020 ZUP IT SERVICOS EM TECNOLOGIA E INOVACAO SA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package cmd

import (
"encoding/json"
"errors"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"

"github.com/ZupIT/ritchie-cli/pkg/formula"
"github.com/ZupIT/ritchie-cli/pkg/git"
"github.com/ZupIT/ritchie-cli/pkg/git/github"
"github.com/ZupIT/ritchie-cli/pkg/prompt"
)

func Test_NewUpdateRepoCmd(t *testing.T) {
someError := errors.New("some error")

repoTest := &formula.Repo{
Provider: "Github",
Name: "someRepo1",
Version: "1.0.0",
Url: "https://github.com/owner/repo",
Token: "token",
Priority: 2,
}

type in struct {
repo formula.RepositoryListUpdater
inList prompt.InputList
Repos git.Repositories
}
var tests = []struct {
name string
in in
wantErr bool
inputStdin string
}{
{
name: "success case",
in: in{
repo: RepositoryListUpdaterCustomMock{
list: func() (formula.Repos, error) {
return formula.Repos{*repoTest}, nil
},
update: func(name formula.RepoName, version formula.RepoVersion) error {
return nil
},
},
inList: inputListCustomMock{
list: func(name string, items []string) (string, error) {
if name == questionSelectARepo {
return "someRepo1", nil
}
if name == questionAVersion {
return "1.0.0", nil
}
return "any", nil
},
},
Repos: defaultGitRepositoryMock,
},
wantErr: false,
inputStdin: createJSONEntry(repoTest),
},
{
name: "fails when repo list returns an error",
in: in{
repo: RepositoryListUpdaterCustomMock{
list: func() (formula.Repos, error) {
return formula.Repos{}, someError
},
update: func(name formula.RepoName, version formula.RepoVersion) error {
return nil
},
},
inList: inputListMock{},
Repos: defaultGitRepositoryMock,
},
wantErr: true,
inputStdin: "",
},
{
name: "fails when question about select repo returns an error",
in: in{
repo: RepositoryListUpdaterCustomMock{
list: func() (formula.Repos, error) {
return formula.Repos{*repoTest}, nil
},
update: func(name formula.RepoName, version formula.RepoVersion) error {
return nil
},
},
inList: inputListCustomMock{
list: func(name string, items []string) (string, error) {
if name == questionSelectARepo {
return "", someError
}
return "any", nil
},
},
Repos: defaultGitRepositoryMock,
},
wantErr: true,
inputStdin: "",
},
{
name: "fails when repos tags returns an error",
in: in{
repo: RepositoryListUpdaterCustomMock{
list: func() (formula.Repos, error) {
return formula.Repos{*repoTest}, nil
},
update: func(name formula.RepoName, version formula.RepoVersion) error {
return nil
},
},
inList: inputListCustomMock{
list: func(name string, items []string) (string, error) {
if name == questionSelectARepo {
return "someRepo1", nil
}
if name == questionAVersion {
return "1.0.0", nil
}
return "any", nil
},
},
Repos: GitRepositoryMock{
latestTag: func(info git.RepoInfo) (git.Tag, error) {
return git.Tag{}, nil
},
tags: func(info git.RepoInfo) (git.Tags, error) {
return git.Tags{}, someError
},
zipball: func(info git.RepoInfo, version string) (io.ReadCloser, error) {
return nil, nil
},
},
},
wantErr: true,
inputStdin: "",
},
{
name: "fails when question about select version returns an error",
in: in{
repo: RepositoryListUpdaterCustomMock{
list: func() (formula.Repos, error) {
return formula.Repos{*repoTest}, nil
},
update: func(name formula.RepoName, version formula.RepoVersion) error {
return nil
},
},
inList: inputListCustomMock{
list: func(name string, items []string) (string, error) {
if name == questionSelectARepo {
return "someRepo1", nil
}
if name == questionAVersion {
return "", someError
}
return "any", nil
},
},
Repos: defaultGitRepositoryMock,
},
wantErr: true,
inputStdin: "",
},
{
name: "fails when repo update returns an error",
in: in{
repo: RepositoryListUpdaterCustomMock{
list: func() (formula.Repos, error) {
return formula.Repos{*repoTest}, nil
},
update: func(name formula.RepoName, version formula.RepoVersion) error {
return someError
},
},
inList: inputListCustomMock{
list: func(name string, items []string) (string, error) {
if name == questionSelectARepo {
return "someRepo1", nil
}
if name == questionAVersion {
return "1.0.0", nil
}
return "any", nil
},
},
Repos: defaultGitRepositoryMock,
},
wantErr: true,
inputStdin: createJSONEntry(repoTest),
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
server := serverMock()
defer server.Close()

repoProviders := formula.NewRepoProviders()
repoProviders.Add("Github", formula.Git{Repos: tt.in.Repos, NewRepoInfo: github.NewRepoInfo})

newUpdateRepoPrompt := NewUpdateRepoCmd(server.Client(), tt.in.repo, repoProviders, inputTextMock{}, inputPasswordMock{}, inputURLMock{}, tt.in.inList, inputTrueMock{}, inputIntMock{})
newUpdateRepoStdin := NewUpdateRepoCmd(server.Client(), tt.in.repo, repoProviders, inputTextMock{}, inputPasswordMock{}, inputURLMock{}, tt.in.inList, inputTrueMock{}, inputIntMock{})

newUpdateRepoPrompt.PersistentFlags().Bool("stdin", false, "input by stdin")
newUpdateRepoStdin.PersistentFlags().Bool("stdin", true, "input by stdin")

newReader := strings.NewReader(tt.inputStdin)
newUpdateRepoStdin.SetIn(newReader)

if err := newUpdateRepoPrompt.Execute(); (err != nil) != tt.wantErr {
t.Errorf("Prompt command error = %v, wantErr %v", err, tt.wantErr)
}

itsTestCaseWithStdin := tt.inputStdin != ""
if err := newUpdateRepoStdin.Execute(); (err != nil) != tt.wantErr && itsTestCaseWithStdin {
t.Errorf("Stdin command error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}

func serverMock() *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}))
}

func createJSONEntry(v interface{}) string {
s, _ := json.Marshal(v)
return string(s)
}