mergerequests_signatures_test.go RawHistoryFolder
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package usecase_test
4
5import (
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/mock"
10 "github.com/stretchr/testify/require"
11
12 "bnema.dev/ermite/internal/domain"
13 "bnema.dev/ermite/internal/ports"
14 "bnema.dev/ermite/internal/ports/mocks"
15)
16
17// ADR 0030: the commits of a merge request carry their signature state when a
18// verifier is set, in one call; without one they stay unchecked.
19func TestGetMergeRequestVerifiesItsCommits(t *testing.T) {
20 t.Parallel()
21 r := newMRRig(t)
22 r.seed()
23 head := r.feature("feat")
24 mr := r.open("feat")
25
26 d, err := r.mrs.Get(r.ctx, reader, r.repo, mr.Number, ports.GetMergeRequestOptions{})
27 require.NoError(t, err)
28 require.NotEmpty(t, d.Commits)
29 assert.Equal(t, domain.StatusUnchecked, d.Commits[0].Verification.Status, "no verifier: unchecked")
30
31 v := mocks.NewCommitVerifier(t)
32 want := domain.CommitVerification{Format: domain.FormatSSH, Status: domain.StatusVerified, KeyTitle: "laptop"}
33 v.EXPECT().VerifyCommits(mock.Anything, r.repo, mock.MatchedBy(func(cs []domain.Commit) bool {
34 return len(cs) == len(d.Commits) && cs[0].ID == head
35 })).Return(map[domain.ObjectID]domain.CommitVerification{head: want}).Once()
36 r.mrs.WithVerifier(v)
37
38 d, err = r.mrs.Get(r.ctx, reader, r.repo, mr.Number, ports.GetMergeRequestOptions{})
39 require.NoError(t, err)
40 assert.Equal(t, want, d.Commits[0].Verification)
41
42 // A diff-only read lists no commits and checks nothing.
43 d, err = r.mrs.Get(r.ctx, reader, r.repo, mr.Number, ports.GetMergeRequestOptions{DiffOnly: true})
44 require.NoError(t, err)
45 assert.Empty(t, d.Commits)
46}