// SPDX-License-Identifier: AGPL-3.0-or-later package web import ( "context" "errors" "net/http" "net/http/httptest" "strings" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "bnema.dev/ermite/internal/domain" "bnema.dev/ermite/internal/ports" "bnema.dev/ermite/internal/ports/mocks" ) func asyncMergeServer(t *testing.T, state domain.MRState) (*Server, *mocks.MergeRequestService) { t.Helper() svc := mocks.NewMergeRequestService(t) browse := mocks.NewBrowseService(t) browse.EXPECT().ListRefs(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(ports.RefPage{Refs: []domain.Ref{{Kind: domain.RefKindBranch, ShortName: "feature"}}}, nil).Maybe() svc.EXPECT().Get(mock.Anything, mock.Anything, repoName(t, "demo"), int64(3), mock.Anything).Return(ports.MergeRequestDetail{ MergeRequest: domain.MergeRequest{Repo: repoName(t, "demo"), Number: 3, State: state, HeadID: objectID(t, strings.Repeat("a", domain.ObjectIDLen)), Source: "feature", Target: "main"}, Mergeability: domain.Mergeability{State: domain.MergeabilityUpToDate}, }, nil).Maybe() return newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, "demo")), Browse: browse, MergeRequests: svc, Now: time.Now}), svc } func TestAsyncMergePost(t *testing.T) { for _, mode := range []domain.MergeMode{domain.MergeModeFastForward, domain.MergeModeSquash, domain.MergeModeMerge} { for _, hx := range []bool{false, true} { t.Run(mode.String()+"/"+boolText(hx), func(t *testing.T) { s, svc := asyncMergeServer(t, domain.MRStateMerged) svc.EXPECT().Merge(mock.Anything, mock.Anything, repoName(t, "demo"), int64(3), ports.MergeParams{Mode: mode}).Return(ports.MergeResult{}, nil).Once() r := autoMergeRequest("/demo/merge-requests/3/merge", "mode="+mode.String()) if hx { r.Header.Set("HX-Request", "true") } w := httptest.NewRecorder() s.mrAction(s.mrMerge)(w, r) if !hx { assert.Equal(t, http.StatusSeeOther, w.Code) return } assert.Equal(t, http.StatusOK, w.Code) assert.Empty(t, w.Header().Get("Location")) assert.Contains(t, w.Body.String(), `id="mr-state"`) assert.Contains(t, w.Body.String(), `data-state="merged"`) assert.Contains(t, w.Body.String(), `id="mr-actions"`) assert.NotContains(t, w.Body.String(), "