gitlink-cli/shortcuts/issue/batch_test.go

137 lines
3.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package issue
import (
"os"
"path/filepath"
"reflect"
"testing"
"github.com/gitlink-org/gitlink-cli/shortcuts/common"
)
func TestParseIssueNumbers(t *testing.T) {
got, err := parseIssueNumbers("1, 2,2, 3")
if err != nil {
t.Fatalf("parseIssueNumbers returned error: %v", err)
}
want := []string{"1", "2", "3"}
if !reflect.DeepEqual(got, want) {
t.Fatalf("parseIssueNumbers() = %#v, want %#v", got, want)
}
}
func TestParseIssueNumbersRejectsInvalidNumber(t *testing.T) {
if _, err := parseIssueNumbers("1,abc"); err == nil {
t.Fatal("parseIssueNumbers() expected an error for a non-integer issue number")
}
}
func TestReadCSVWithNumberHeader(t *testing.T) {
path := writeTempCSV(t, "title,number,state\nfirst,12,open\nsecond,13,open\n")
headers, rows, err := ReadCSV(path)
if err != nil {
t.Fatalf("ReadCSV returned error: %v", err)
}
col := FindColumn(headers, "number", "issue_number", "project_issues_index")
if col == -1 {
t.Fatal("column 'number' not found")
}
numbers := make([]string, 0, len(rows))
for _, row := range rows {
numbers = append(numbers, row[col])
}
numbers, err = normalizeIssueNumbers(numbers)
if err != nil {
t.Fatalf("normalizeIssueNumbers returned error: %v", err)
}
want := []string{"12", "13"}
if !reflect.DeepEqual(numbers, want) {
t.Fatalf("got %#v, want %#v", numbers, want)
}
}
func TestReadCSVWithProjectIssuesIndexHeader(t *testing.T) {
path := writeTempCSV(t, "title,project_issues_index,state\nfirst,12,open\nsecond,13,open\n")
headers, rows, err := ReadCSV(path)
if err != nil {
t.Fatalf("ReadCSV returned error: %v", err)
}
col := FindColumn(headers, "number", "issue_number", "project_issues_index")
if col == -1 {
t.Fatal("column 'project_issues_index' not found")
}
numbers := make([]string, 0, len(rows))
for _, row := range rows {
numbers = append(numbers, row[col])
}
numbers, err = normalizeIssueNumbers(numbers)
if err != nil {
t.Fatalf("normalizeIssueNumbers returned error: %v", err)
}
want := []string{"12", "13"}
if !reflect.DeepEqual(numbers, want) {
t.Fatalf("got %#v, want %#v", numbers, want)
}
}
func TestReadCSVHeaderlessReturnsNoColumnMatch(t *testing.T) {
path := writeTempCSV(t, "21,open\n22,closed\n21,duplicate\n")
headers, rows, err := ReadCSV(path)
if err != nil {
t.Fatalf("ReadCSV returned error: %v", err)
}
// 无表头时 FindColumn 返回 -1
col := FindColumn(headers, "number", "issue_number", "project_issues_index")
if col != -1 {
t.Fatalf("expected -1 for headerless CSV, got %d", col)
}
// 退回到首列index 0作为 issue 编号来源
col = 0
numbers := make([]string, 0, len(rows))
for _, row := range rows {
numbers = append(numbers, row[col])
}
numbers, err = normalizeIssueNumbers(numbers)
if err != nil {
t.Fatalf("normalizeIssueNumbers returned error: %v", err)
}
want := []string{"22", "21"}
if !reflect.DeepEqual(numbers, want) {
t.Fatalf("got %#v, want %#v", numbers, want)
}
}
func TestResolveIssueNumbersMergesCLIAndCSV(t *testing.T) {
path := writeTempCSV(t, "number\n2\n3\n")
ctx := &common.RuntimeContext{
Owner: "owner",
Repo: "repo",
}
got, err := ResolveIssueNumbers(ctx, "1,2", path, "")
if err != nil {
t.Fatalf("ResolveIssueNumbers returned error: %v", err)
}
want := []string{"1", "2", "3"}
if !reflect.DeepEqual(got, want) {
t.Fatalf("ResolveIssueNumbers() = %#v, want %#v", got, want)
}
}
func TestParseBool(t *testing.T) {
if !parseBool("true") {
t.Fatal("parseBool(true) = false, want true")
}
if parseBool("") {
t.Fatal("parseBool(empty) = true, want false")
}
}
func writeTempCSV(t *testing.T, content string) string {
t.Helper()
path := filepath.Join(t.TempDir(), "issues.csv")
if err := os.WriteFile(path, []byte(content), 0o600); err != nil {
t.Fatalf("write temp csv: %v", err)
}
return path
}