detached 6135dd5

test(mr): close linked issues when a merge request auto-merges

commit
6135dd51e565e014733437cd74457f6dfef45a53
author
brice · · 2026-10-21 04:22 UTC
parent
4b10ba7
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
checks
7/8
1 file · +27 -0
M internal/usecase/issue_links_test.go +27 -0
@@ -11,8 +11,10 @@ import (
1111
1212 "bnema.dev/ermite/internal/domain"
1313 "bnema.dev/ermite/internal/ports"
14+ "bnema.dev/ermite/internal/ports/mocks"
1415 "bnema.dev/ermite/internal/usecase"
1516 "github.com/stretchr/testify/assert"
17+ "github.com/stretchr/testify/mock"
1618 "github.com/stretchr/testify/require"
1719 )
1820
@@ -233,3 +235,28 @@ func TestIssueLinksMergeReindexesRequestsWhoseSourceMoved(t *testing.T) {
233235 require.Len(t, after, 1)
234236 assert.Equal(t, issue.Number, after[0].Issue)
235237 }
238+
239+func TestAutoMergeClosesLinkedIssue(t *testing.T) {
240+ r, _, issues := linkedRig(t)
241+ issue, err := issues.Create(r.ctx, root, r.repo, ports.CreateIssueParams{Title: "bug"})
242+ require.NoError(t, err)
243+ r.feature("feat")
244+ mr, err := r.mrs.Create(r.ctx, root, r.repo, ports.CreateMergeRequestParams{Title: "fix", Source: "feat", Description: fmt.Sprintf("closes #%d", issue.Number)})
245+ require.NoError(t, err)
246+ _, err = r.repos.Update(r.ctx, root, r.repo, ports.UpdateRepoParams{AllowAutoMerge: ptr(true)})
247+ require.NoError(t, err)
248+ checks := mocks.NewCIChecksReader(t)
249+ r.mrs.SetChecks(checks)
250+ enableAuto(t, r, mr)
251+ checks.EXPECT().CommitChecks(mock.Anything, r.repo, r.head().String()).Return([]domain.CICheck{{Status: domain.CICompleted, Conclusion: domain.CISuccess}}, nil).Twice()
252+ a := autoEvaluator(r, checks, nil, nil)
253+ defer a.Close(r.ctx)
254+ require.True(t, a.Evaluate(r.repo))
255+ r.mrs.Wait(r.ctx)
256+ merged := storedAuto(t, r, mr)
257+ require.Equal(t, domain.MRStateMerged, merged.State)
258+ require.True(t, merged.AutoMerged)
259+ got, err := issues.Get(r.ctx, root, r.repo, issue.Number)
260+ require.NoError(t, err)
261+ assert.False(t, got.Issue.IsOpen())
262+}
@@ -11,8 +11,10 @@ import (
11 11
12 "bnema.dev/ermite/internal/domain"12 "bnema.dev/ermite/internal/domain"
13 "bnema.dev/ermite/internal/ports"13 "bnema.dev/ermite/internal/ports"
14+ "bnema.dev/ermite/internal/ports/mocks"
14 "bnema.dev/ermite/internal/usecase"15 "bnema.dev/ermite/internal/usecase"
15 "github.com/stretchr/testify/assert"16 "github.com/stretchr/testify/assert"
17+ "github.com/stretchr/testify/mock"
16 "github.com/stretchr/testify/require"18 "github.com/stretchr/testify/require"
17 )19 )
18 20
@@ -233,3 +235,28 @@ func TestIssueLinksMergeReindexesRequestsWhoseSourceMoved(t *testing.T) {
233 require.Len(t, after, 1)235 require.Len(t, after, 1)
234 assert.Equal(t, issue.Number, after[0].Issue)236 assert.Equal(t, issue.Number, after[0].Issue)
235 }237 }
238+
239+func TestAutoMergeClosesLinkedIssue(t *testing.T) {
240+ r, _, issues := linkedRig(t)
241+ issue, err := issues.Create(r.ctx, root, r.repo, ports.CreateIssueParams{Title: "bug"})
242+ require.NoError(t, err)
243+ r.feature("feat")
244+ mr, err := r.mrs.Create(r.ctx, root, r.repo, ports.CreateMergeRequestParams{Title: "fix", Source: "feat", Description: fmt.Sprintf("closes #%d", issue.Number)})
245+ require.NoError(t, err)
246+ _, err = r.repos.Update(r.ctx, root, r.repo, ports.UpdateRepoParams{AllowAutoMerge: ptr(true)})
247+ require.NoError(t, err)
248+ checks := mocks.NewCIChecksReader(t)
249+ r.mrs.SetChecks(checks)
250+ enableAuto(t, r, mr)
251+ checks.EXPECT().CommitChecks(mock.Anything, r.repo, r.head().String()).Return([]domain.CICheck{{Status: domain.CICompleted, Conclusion: domain.CISuccess}}, nil).Twice()
252+ a := autoEvaluator(r, checks, nil, nil)
253+ defer a.Close(r.ctx)
254+ require.True(t, a.Evaluate(r.repo))
255+ r.mrs.Wait(r.ctx)
256+ merged := storedAuto(t, r, mr)
257+ require.Equal(t, domain.MRStateMerged, merged.State)
258+ require.True(t, merged.AutoMerged)
259+ got, err := issues.Get(r.ctx, root, r.repo, issue.Number)
260+ require.NoError(t, err)
261+ assert.False(t, got.Issue.IsOpen())
262+}

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 3

Tags 43

↑↓ moveenter openesc close