jira-cli/internal/view/issue_test.go

313 lines
11 KiB
Go
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package view
import (
"bytes"
"testing"
"github.com/stretchr/testify/assert"
"github.com/ankitpokhrel/jira-cli/pkg/adf"
"github.com/ankitpokhrel/jira-cli/pkg/jira"
"github.com/ankitpokhrel/jira-cli/pkg/tui"
)
func TestIssueDetailsRenderInPlainView(t *testing.T) {
t.Parallel()
var b bytes.Buffer
data := &jira.Issue{
Key: "TEST-1",
Fields: jira.IssueFields{
Summary: "This is a test",
Resolution: struct {
Name string `json:"name"`
}{Name: "Fixed"},
Description: &adf.ADF{
Version: 1,
DocType: "doc",
Content: []*adf.Node{
{
NodeType: "paragraph",
Content: []*adf.Node{
{NodeType: "text", NodeValue: adf.NodeValue{Text: "Test description"}},
},
},
},
},
IssueType: jira.IssueType{Name: "Bug"},
Assignee: struct {
Name string `json:"displayName"`
}{Name: "Person A"},
Priority: struct {
Name string `json:"name"`
}{Name: "High"},
Reporter: struct {
Name string `json:"displayName"`
}{Name: "Person Z"},
Status: struct {
Name string `json:"name"`
}{Name: "Done"},
Components: []struct {
Name string `json:"name"`
}{{Name: "BE"}, {Name: "FE"}},
Comment: struct {
Comments []struct {
ID string `json:"id"`
Author jira.User `json:"author"`
Body interface{} `json:"body"`
Created string `json:"created"`
} `json:"comments"`
Total int `json:"total"`
}{Total: 0},
Watches: struct {
IsWatching bool `json:"isWatching"`
WatchCount int `json:"watchCount"`
}{IsWatching: true, WatchCount: 4},
Created: "2020-12-13T14:05:20.974+0100",
Updated: "2020-12-13T14:07:20.974+0100",
},
}
issue := Issue{
Server: "https://test.local",
Data: data,
Display: DisplayFormat{Plain: true},
}
expected := "🐞 Bug ✅ Done ⌛ Sun, 13 Dec 20 👷 Person A 🔑️ TEST-1 💭 0 comments \U0001F9F5 0 linked\n# This is a test\n⏱ Sun, 13 Dec 20 🔎 Person Z 🚀 High 📦 BE, FE 🏷️ None 👀 You + 3 watchers\n\n------------------------ Description ------------------------\n\nTest description\n\n\n"
if xterm256() {
expected += "\x1b[38;5;242mView this issue on Jira: https://test.local/browse/TEST-1\x1b[m"
} else {
expected += "\x1b[0;90mView this issue on Jira: https://test.local/browse/TEST-1\x1b[0m"
}
actual := issue.String()
assert.NoError(t, issue.renderPlain(&b))
assert.Equal(t, tui.TextData(expected), tui.TextData(actual))
}
func TestIssueDetailsWithV2Description(t *testing.T) {
t.Parallel()
var b bytes.Buffer
data := &jira.Issue{
Key: "TEST-1",
Fields: jira.IssueFields{
Summary: "This is a test",
Resolution: struct {
Name string `json:"name"`
}{Name: "Fixed"},
Description: "h1. Title\nh2. Subtitle\n\nThis is a *bold* and _italic_ text with [a link|https://ankit.pl] in between.",
IssueType: jira.IssueType{Name: "Bug"},
Assignee: struct {
Name string `json:"displayName"`
}{Name: "Person A"},
Priority: struct {
Name string `json:"name"`
}{Name: "High"},
Reporter: struct {
Name string `json:"displayName"`
}{Name: "Person Z"},
Status: struct {
Name string `json:"name"`
}{Name: "Done"},
Components: []struct {
Name string `json:"name"`
}{{Name: "BE"}, {Name: "FE"}},
Comment: struct {
Comments []struct {
ID string `json:"id"`
Author jira.User `json:"author"`
Body interface{} `json:"body"`
Created string `json:"created"`
} `json:"comments"`
Total int `json:"total"`
}{
Comments: []struct {
ID string `json:"id"`
Author jira.User `json:"author"`
Body interface{} `json:"body"`
Created string `json:"created"`
}{
{ID: "10033", Author: jira.User{Name: "Person A"}, Body: "Test comment A", Created: "2021-11-22T23:44:13.782+0100"},
{ID: "10034", Author: jira.User{Name: "Person B"}, Body: "Test comment B", Created: "2021-11-23T23:44:13.782+0100"},
{ID: "10035", Author: jira.User{Name: "Person C"}, Body: "Test comment C", Created: "2021-11-24T23:44:13.782+0100"},
},
Total: 3,
},
Subtasks: []jira.Issue{
{
Key: "TEST-2",
Fields: jira.IssueFields{
Summary: "Subtask 1",
Status: struct {
Name string `json:"name"`
}{Name: "TO DO"},
Priority: struct {
Name string `json:"name"`
}{Name: "High"},
},
},
{
Key: "TEST-3",
Fields: jira.IssueFields{
Summary: "Subtask 2",
Status: struct {
Name string `json:"name"`
}{Name: "Done"},
Priority: struct {
Name string `json:"name"`
}{Name: "Normal"},
},
},
},
IssueLinks: []struct {
ID string `json:"id"`
LinkType struct {
Name string `json:"name"`
Inward string `json:"inward"`
Outward string `json:"outward"`
} `json:"type"`
InwardIssue *jira.Issue `json:"inwardIssue,omitempty"`
OutwardIssue *jira.Issue `json:"outwardIssue,omitempty"`
}{
{
LinkType: struct {
Name string `json:"name"`
Inward string `json:"inward"`
Outward string `json:"outward"`
}{Name: "blocks", Inward: "blocks", Outward: "is blocked by"},
InwardIssue: &jira.Issue{
Key: "TEST-2",
Fields: jira.IssueFields{
Summary: "Something is broken",
IssueType: jira.IssueType{Name: "Bug"},
Priority: struct {
Name string `json:"name"`
}{Name: "High"}, Status: struct {
Name string `json:"name"`
}{Name: "TO DO"},
},
},
},
{
LinkType: struct {
Name string `json:"name"`
Inward string `json:"inward"`
Outward string `json:"outward"`
}{Name: "relates", Inward: "relates", Outward: "relates to"},
OutwardIssue: &jira.Issue{
Key: "TEST-3",
Fields: jira.IssueFields{
Summary: "Everything is on fire",
IssueType: jira.IssueType{Name: "Bug"},
Priority: struct {
Name string `json:"name"`
}{Name: "Urgent"}, Status: struct {
Name string `json:"name"`
}{Name: "Done"},
},
},
},
},
Created: "2020-12-13T14:05:20.974+0100",
Updated: "2020-12-13T14:07:20.974+0100",
},
}
issue := Issue{
Server: "https://test.local",
Data: data,
Display: DisplayFormat{Plain: true},
Options: IssueOption{NumComments: 2},
}
assert.NoError(t, issue.renderPlain(&b))
expected := "🐞 Bug ✅ Done ⌛ Sun, 13 Dec 20 👷 Person A 🔑️ TEST-1 💭 3 comments \U0001F9F5 2 linked\n# This is a test\n⏱ Sun, 13 Dec 20 🔎 Person Z 🚀 High 📦 BE, FE 🏷️ None 👀 0 watchers\n\n------------------------ Description ------------------------\n\n# Title\n## Subtitle\nThis is a **bold** and _italic_ text with [a link](https://ankit.pl) in between.\n\n\n------------------------ 2 Subtasks ------------------------\n\n\n SUBTASKS\n\n TEST-2 Subtask 1 • High • TO DO\n TEST-3 Subtask 2 • Normal • Done \n\n\n\n------------------------ Linked Issues ------------------------\n\n\n BLOCKS\n\n TEST-2 Something is broken • Bug • High • TO DO\n\n RELATES TO\n\n TEST-3 Everything is on fire • Bug • Urgent • Done \n\n\n\n------------------------ 3 Comments ------------------------\n\n\n Person C • Wed, 24 Nov 21 • Latest comment\n\nTest comment C\n\n\n\n Person B • Tue, 23 Nov 21\n\nTest comment B\n\n"
if xterm256() {
expected += "\x1b[38;5;242mUse --comments <limit> with `jira issue view` to load more comments\x1b[m\n\n"
expected += "\x1b[38;5;242mView this issue on Jira: https://test.local/browse/TEST-1\x1b[m"
} else {
expected += "\x1b[0;90mUse --comments <limit> with `jira issue view` to load more comments\x1b[0m\n\n"
expected += "\x1b[0;90mView this issue on Jira: https://test.local/browse/TEST-1\x1b[0m"
}
actual := issue.String()
assert.Equal(t, tui.TextData(expected), tui.TextData(actual))
}
func TestSeparator(t *testing.T) {
t.Parallel()
cases := []struct {
name string
body string
plain bool
expected string
expected256 string
}{
{
name: "it returns straight horizontal bar for empty message",
body: "",
expected: "\x1b[0;90m————————————————————————————————————————————————\x1b[0m",
expected256: "\x1b[38;5;242m————————————————————————————————————————————————\x1b[m",
},
{
name: "it returns raw horizontal bar for empty message in plain output",
body: "",
plain: true,
expected: "------------------------------------------------",
expected256: "------------------------------------------------",
},
{
name: "it returns greyed out message wrapped in horizontal bar",
body: "Some text",
expected: "\x1b[0;90m———————————————————————— Some text ————————————————————————\x1b[0m",
expected256: "\x1b[38;5;242m———————————————————————— Some text ————————————————————————\x1b[m",
},
{
name: "it returns greyed out message wrapped in raw horizontal bar for plain output",
body: "Some text",
plain: true,
expected: "------------------------ Some text ------------------------",
expected256: "------------------------ Some text ------------------------",
},
{
name: "it doesn't trim spaces",
body: " ",
expected: "\x1b[0;90m———————————————————————— ————————————————————————\x1b[0m",
expected256: "\x1b[38;5;242m———————————————————————— ————————————————————————\x1b[m",
},
{
name: "it doesn't trim spaces for plain output",
body: " ",
plain: true,
expected: "------------------------ ------------------------",
expected256: "------------------------ ------------------------",
},
}
for _, tc := range cases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
issue := Issue{
Data: &jira.Issue{
Key: "TEST-1",
},
Display: DisplayFormat{Plain: tc.plain},
}
if xterm256() {
assert.Equal(t, tc.expected256, issue.separator(tc.body))
} else {
assert.Equal(t, tc.expected, issue.separator(tc.body))
}
})
}
}