2024-07-25 03:33:44 +00:00
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"net/http"
"testing"
2025-03-27 19:40:14 +00:00
"forgejo.org/models/db"
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unit"
"forgejo.org/models/unittest"
user_model "forgejo.org/models/user"
"forgejo.org/tests"
2024-07-25 03:33:44 +00:00
"github.com/stretchr/testify/assert"
2024-08-10 09:09:34 +08:00
"github.com/stretchr/testify/require"
2024-07-25 03:33:44 +00:00
)
func TestViewPulls ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/repo1/pulls" )
resp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
search := htmlDoc . doc . Find ( ".list-header-search > .search > .input > input" )
placeholder , _ := search . Attr ( "placeholder" )
2025-03-08 14:42:14 +00:00
assert . Equal ( t , "Search pulls…" , placeholder )
2024-07-25 03:33:44 +00:00
}
2024-08-10 09:09:34 +08:00
2025-06-17 09:31:50 +02:00
func TestPullViewConversation ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/commitsonpr/pulls/1" )
resp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
t . Run ( "Commits" , func ( t * testing . T ) {
commitLists := htmlDoc . Find ( ".timeline-item.commits-list" )
assert . Equal ( t , 4 , commitLists . Length ( ) )
commits := commitLists . Find ( ".singular-commit" )
assert . Equal ( t , 10 , commits . Length ( ) )
// First one has not been affected by a force push, therefore it's still part of the
// PR and should link to the PR-scoped review tab
firstCommit := commits . Eq ( 0 )
firstCommitMessageHref , _ := firstCommit . Find ( "a.default-link" ) . Attr ( "href" )
firstCommitShaHref , _ := firstCommit . Find ( "a.sha.label" ) . Attr ( "href" )
assert . Equal ( t , "/user2/commitsonpr/pulls/1/commits/4ca8bcaf27e28504df7bf996819665986b01c847" , firstCommitMessageHref )
assert . Equal ( t , "/user2/commitsonpr/pulls/1/commits/4ca8bcaf27e28504df7bf996819665986b01c847" , firstCommitShaHref )
// The fifth commit has been overwritten by a force push.
// Attempting to view the old one in the review tab won't work:
req := NewRequest ( t , "GET" , "/user2/commitsonpr/pulls/1/commits/3e64625bd6eb5bcba69ac97de6c8f507402df861" )
MakeRequest ( t , req , http . StatusNotFound )
// Therefore, this commit should link to the non-PR commit view instead
fifthCommit := commits . Eq ( 4 )
fifthCommitMessageHref , _ := fifthCommit . Find ( "a.default-link" ) . Attr ( "href" )
fifthCommitShaHref , _ := fifthCommit . Find ( "a.sha.label" ) . Attr ( "href" )
assert . Equal ( t , "/user2/commitsonpr/commit/3e64625bd6eb5bcba69ac97de6c8f507402df861" , fifthCommitMessageHref )
assert . Equal ( t , "/user2/commitsonpr/commit/3e64625bd6eb5bcba69ac97de6c8f507402df861" , fifthCommitShaHref )
} )
}
2024-08-10 09:09:34 +08:00
func TestPullManuallyMergeWarning ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
session := loginUser ( t , user2 . Name )
warningMessage := ` Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards. `
t . Run ( "Autodetect disabled" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/repo1/pulls/3" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
mergeInstructions := htmlDoc . Find ( "#merge-instructions" ) . Text ( )
assert . Contains ( t , mergeInstructions , warningMessage )
} )
pullRequestUnit := unittest . AssertExistsAndLoadBean ( t , & repo_model . RepoUnit { RepoID : 1 , Type : unit . TypePullRequests } )
config := pullRequestUnit . PullRequestsConfig ( )
config . AutodetectManualMerge = true
_ , err := db . GetEngine ( db . DefaultContext ) . ID ( pullRequestUnit . ID ) . Cols ( "config" ) . Update ( pullRequestUnit )
require . NoError ( t , err )
t . Run ( "Autodetect enabled" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/repo1/pulls/3" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
mergeInstructions := htmlDoc . Find ( "#merge-instructions" ) . Text ( )
assert . NotContains ( t , mergeInstructions , warningMessage )
} )
}
2024-10-25 09:24:36 +02:00
func TestPullCombinedReviewRequest ( t * testing . T ) {
2025-04-25 09:14:33 +00:00
defer unittest . OverrideFixtures ( "tests/integration/fixtures/TestPullCombinedReviewRequest" ) ( )
2024-10-25 09:24:36 +02:00
defer tests . PrepareTestEnv ( t ) ( )
session := loginUser ( t , "user2" )
helper := func ( t * testing . T , action , userID , expectedText string ) {
t . Helper ( )
req := NewRequestWithValues ( t , "POST" , "/user2/repo1/pulls/request_review" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user2/repo1/pulls/3" ) ,
"issue_ids" : "3" ,
"action" : action ,
"id" : userID ,
} )
session . MakeRequest ( t , req , http . StatusOK )
req = NewRequest ( t , "GET" , "/user2/repo1/pulls/3" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
assert . Contains ( t , htmlDoc . Find ( ".timeline-item:has(.review-request-list)" ) . Last ( ) . Text ( ) , expectedText )
}
helper ( t , "detach" , "2" , "refused to review" )
helper ( t , "attach" , "4" , "requested reviews from user4 and removed review requests for user2" )
helper ( t , "attach" , "9" , "requested reviews from user4, user9 and removed review requests for user2" )
helper ( t , "attach" , "2" , "requested reviews from user4, user9" )
helper ( t , "detach" , "4" , "requested review from user9" )
helper ( t , "detach" , "11" , "requested reviews from user9 and removed review requests for user11" )
helper ( t , "detach" , "9" , "removed review request for user11" )
helper ( t , "detach" , "2" , "removed review requests for user11, user2" )
}