detached 5cc8d13

style(issues): check kv close in history tests, tagged switches for issue transitions, parallel IsDone subtests

commit
5cc8d1392aaa82433bca8c75332d3ef25119a401
author
brice · · 2026-10-22 18:58 UTC
parent
300db63
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
checks
4/4
refs
feat/issue-resolved
3 files · +9 -6
M internal/adapters/kvstore/issue_history_internal_test.go +1 -1
@@ -14,7 +14,7 @@ func TestPreparedEventSequenceConflict(t *testing.T) {
1414 ctx := context.Background()
1515 db, err := kv.Open(ctx, t.TempDir(), kv.Options{})
1616 require.NoError(t, err)
17- defer db.Close(ctx)
17+ t.Cleanup(func() { require.NoError(t, db.Close(ctx)) })
1818 repo, err := domain.ParseRepoName("proj")
1919 require.NoError(t, err)
2020 events := []domain.IssueEvent{{Kind: domain.IssueEventClosed, MergeRequest: 9}}
@@ -14,7 +14,7 @@ func TestPreparedEventSequenceConflict(t *testing.T) {
14 ctx := context.Background()14 ctx := context.Background()
15 db, err := kv.Open(ctx, t.TempDir(), kv.Options{})15 db, err := kv.Open(ctx, t.TempDir(), kv.Options{})
16 require.NoError(t, err)16 require.NoError(t, err)
17- defer db.Close(ctx)17+ t.Cleanup(func() { require.NoError(t, db.Close(ctx)) })
18 repo, err := domain.ParseRepoName("proj")18 repo, err := domain.ParseRepoName("proj")
19 require.NoError(t, err)19 require.NoError(t, err)
20 events := []domain.IssueEvent{{Kind: domain.IssueEventClosed, MergeRequest: 9}}20 events := []domain.IssueEvent{{Kind: domain.IssueEventClosed, MergeRequest: 9}}
M internal/domain/issue_test.go +1 -0
@@ -141,6 +141,7 @@ func TestIssueIsDone(t *testing.T) {
141141 t.Parallel()
142142 for _, state := range []domain.IssueState{"", "unknown", domain.IssueStateOpen, domain.IssueStateClosed, domain.IssueStateResolved} {
143143 t.Run(string(state), func(t *testing.T) {
144+ t.Parallel()
144145 issue := domain.Issue{State: state}
145146 assert.Equal(t, state == domain.IssueStateClosed || state == domain.IssueStateResolved, issue.IsDone())
146147 assert.Equal(t, state == domain.IssueStateOpen, issue.IsOpen())
@@ -141,6 +141,7 @@ func TestIssueIsDone(t *testing.T) {
141 t.Parallel()141 t.Parallel()
142 for _, state := range []domain.IssueState{"", "unknown", domain.IssueStateOpen, domain.IssueStateClosed, domain.IssueStateResolved} {142 for _, state := range []domain.IssueState{"", "unknown", domain.IssueStateOpen, domain.IssueStateClosed, domain.IssueStateResolved} {
143 t.Run(string(state), func(t *testing.T) {143 t.Run(string(state), func(t *testing.T) {
144+ t.Parallel()
144 issue := domain.Issue{State: state}145 issue := domain.Issue{State: state}
145 assert.Equal(t, state == domain.IssueStateClosed || state == domain.IssueStateResolved, issue.IsDone())146 assert.Equal(t, state == domain.IssueStateClosed || state == domain.IssueStateResolved, issue.IsDone())
146 assert.Equal(t, state == domain.IssueStateOpen, issue.IsOpen())147 assert.Equal(t, state == domain.IssueStateOpen, issue.IsOpen())
M internal/usecase/issues.go +7 -5
@@ -277,10 +277,11 @@ func (i *Issues) transition(ctx context.Context, p domain.Principal, name domain
277277 }
278278 verb := "close"
279279 kind := domain.IssueEventClosed
280- if to == domain.IssueStateOpen {
280+ switch to {
281+ case domain.IssueStateOpen:
281282 verb = "reopen"
282283 kind = domain.IssueEventReopened
283- } else if to == domain.IssueStateResolved {
284+ case domain.IssueStateResolved:
284285 verb = "resolve"
285286 kind = domain.IssueEventResolved
286287 }
@@ -305,11 +306,12 @@ func (i *Issues) transition(ctx context.Context, p domain.Principal, name domain
305306 log.Info().Str("repo", name.String()).Int64("number", number).
306307 Str("principal", p.Label()).Str("token_id", p.TokenID()).Msg("issue " + verb + "d")
307308 recordActivity(ctx, i.meta, repo.Name, issue.UpdatedAt)
308- if to == domain.IssueStateOpen {
309+ switch to {
310+ case domain.IssueStateOpen:
309311 i.bus.Publish(ctx, domain.IssueReopened{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})
310- } else if to == domain.IssueStateResolved {
312+ case domain.IssueStateResolved:
311313 i.bus.Publish(ctx, domain.IssueResolved{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})
312- } else {
314+ default:
313315 i.bus.Publish(ctx, domain.IssueClosed{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})
314316 }
315317 return issue, nil
@@ -277,10 +277,11 @@ func (i *Issues) transition(ctx context.Context, p domain.Principal, name domain
277 }277 }
278 verb := "close"278 verb := "close"
279 kind := domain.IssueEventClosed279 kind := domain.IssueEventClosed
280- if to == domain.IssueStateOpen {280+ switch to {
281+ case domain.IssueStateOpen:
281 verb = "reopen"282 verb = "reopen"
282 kind = domain.IssueEventReopened283 kind = domain.IssueEventReopened
283- } else if to == domain.IssueStateResolved {284+ case domain.IssueStateResolved:
284 verb = "resolve"285 verb = "resolve"
285 kind = domain.IssueEventResolved286 kind = domain.IssueEventResolved
286 }287 }
@@ -305,11 +306,12 @@ func (i *Issues) transition(ctx context.Context, p domain.Principal, name domain
305 log.Info().Str("repo", name.String()).Int64("number", number).306 log.Info().Str("repo", name.String()).Int64("number", number).
306 Str("principal", p.Label()).Str("token_id", p.TokenID()).Msg("issue " + verb + "d")307 Str("principal", p.Label()).Str("token_id", p.TokenID()).Msg("issue " + verb + "d")
307 recordActivity(ctx, i.meta, repo.Name, issue.UpdatedAt)308 recordActivity(ctx, i.meta, repo.Name, issue.UpdatedAt)
308- if to == domain.IssueStateOpen {309+ switch to {
310+ case domain.IssueStateOpen:
309 i.bus.Publish(ctx, domain.IssueReopened{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})311 i.bus.Publish(ctx, domain.IssueReopened{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})
310- } else if to == domain.IssueStateResolved {312+ case domain.IssueStateResolved:
311 i.bus.Publish(ctx, domain.IssueResolved{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})313 i.bus.Publish(ctx, domain.IssueResolved{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})
312- } else {314+ default:
313 i.bus.Publish(ctx, domain.IssueClosed{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})315 i.bus.Publish(ctx, domain.IssueClosed{Issue: issue, At: issue.UpdatedAt, Visibility: repo.Visibility, CreatedAt: repo.CreatedAt})
314 }316 }
315 return issue, nil317 return issue, nil

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 4

Tags 45

↑↓ moveenter openesc close