fix(rpc): report checking mergeability on open merge requests
- commit
- bfa2dcdd7b0685dfddf7c5d2a1dc21a6062a90aa
- author
- brice · · 2026-10-19 14:52 UTC
- committer
- brice · · 2026-10-19 18:30 UTC
- parent
- 5ad3fbe
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
3 files · +31 -1
M internal/adapters/rpc/convert_test.go +22 -0
| @@ -376,3 +376,25 @@ func TestIssueStateToPBNeverPending(t *testing.T) { | |||
| 376 | 376 | assert.Equal(t, pb.IssueState_ISSUE_STATE_UNSPECIFIED, issueStateToPB(domain.IssueState("pending"))) | |
| 377 | 377 | assert.Equal(t, pb.IssueState_ISSUE_STATE_OPEN, issueStateToPB(domain.IssueStateOpen)) | |
| 378 | 378 | } | |
| 379 | + | ||
| 380 | + | func TestMergeRequestToPBMergeabilityOnlyWhileOpen(t *testing.T) { | |
| 381 | + | t.Parallel() | |
| 382 | + | repo := mustName(t, "proj") | |
| 383 | + | for state, want := range map[domain.MRState]bool{domain.MRStateOpen: true, domain.MRStateMerged: false, domain.MRStateClosed: false} { | |
| 384 | + | mr := domain.MergeRequest{Repo: repo, Number: 4, State: state} | |
| 385 | + | got := mergeRequestToPB(mr).GetMergeability() | |
| 386 | + | if !want { | |
| 387 | + | assert.Nil(t, got, state) | |
| 388 | + | continue | |
| 389 | + | } | |
| 390 | + | require.NotNil(t, got) | |
| 391 | + | assert.Equal(t, pb.MergeabilityState_MERGEABILITY_STATE_CHECKING, got.GetState()) | |
| 392 | + | ev := watchEventToPB(ports.WatchEvent{ID: "e", Event: domain.MergeRequestOpened{MergeRequest: mr}}) | |
| 393 | + | assert.Equal(t, pb.MergeabilityState_MERGEABILITY_STATE_CHECKING, ev.GetMergeRequestOpened().GetMergeRequest().GetMergeability().GetState()) | |
| 394 | + | } | |
| 395 | + | for _, ev := range []domain.Event{domain.MergeRequestMerged{MergeRequest: domain.MergeRequest{Repo: repo, State: domain.MRStateMerged}}, domain.MergeRequestClosed{MergeRequest: domain.MergeRequest{Repo: repo, State: domain.MRStateClosed}}} { | |
| 396 | + | got := watchEventToPB(ports.WatchEvent{ID: "e", Event: ev}) | |
| 397 | + | assert.Nil(t, got.GetMergeRequestMerged().GetMergeRequest().GetMergeability()) | |
| 398 | + | assert.Nil(t, got.GetMergeRequestClosed().GetMergeRequest().GetMergeability()) | |
| 399 | + | } | |
| 400 | + | } | |
| @@ -376,3 +376,25 @@ func TestIssueStateToPBNeverPending(t *testing.T) { | |||||
| 376 | assert.Equal(t, pb.IssueState_ISSUE_STATE_UNSPECIFIED, issueStateToPB(domain.IssueState("pending"))) | 376 | assert.Equal(t, pb.IssueState_ISSUE_STATE_UNSPECIFIED, issueStateToPB(domain.IssueState("pending"))) | ||
| 377 | assert.Equal(t, pb.IssueState_ISSUE_STATE_OPEN, issueStateToPB(domain.IssueStateOpen)) | 377 | assert.Equal(t, pb.IssueState_ISSUE_STATE_OPEN, issueStateToPB(domain.IssueStateOpen)) | ||
| 378 | } | 378 | } | ||
| 379 | + | ||||
| 380 | + | func TestMergeRequestToPBMergeabilityOnlyWhileOpen(t *testing.T) { | |||
| 381 | + | t.Parallel() | |||
| 382 | + | repo := mustName(t, "proj") | |||
| 383 | + | for state, want := range map[domain.MRState]bool{domain.MRStateOpen: true, domain.MRStateMerged: false, domain.MRStateClosed: false} { | |||
| 384 | + | mr := domain.MergeRequest{Repo: repo, Number: 4, State: state} | |||
| 385 | + | got := mergeRequestToPB(mr).GetMergeability() | |||
| 386 | + | if !want { | |||
| 387 | + | assert.Nil(t, got, state) | |||
| 388 | + | continue | |||
| 389 | + | } | |||
| 390 | + | require.NotNil(t, got) | |||
| 391 | + | assert.Equal(t, pb.MergeabilityState_MERGEABILITY_STATE_CHECKING, got.GetState()) | |||
| 392 | + | ev := watchEventToPB(ports.WatchEvent{ID: "e", Event: domain.MergeRequestOpened{MergeRequest: mr}}) | |||
| 393 | + | assert.Equal(t, pb.MergeabilityState_MERGEABILITY_STATE_CHECKING, ev.GetMergeRequestOpened().GetMergeRequest().GetMergeability().GetState()) | |||
| 394 | + | } | |||
| 395 | + | for _, ev := range []domain.Event{domain.MergeRequestMerged{MergeRequest: domain.MergeRequest{Repo: repo, State: domain.MRStateMerged}}, domain.MergeRequestClosed{MergeRequest: domain.MergeRequest{Repo: repo, State: domain.MRStateClosed}}} { | |||
| 396 | + | got := watchEventToPB(ports.WatchEvent{ID: "e", Event: ev}) | |||
| 397 | + | assert.Nil(t, got.GetMergeRequestMerged().GetMergeRequest().GetMergeability()) | |||
| 398 | + | assert.Nil(t, got.GetMergeRequestClosed().GetMergeRequest().GetMergeability()) | |||
| 399 | + | } | |||
| 400 | + | } | |||
M internal/adapters/rpc/mergerequest.go +8 -1
| @@ -115,8 +115,11 @@ func diffSideFromPB(s pb.DiffSide) (domain.DiffSide, error) { | |||
| 115 | 115 | return "", fmt.Errorf("%w: diff side %v", domain.ErrInvalid, s) | |
| 116 | 116 | } | |
| 117 | 117 | ||
| 118 | + | // mergeRequestToPB maps a request. An open one carries the CHECKING | |
| 119 | + | // mergeability: the server has no result in hand here; Get and List override | |
| 120 | + | // it with the computed one. | |
| 118 | 121 | func mergeRequestToPB(mr domain.MergeRequest) *pb.MergeRequest { | |
| 119 | - | return &pb.MergeRequest{ | |
| 122 | + | out := &pb.MergeRequest{ | |
| 120 | 123 | Repo: mr.Repo.String(), | |
| 121 | 124 | Number: mr.Number, | |
| 122 | 125 | Title: mr.Title.String(), | |
| @@ -131,6 +134,10 @@ func mergeRequestToPB(mr domain.MergeRequest) *pb.MergeRequest { | |||
| 131 | 134 | MergedCommitId: mr.MergedCommitID.String(), | |
| 132 | 135 | MergeMode: mergeModeToPB(mr.MergeMode), | |
| 133 | 136 | } | |
| 137 | + | if mr.IsOpen() { | |
| 138 | + | out.Mergeability = &pb.Mergeability{State: pb.MergeabilityState_MERGEABILITY_STATE_CHECKING} | |
| 139 | + | } | |
| 140 | + | return out | |
| 134 | 141 | } | |
| 135 | 142 | ||
| 136 | 143 | // mergeRequestWithMergeabilityToPB is mergeRequestToPB with the mergeability of | |
| @@ -115,8 +115,11 @@ func diffSideFromPB(s pb.DiffSide) (domain.DiffSide, error) { | |||||
| 115 | return "", fmt.Errorf("%w: diff side %v", domain.ErrInvalid, s) | 115 | return "", fmt.Errorf("%w: diff side %v", domain.ErrInvalid, s) | ||
| 116 | } | 116 | } | ||
| 117 | 117 | ||||
| 118 | + | // mergeRequestToPB maps a request. An open one carries the CHECKING | |||
| 119 | + | // mergeability: the server has no result in hand here; Get and List override | |||
| 120 | + | // it with the computed one. | |||
| 118 | func mergeRequestToPB(mr domain.MergeRequest) *pb.MergeRequest { | 121 | func mergeRequestToPB(mr domain.MergeRequest) *pb.MergeRequest { | ||
| 119 | - | return &pb.MergeRequest{ | 122 | + | out := &pb.MergeRequest{ |
| 120 | Repo: mr.Repo.String(), | 123 | Repo: mr.Repo.String(), | ||
| 121 | Number: mr.Number, | 124 | Number: mr.Number, | ||
| 122 | Title: mr.Title.String(), | 125 | Title: mr.Title.String(), | ||
| @@ -131,6 +134,10 @@ func mergeRequestToPB(mr domain.MergeRequest) *pb.MergeRequest { | |||||
| 131 | MergedCommitId: mr.MergedCommitID.String(), | 134 | MergedCommitId: mr.MergedCommitID.String(), | ||
| 132 | MergeMode: mergeModeToPB(mr.MergeMode), | 135 | MergeMode: mergeModeToPB(mr.MergeMode), | ||
| 133 | } | 136 | } | ||
| 137 | + | if mr.IsOpen() { | |||
| 138 | + | out.Mergeability = &pb.Mergeability{State: pb.MergeabilityState_MERGEABILITY_STATE_CHECKING} | |||
| 139 | + | } | |||
| 140 | + | return out | |||
| 134 | } | 141 | } | ||
| 135 | 142 | ||||
| 136 | // mergeRequestWithMergeabilityToPB is mergeRequestToPB with the mergeability of | 143 | // mergeRequestWithMergeabilityToPB is mergeRequestToPB with the mergeability of | ||
M internal/adapters/rpc/mergerequest_test.go +1 -0
| @@ -51,6 +51,7 @@ func TestMergeRequestServiceCreate(t *testing.T) { | |||
| 51 | 51 | require.NoError(t, err) | |
| 52 | 52 | assert.EqualValues(t, 7, resp.Msg.GetMergeRequest().GetNumber()) | |
| 53 | 53 | assert.Equal(t, pb.MergeRequestState_MERGE_REQUEST_STATE_OPEN, resp.Msg.GetMergeRequest().GetState()) | |
| 54 | + | assert.Equal(t, pb.MergeabilityState_MERGEABILITY_STATE_CHECKING, resp.Msg.GetMergeRequest().GetMergeability().GetState()) | |
| 54 | 55 | }) | |
| 55 | 56 | } | |
| 56 | 57 | } | |
| @@ -51,6 +51,7 @@ func TestMergeRequestServiceCreate(t *testing.T) { | |||||
| 51 | require.NoError(t, err) | 51 | require.NoError(t, err) | ||
| 52 | assert.EqualValues(t, 7, resp.Msg.GetMergeRequest().GetNumber()) | 52 | assert.EqualValues(t, 7, resp.Msg.GetMergeRequest().GetNumber()) | ||
| 53 | assert.Equal(t, pb.MergeRequestState_MERGE_REQUEST_STATE_OPEN, resp.Msg.GetMergeRequest().GetState()) | 53 | assert.Equal(t, pb.MergeRequestState_MERGE_REQUEST_STATE_OPEN, resp.Msg.GetMergeRequest().GetState()) | ||
| 54 | + | assert.Equal(t, pb.MergeabilityState_MERGEABILITY_STATE_CHECKING, resp.Msg.GetMergeRequest().GetMergeability().GetState()) | |||
| 54 | }) | 55 | }) | ||
| 55 | } | 56 | } | ||
| 56 | } | 57 | } | ||