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  }