diff --git a/tests/integration/editor_test.go b/tests/integration/editor_test.go index a5936d86de225..daad37f849019 100644 --- a/tests/integration/editor_test.go +++ b/tests/integration/editor_test.go @@ -30,11 +30,11 @@ import ( func TestCreateFile(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { session := loginUser(t, "user2") - testCreateFile(t, session, "user2", "repo1", "master", "test.txt", "Content") + testCreateFile(t, session, "user2", "repo1", "master", "test.txt", "Content", "") }) } -func testCreateFile(t *testing.T, session *TestSession, user, repo, branch, filePath, content string) *httptest.ResponseRecorder { +func testCreateFile(t *testing.T, session *TestSession, user, repo, branch, filePath, content, newBranch string) *httptest.ResponseRecorder { // Request editor page newURL := fmt.Sprintf("/%s/%s/_new/%s/", user, repo, branch) req := NewRequest(t, "GET", newURL) @@ -44,13 +44,19 @@ func testCreateFile(t *testing.T, session *TestSession, user, repo, branch, file lastCommit := doc.GetInputValueByName("last_commit") assert.NotEmpty(t, lastCommit) + commitChoice := "direct" + if newBranch != "" && newBranch != branch { + commitChoice = "commit-to-new-branch" + } + // Save new file to master branch req = NewRequestWithValues(t, "POST", newURL, map[string]string{ - "_csrf": doc.GetCSRF(), - "last_commit": lastCommit, - "tree_path": filePath, - "content": content, - "commit_choice": "direct", + "_csrf": doc.GetCSRF(), + "last_commit": lastCommit, + "tree_path": filePath, + "content": content, + "commit_choice": commitChoice, + "new_branch_name": newBranch, }) return session.MakeRequest(t, req, http.StatusSeeOther) } diff --git a/tests/integration/repo_webhook_test.go b/tests/integration/repo_webhook_test.go index 57162de363e6d..1e9f8c0b526a4 100644 --- a/tests/integration/repo_webhook_test.go +++ b/tests/integration/repo_webhook_test.go @@ -17,8 +17,10 @@ import ( "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "code.gitea.io/gitea/tests" @@ -359,58 +361,98 @@ func Test_WebhookPush(t *testing.T) { // 1. create a new webhook with special webhook for repo1 session := loginUser(t, "user2") + repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) + + testAPICreateWebhookForRepo(t, session, repo1.OwnerName, repo1.Name, provider.URL(), "push") - testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "push") + gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + assert.NoError(t, err) + defer gitRepo.Close() + + beforeCommitID, err := gitRepo.GetBranchCommitID("master") + assert.NoError(t, err) // 2. trigger the webhook - testCreateFile(t, session, "user2", "repo1", "master", "test_webhook_push.md", "# a test file for webhook push") + testCreateFile(t, session, "user2", "repo1", "master", "test_webhook_push.md", "# a test file for webhook push", "") + + afterCommitID, err := gitRepo.GetBranchCommitID("master") + assert.NoError(t, err) // 3. validate the webhook is triggered assert.Equal(t, "push", triggeredEvent) assert.Len(t, payloads, 1) + assert.Equal(t, "refs/heads/master", payloads[0].Ref) + assert.Equal(t, beforeCommitID, payloads[0].Before) + assert.Equal(t, afterCommitID, payloads[0].After) assert.Equal(t, "repo1", payloads[0].Repo.Name) assert.Equal(t, "user2/repo1", payloads[0].Repo.FullName) assert.Len(t, payloads[0].Commits, 1) + assert.Equal(t, afterCommitID, payloads[0].Commits[0].ID) + assert.Equal(t, setting.AppURL+"user2/repo1/compare/"+beforeCommitID+"..."+afterCommitID, payloads[0].CompareURL) assert.Equal(t, []string{"test_webhook_push.md"}, payloads[0].Commits[0].Added) + assert.Empty(t, payloads[0].Commits[0].Removed) }) } func Test_WebhookPushDevBranch(t *testing.T) { - var payloads []api.PushPayload - var triggeredEvent string - provider := newMockWebhookProvider(func(r *http.Request) { - content, _ := io.ReadAll(r.Body) - var payload api.PushPayload - err := json.Unmarshal(content, &payload) - assert.NoError(t, err) - payloads = append(payloads, payload) - triggeredEvent = "push" - }, http.StatusOK) - defer provider.Close() - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + var payloads []api.PushPayload + var triggeredEvent string + provider := newMockWebhookProvider(func(r *http.Request) { + content, _ := io.ReadAll(r.Body) + var payload api.PushPayload + err := json.Unmarshal(content, &payload) + assert.NoError(t, err) + payloads = append(payloads, payload) + triggeredEvent = "push" + }, http.StatusOK) + defer provider.Close() + + repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) + // 1. create a new webhook with special webhook for repo1 session := loginUser(t, "user2") + gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + assert.NoError(t, err) + defer gitRepo.Close() + // only for dev branch - testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "push", "develop") + testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "push", "new_branch") // 2. this should not trigger the webhook - testCreateFile(t, session, "user2", "repo1", "master", "test_webhook_push.md", "# a test file for webhook push") + testCreateFile(t, session, "user2", "repo1", "master", "test_webhook_push.md", "# a test file for webhook push", "") assert.Empty(t, triggeredEvent) assert.Empty(t, payloads) + _, err = gitRepo.GetBranchCommitID("new_branch") + assert.Error(t, err) + + fromBranchCommitID, err := gitRepo.GetBranchCommitID("develop") + assert.NoError(t, err) + // 3. trigger the webhook - testCreateFile(t, session, "user2", "repo1", "develop", "test_webhook_push.md", "# a test file for webhook push") + testCreateFile(t, session, "user2", "repo1", "develop", "test_webhook_push.md", "# a test file for webhook push", "new_branch") + + afterCommitID, err := gitRepo.GetBranchCommitID("new_branch") + assert.NoError(t, err) + + beforeCommitID := git.Sha1ObjectFormat.EmptyObjectID().String() // 4. validate the webhook is triggered assert.Equal(t, "push", triggeredEvent) assert.Len(t, payloads, 1) + assert.Equal(t, "refs/heads/new_branch", payloads[0].Ref) + assert.Equal(t, beforeCommitID, payloads[0].Before) + assert.Equal(t, afterCommitID, payloads[0].After) assert.Equal(t, "repo1", payloads[0].Repo.Name) - assert.Equal(t, "develop", payloads[0].Branch()) + assert.Equal(t, "new_branch", payloads[0].Branch()) assert.Equal(t, "user2/repo1", payloads[0].Repo.FullName) assert.Len(t, payloads[0].Commits, 1) + assert.Equal(t, afterCommitID, payloads[0].Commits[0].ID) + assert.Equal(t, setting.AppURL+"user2/repo1/compare/"+fromBranchCommitID+"..."+afterCommitID, payloads[0].CompareURL) assert.Equal(t, []string{"test_webhook_push.md"}, payloads[0].Commits[0].Added) + assert.Empty(t, payloads[0].Commits[0].Removed) }) } @@ -805,7 +847,7 @@ func Test_WebhookStatus_NoWrongTrigger(t *testing.T) { testCreateWebhookForRepo(t, session, "gitea", "user2", "repo1", provider.URL(), "push_only") // 2. trigger the webhook with a push action - testCreateFile(t, session, "user2", "repo1", "master", "test_webhook_push.md", "# a test file for webhook push") + testCreateFile(t, session, "user2", "repo1", "master", "test_webhook_push.md", "# a test file for webhook push", "") // 3. validate the webhook is triggered with right event assert.Equal(t, "push", trigger)