From acc9a6f3a6df2961c3ae44352216d915cb9b5315 Mon Sep 17 00:00:00 2001 From: Michael Muré Date: Sat, 10 Sep 2022 11:09:19 +0200 Subject: commands: reorg into different packages --- commands/bug/bug_comment_test.go | 164 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 commands/bug/bug_comment_test.go (limited to 'commands/bug/bug_comment_test.go') diff --git a/commands/bug/bug_comment_test.go b/commands/bug/bug_comment_test.go new file mode 100644 index 00000000..c1dc9952 --- /dev/null +++ b/commands/bug/bug_comment_test.go @@ -0,0 +1,164 @@ +package bugcmd + +import ( + "fmt" + "io/ioutil" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/MichaelMure/git-bug/commands/bug/testenv" + "github.com/MichaelMure/git-bug/commands/cmdtest" + "github.com/MichaelMure/git-bug/commands/execenv" +) + +func TestBugComment(t *testing.T) { + const golden = "testdata/comment/message-only" + + env, bug := testenv.NewTestEnvAndBug(t) + + require.NoError(t, runBugComment(env, []string{bug.Human()})) + + requireCommentsEqual(t, golden, env) +} + +const gitDateFormat = "Mon Jan 2 15:04:05 2006 -0700" + +type parsedComment struct { + author string + id string + date time.Time + message string +} + +type parseFunc func(*parsedComment, string) + +type commentParser struct { + t *testing.T + fn parseFunc + comments []parsedComment +} + +func parseComments(t *testing.T, env *execenv.Env) []parsedComment { + t.Helper() + + parser := &commentParser{ + t: t, + comments: []parsedComment{}, + } + + comment := &parsedComment{} + parser.fn = parser.parseAuthor + + for _, line := range strings.Split(env.Out.String(), "\n") { + parser.fn(comment, line) + } + + parser.comments = append(parser.comments, *comment) + + return parser.comments +} + +func (p *commentParser) parseAuthor(comment *parsedComment, line string) { + p.t.Helper() + + tkns := strings.Split(line, ": ") + require.Len(p.t, tkns, 2) + require.Equal(p.t, "Author", tkns[0]) + + comment.author = tkns[1] + p.fn = p.parseID +} + +func (p *commentParser) parseID(comment *parsedComment, line string) { + p.t.Helper() + + tkns := strings.Split(line, ": ") + require.Len(p.t, tkns, 2) + require.Equal(p.t, "Id", tkns[0]) + + comment.id = tkns[1] + p.fn = p.parseDate +} + +func (p *commentParser) parseDate(comment *parsedComment, line string) { + p.t.Helper() + + tkns := strings.Split(line, ": ") + require.Len(p.t, tkns, 2) + require.Equal(p.t, "Date", tkns[0]) + + date, err := time.Parse(gitDateFormat, tkns[1]) + require.NoError(p.t, err) + + comment.date = date + p.fn = p.parseMessage +} + +func (p *commentParser) parseMessage(comment *parsedComment, line string) { + p.t.Helper() + + if strings.HasPrefix(line, "Author: ") { + p.comments = append(p.comments, *comment) + comment = &parsedComment{} + p.parseAuthor(comment, line) + + return + } + + require.True(p.t, line == "" || strings.HasPrefix(line, " ")) + + comment.message = strings.Join([]string{comment.message, line}, "\n") +} + +func normalizeParsedComments(t *testing.T, comments []parsedComment) []parsedComment { + t.Helper() + + prefix := 0x1234567 + date, err := time.Parse(gitDateFormat, "Fri Aug 19 07:00:00 2022 +1900") + require.NoError(t, err) + + var out []parsedComment + + for i, comment := range comments { + comment.id = fmt.Sprintf("%7x", prefix+i) + comment.date = date.Add(time.Duration(i) * time.Minute) + out = append(out, comment) + } + + return out +} + +func requireCommentsEqual(t *testing.T, golden string, env *execenv.Env) { + t.Helper() + + const goldenFilePattern = "%s-%d-golden.txt" + + comments := parseComments(t, env) + comments = normalizeParsedComments(t, comments) + + if *cmdtest.Update { + t.Log("Got here") + for i, comment := range comments { + fileName := fmt.Sprintf(goldenFilePattern, golden, i) + require.NoError(t, ioutil.WriteFile(fileName, []byte(comment.message), 0644)) + } + } + + prefix := 0x1234567 + date, err := time.Parse(gitDateFormat, "Fri Aug 19 07:00:00 2022 +1900") + require.NoError(t, err) + + for i, comment := range comments { + require.Equal(t, "John Doe", comment.author) + require.Equal(t, fmt.Sprintf("%7x", prefix+i), comment.id) + require.Equal(t, date.Add(time.Duration(i)*time.Minute), comment.date) + + fileName := fmt.Sprintf(goldenFilePattern, golden, i) + exp, err := ioutil.ReadFile(fileName) + require.NoError(t, err) + require.Equal(t, strings.ReplaceAll(string(exp), "\r", ""), strings.ReplaceAll(comment.message, "\r", "")) + } +} -- cgit