Skip to content

Commit cacc03b

Browse files
authored
fix: sort errors before printing them (#520)
1 parent f3eda84 commit cacc03b

File tree

2 files changed

+128
-1
lines changed

2 files changed

+128
-1
lines changed

internal/multigitter/repocounter/counter.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package repocounter
22

33
import (
44
"fmt"
5+
"maps"
6+
"slices"
57
"strings"
68
"sync"
79

@@ -68,7 +70,10 @@ func (r *Counter) Info() string {
6870

6971
var exitInfo string
7072

71-
for errMsg := range r.errors {
73+
errors := slices.Collect(maps.Keys(r.errors))
74+
slices.Sort(errors)
75+
76+
for _, errMsg := range errors {
7277
exitInfo += fmt.Sprintf("%s:\n", strings.ToUpper(errMsg[0:1])+errMsg[1:])
7378
for _, errInfo := range r.errors[errMsg] {
7479
if errInfo.pullRequest == nil {
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package repocounter_test
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"strings"
7+
"testing"
8+
9+
"github.com/lindell/multi-gitter/internal/multigitter/repocounter"
10+
"github.com/lindell/multi-gitter/internal/scm"
11+
"github.com/lindell/multi-gitter/tests/vcmock"
12+
)
13+
14+
func fakeRepo(i int) vcmock.Repository {
15+
return vcmock.Repository{
16+
OwnerName: fmt.Sprintf("owner-%d", i),
17+
RepoName: fmt.Sprintf("repo-%d", i),
18+
}
19+
}
20+
21+
func fakePR(i int) vcmock.PullRequest {
22+
return vcmock.PullRequest{
23+
PRStatus: scm.PullRequestStatusPending,
24+
PRNumber: 42,
25+
Merged: false,
26+
Repository: fakeRepo(i),
27+
}
28+
}
29+
30+
func TestCounter_Info(t *testing.T) {
31+
tests := []struct {
32+
name string
33+
changeFn func(r *repocounter.Counter)
34+
want string
35+
}{
36+
{
37+
name: "empty",
38+
want: "",
39+
changeFn: func(r *repocounter.Counter) {},
40+
},
41+
{
42+
name: "one success",
43+
changeFn: func(r *repocounter.Counter) {
44+
r.AddSuccessRepositories(fakeRepo(1))
45+
},
46+
want: `
47+
Repositories with a successful run:
48+
owner-1/repo-1
49+
`,
50+
},
51+
{
52+
name: "one success with pr",
53+
changeFn: func(r *repocounter.Counter) {
54+
r.AddSuccessPullRequest(fakeRepo(1), fakePR(1))
55+
},
56+
want: `
57+
Repositories with a successful run:
58+
owner-1/repo-1 #42
59+
`,
60+
},
61+
{
62+
name: "one error no pr",
63+
changeFn: func(r *repocounter.Counter) {
64+
r.AddError(errors.New("test error"), fakeRepo(1), nil)
65+
},
66+
want: `
67+
Test error:
68+
owner-1/repo-1
69+
`,
70+
},
71+
{
72+
name: "one error with pr",
73+
changeFn: func(r *repocounter.Counter) {
74+
r.AddError(errors.New("test error"), fakeRepo(1), fakePR(1))
75+
},
76+
want: `
77+
Test error:
78+
owner-1/repo-1 #42
79+
`,
80+
},
81+
{
82+
name: "one error with pr",
83+
changeFn: func(r *repocounter.Counter) {
84+
r.AddError(errors.New("test error"), fakeRepo(1), fakePR(1))
85+
},
86+
want: `
87+
Test error:
88+
owner-1/repo-1 #42
89+
`,
90+
},
91+
{
92+
name: "multiple",
93+
changeFn: func(r *repocounter.Counter) {
94+
r.AddError(errors.New("test error"), fakeRepo(1), fakePR(1))
95+
r.AddSuccessPullRequest(fakeRepo(2), fakePR(2))
96+
r.AddSuccessPullRequest(fakeRepo(3), fakePR(3))
97+
r.AddError(errors.New("test error 2"), fakeRepo(5), fakePR(5))
98+
r.AddError(errors.New("test error"), fakeRepo(4), fakePR(4))
99+
},
100+
want: `
101+
Test error:
102+
owner-1/repo-1 #42
103+
owner-4/repo-4 #42
104+
Test error 2:
105+
owner-5/repo-5 #42
106+
Repositories with a successful run:
107+
owner-2/repo-2 #42
108+
owner-3/repo-3 #42
109+
`,
110+
},
111+
}
112+
for _, tt := range tests {
113+
t.Run(tt.name, func(t *testing.T) {
114+
r := repocounter.NewCounter()
115+
tt.changeFn(r)
116+
117+
if got := r.Info(); got != strings.TrimLeft(tt.want, "\n") {
118+
t.Errorf("Counter.Info() = %v, want %v", got, tt.want)
119+
}
120+
})
121+
}
122+
}

0 commit comments

Comments
 (0)