cli/commands/issue/view/issue_view_test.go

215 lines
5.1 KiB
Go

package view
import (
"bytes"
"fmt"
"os/exec"
"regexp"
"testing"
"time"
"gitlab.com/gitlab-org/cli/pkg/iostreams"
"github.com/acarl005/stripansi"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/xanzy/go-gitlab"
"gitlab.com/gitlab-org/cli/api"
"gitlab.com/gitlab-org/cli/commands/cmdtest"
"gitlab.com/gitlab-org/cli/commands/cmdutils"
"gitlab.com/gitlab-org/cli/internal/config"
"gitlab.com/gitlab-org/cli/internal/run"
mainTest "gitlab.com/gitlab-org/cli/test"
)
var (
stubFactory *cmdutils.Factory
stdout *bytes.Buffer
stderr *bytes.Buffer
)
func TestMain(m *testing.M) {
defer config.StubConfig(`---
hosts:
gitlab.com:
username: monalisa
token: OTOKEN
`, "")()
var io *iostreams.IOStreams
io, _, stdout, stderr = iostreams.Test()
stubFactory, _ = cmdtest.StubFactoryWithConfig("")
stubFactory.IO = io
stubFactory.IO.IsaTTY = true
stubFactory.IO.IsErrTTY = true
timer, _ := time.Parse(time.RFC3339, "2014-11-12T11:45:26.371Z")
api.GetIssue = func(client *gitlab.Client, projectID interface{}, issueID int) (*gitlab.Issue, error) {
if projectID == "" || projectID == "WRONG_REPO" || projectID == "expected_err" {
return nil, fmt.Errorf("error expected")
}
repo, err := stubFactory.BaseRepo()
if err != nil {
return nil, err
}
return &gitlab.Issue{
ID: issueID,
IID: issueID,
Title: "issueTitle",
Labels: gitlab.Labels{"test", "bug"},
State: "opened",
Description: "issueBody",
References: &gitlab.IssueReferences{
Full: fmt.Sprintf("%s#%d", repo.FullName(), issueID),
},
Milestone: &gitlab.Milestone{
Title: "MilestoneTitle",
},
Assignees: []*gitlab.IssueAssignee{
{
Username: "mona",
},
{
Username: "lisa",
},
},
Author: &gitlab.IssueAuthor{
ID: issueID,
Name: "John Dev Wick",
Username: "jdwick",
},
WebURL: fmt.Sprintf("https://%s/%s/-/issues/%d", repo.RepoHost(), repo.FullName(), issueID),
CreatedAt: &timer,
UserNotesCount: 2,
}, nil
}
cmdtest.InitTest(m, "mr_view_test")
}
func TestNewCmdView_web_numberArg(t *testing.T) {
cmd := NewCmdView(stubFactory)
cmdutils.EnableRepoOverride(cmd, stubFactory)
var seenCmd *exec.Cmd
restoreCmd := run.SetPrepareCmd(func(cmd *exec.Cmd) run.Runnable {
seenCmd = cmd
return &mainTest.OutputStub{}
})
defer restoreCmd()
_, err := cmdtest.RunCommand(cmd, "225 -w -R glab-cli/test")
if err != nil {
t.Error(err)
return
}
assert.Contains(t, stderr.String(), "Opening gitlab.com/glab-cli/test/-/issues/225 in your browser.")
assert.Equal(t, "", stdout.String())
if seenCmd == nil {
t.Log("expected a command to run")
}
stdout.Reset()
stderr.Reset()
}
func TestNewCmdView(t *testing.T) {
oldListIssueNotes := api.ListIssueNotes
timer, _ := time.Parse(time.RFC3339, "2014-11-12T11:45:26.371Z")
api.ListIssueNotes = func(client *gitlab.Client, projectID interface{}, issueID int, opts *gitlab.ListIssueNotesOptions) ([]*gitlab.Note, error) {
if projectID == "PROJECT_MR_WITH_EMPTY_NOTE" {
return []*gitlab.Note{}, nil
}
return []*gitlab.Note{
{
ID: 1,
Body: "Note Body",
Title: "Note Title",
Author: cmdtest.Author{
ID: 1,
Username: "johnwick",
Name: "John Wick",
},
System: false,
CreatedAt: &timer,
NoteableID: 0,
},
{
ID: 1,
Body: "Marked issue as stale",
Title: "",
Author: cmdtest.Author{
ID: 1,
Username: "johnwick",
Name: "John Wick",
},
System: true,
CreatedAt: &timer,
NoteableID: 0,
},
}, nil
}
t.Run("show", func(t *testing.T) {
cmd := NewCmdView(stubFactory)
cmdutils.EnableRepoOverride(cmd, stubFactory)
_, err := cmdtest.RunCommand(cmd, "13 -c -s -R glab-cli/test")
if err != nil {
t.Error(err)
return
}
out := stripansi.Strip(stdout.String())
outErr := stripansi.Strip(stderr.String())
stdout.Reset()
stderr.Reset()
require.Contains(t, out, "issueTitle #13")
require.Contains(t, out, "issueBody")
require.Equal(t, outErr, "")
assert.Contains(t, out, "https://gitlab.com/glab-cli/test/-/issues/13")
assert.Contains(t, out, "johnwick Marked issue as stale")
})
t.Run("no_tty", func(t *testing.T) {
stubFactory.IO.IsaTTY = false
stubFactory.IO.IsErrTTY = false
cmd := NewCmdView(stubFactory)
cmdutils.EnableRepoOverride(cmd, stubFactory)
_, err := cmdtest.RunCommand(cmd, "13 -c -s -R glab-cli/test")
if err != nil {
t.Error(err)
return
}
expectedOutputs := []string{
`title:\tissueTitle`,
`assignees:\tmona, lisa`,
`author:\tjdwick`,
`state:\topen`,
`comments:\t2`,
`labels:\ttest, bug`,
`milestone:\tMilestoneTitle\n`,
`--`,
`issueBody`,
}
out := stripansi.Strip(stdout.String())
outErr := stripansi.Strip(stderr.String())
cmdtest.Eq(t, outErr, "")
t.Helper()
var r *regexp.Regexp
for _, l := range expectedOutputs {
r = regexp.MustCompile(l)
if !r.MatchString(out) {
t.Errorf("output did not match regexp /%s/\n> output\n%s\n", r, out)
return
}
}
})
api.ListIssueNotes = oldListIssueNotes
}