code.gitea.io/gitea@v1.22.3/tests/integration/pull_status_test.go (about) 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "fmt" 8 "net/http" 9 "net/url" 10 "path" 11 "strings" 12 "testing" 13 14 auth_model "code.gitea.io/gitea/models/auth" 15 git_model "code.gitea.io/gitea/models/git" 16 repo_model "code.gitea.io/gitea/models/repo" 17 "code.gitea.io/gitea/models/unittest" 18 api "code.gitea.io/gitea/modules/structs" 19 20 "github.com/stretchr/testify/assert" 21 ) 22 23 func TestPullCreate_CommitStatus(t *testing.T) { 24 onGiteaRun(t, func(t *testing.T, u *url.URL) { 25 session := loginUser(t, "user1") 26 testRepoFork(t, session, "user2", "repo1", "user1", "repo1", "") 27 testEditFileToNewBranch(t, session, "user1", "repo1", "master", "status1", "README.md", "status1") 28 29 url := path.Join("user1", "repo1", "compare", "master...status1") 30 req := NewRequestWithValues(t, "POST", url, 31 map[string]string{ 32 "_csrf": GetCSRF(t, session, url), 33 "title": "pull request from status1", 34 }, 35 ) 36 session.MakeRequest(t, req, http.StatusOK) 37 38 req = NewRequest(t, "GET", "/user1/repo1/pulls") 39 resp := session.MakeRequest(t, req, http.StatusOK) 40 NewHTMLParser(t, resp.Body) 41 42 // Request repository commits page 43 req = NewRequest(t, "GET", "/user1/repo1/pulls/1/commits") 44 resp = session.MakeRequest(t, req, http.StatusOK) 45 doc := NewHTMLParser(t, resp.Body) 46 47 // Get first commit URL 48 commitURL, exists := doc.doc.Find("#commits-table tbody tr td.sha a").Last().Attr("href") 49 assert.True(t, exists) 50 assert.NotEmpty(t, commitURL) 51 52 commitID := path.Base(commitURL) 53 54 statusList := []api.CommitStatusState{ 55 api.CommitStatusPending, 56 api.CommitStatusError, 57 api.CommitStatusFailure, 58 api.CommitStatusSuccess, 59 api.CommitStatusWarning, 60 } 61 62 statesIcons := map[api.CommitStatusState]string{ 63 api.CommitStatusPending: "octicon-dot-fill", 64 api.CommitStatusSuccess: "octicon-check", 65 api.CommitStatusError: "gitea-exclamation", 66 api.CommitStatusFailure: "octicon-x", 67 api.CommitStatusWarning: "gitea-exclamation", 68 } 69 70 testCtx := NewAPITestContext(t, "user1", "repo1", auth_model.AccessTokenScopeWriteRepository) 71 72 // Update commit status, and check if icon is updated as well 73 for _, status := range statusList { 74 // Call API to add status for commit 75 t.Run("CreateStatus", doAPICreateCommitStatus(testCtx, commitID, api.CreateStatusOption{ 76 State: status, 77 TargetURL: "http://test.ci/", 78 Description: "", 79 Context: "testci", 80 })) 81 82 req = NewRequest(t, "GET", "/user1/repo1/pulls/1/commits") 83 resp = session.MakeRequest(t, req, http.StatusOK) 84 doc = NewHTMLParser(t, resp.Body) 85 86 commitURL, exists = doc.doc.Find("#commits-table tbody tr td.sha a").Last().Attr("href") 87 assert.True(t, exists) 88 assert.NotEmpty(t, commitURL) 89 assert.EqualValues(t, commitID, path.Base(commitURL)) 90 91 cls, ok := doc.doc.Find("#commits-table tbody tr td.message .commit-status").Last().Attr("class") 92 assert.True(t, ok) 93 assert.Contains(t, cls, statesIcons[status]) 94 } 95 96 repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: "repo1"}) 97 css := unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatusSummary{RepoID: repo1.ID, SHA: commitID}) 98 assert.EqualValues(t, api.CommitStatusWarning, css.State) 99 }) 100 } 101 102 func doAPICreateCommitStatus(ctx APITestContext, commitID string, data api.CreateStatusOption) func(*testing.T) { 103 return func(t *testing.T) { 104 req := NewRequestWithJSON( 105 t, 106 http.MethodPost, 107 fmt.Sprintf("/api/v1/repos/%s/%s/statuses/%s", ctx.Username, ctx.Reponame, commitID), 108 data, 109 ).AddTokenAuth(ctx.Token) 110 if ctx.ExpectedCode != 0 { 111 ctx.Session.MakeRequest(t, req, ctx.ExpectedCode) 112 return 113 } 114 ctx.Session.MakeRequest(t, req, http.StatusCreated) 115 } 116 } 117 118 func TestPullCreate_EmptyChangesWithDifferentCommits(t *testing.T) { 119 // Merge must continue if commits SHA are different, even if content is same 120 // Reason: gitflow and merging master back into develop, where is high possibility, there are no changes 121 // but just commit saying "Merge branch". And this meta commit can be also tagged, 122 // so we need to have this meta commit also in develop branch. 123 onGiteaRun(t, func(t *testing.T, u *url.URL) { 124 session := loginUser(t, "user1") 125 testRepoFork(t, session, "user2", "repo1", "user1", "repo1", "") 126 testEditFileToNewBranch(t, session, "user1", "repo1", "master", "status1", "README.md", "status1") 127 testEditFileToNewBranch(t, session, "user1", "repo1", "status1", "status1", "README.md", "# repo1\n\nDescription for repo1") 128 129 url := path.Join("user1", "repo1", "compare", "master...status1") 130 req := NewRequestWithValues(t, "POST", url, 131 map[string]string{ 132 "_csrf": GetCSRF(t, session, url), 133 "title": "pull request from status1", 134 }, 135 ) 136 session.MakeRequest(t, req, http.StatusOK) 137 138 req = NewRequest(t, "GET", "/user1/repo1/pulls/1") 139 resp := session.MakeRequest(t, req, http.StatusOK) 140 doc := NewHTMLParser(t, resp.Body) 141 142 text := strings.TrimSpace(doc.doc.Find(".merge-section").Text()) 143 assert.Contains(t, text, "This pull request can be merged automatically.") 144 }) 145 } 146 147 func TestPullCreate_EmptyChangesWithSameCommits(t *testing.T) { 148 onGiteaRun(t, func(t *testing.T, u *url.URL) { 149 session := loginUser(t, "user1") 150 testRepoFork(t, session, "user2", "repo1", "user1", "repo1", "") 151 testCreateBranch(t, session, "user1", "repo1", "branch/master", "status1", http.StatusSeeOther) 152 url := path.Join("user1", "repo1", "compare", "master...status1") 153 req := NewRequestWithValues(t, "POST", url, 154 map[string]string{ 155 "_csrf": GetCSRF(t, session, url), 156 "title": "pull request from status1", 157 }, 158 ) 159 session.MakeRequest(t, req, http.StatusOK) 160 req = NewRequest(t, "GET", "/user1/repo1/pulls/1") 161 resp := session.MakeRequest(t, req, http.StatusOK) 162 doc := NewHTMLParser(t, resp.Body) 163 164 text := strings.TrimSpace(doc.doc.Find(".merge-section").Text()) 165 assert.Contains(t, text, "This branch is already included in the target branch. There is nothing to merge.") 166 }) 167 }