forgejo/tests/integration/pull_merge_instruction_test.go
MayMeow 2566924ff8 feat: Retrieve default merge commit message for pull requests (#10022)
Closes #7719

Co-authored-by: kukolos <91948790+kukolos@users.noreply.github.com>
Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10022
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: MayMeow <maymeow@noreply.codeberg.org>
Co-committed-by: MayMeow <maymeow@noreply.codeberg.org>
2026-01-01 11:45:43 +01:00

83 lines
2.9 KiB
Go

// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"fmt"
"net/http"
"net/url"
"testing"
auth_model "forgejo.org/models/auth"
issues_model "forgejo.org/models/issues"
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unittest"
user_model "forgejo.org/models/user"
"forgejo.org/modules/gitrepo"
api "forgejo.org/modules/structs"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestPullMergeInstruction(t *testing.T) {
onApplicationRun(t, func(t *testing.T, _ *url.URL) {
session := loginUser(t, "user1")
testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
testEditFileToNewBranch(t, session, "user1", "repo1", "master", "conflict", "README.md", "Hello, World (Edited Once)\n")
testEditFileToNewBranch(t, session, "user1", "repo1", "master", "base", "README.md", "Hello, World (Edited Twice)\n")
// Use API to create a conflicting PR, mirroring TestCantMergeConflict
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
req := NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls", "user1", "repo1"), &api.CreatePullRequestOption{
Head: "conflict",
Base: "base",
Title: "create a conflicting pr",
}).AddTokenAuth(token)
resp := session.MakeRequest(t, req, http.StatusCreated)
var pr api.PullRequest
DecodeJSON(t, resp, &pr)
user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{
Name: "user1",
})
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{
OwnerID: user1.ID,
Name: "repo1",
})
// Assert that the PR exists, is open, and is not mergeable (conflicted)
prLoaded := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{
ID: pr.ID,
HeadRepoID: repo1.ID,
BaseRepoID: repo1.ID,
HeadBranch: "conflict",
BaseBranch: "base",
}, "status = 0")
assert.False(t, prLoaded.Mergeable(t.Context()), "PR should be marked as conflicted")
gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1)
require.NoError(t, err)
defer gitRepo.Close()
// Visit the PR page and check for the manual merge helper
req = NewRequest(t, "GET", fmt.Sprintf("/user1/repo1/pulls/%d", pr.Index))
resp = session.MakeRequest(t, req, http.StatusOK)
htmlDoc := NewHTMLParser(t, resp.Body)
// Check for "View command line instructions"
summary := htmlDoc.doc.Find("details.collapsible summary").Text()
assert.Contains(t, summary, "View command line instructions")
// Check for "Manual merge helper"
helperTitle := htmlDoc.doc.Find("details.collapsible h3").Text()
assert.Contains(t, helperTitle, "Manual merge helper")
// Check for the description
helperDesc := htmlDoc.doc.Find("details.collapsible p").Text()
assert.Contains(t, helperDesc, "Use this merge commit message when completing the merge manually.")
})
}