0
0
mirror of https://github.com/go-gitea/gitea.git synced 2024-11-28 04:08:25 +01:00
gitea/services/webhook/general_test.go
Giteabot 22a93c1cdc
Only provide the commit summary for Discord webhook push events (#32432) (#32447)
Backport #32432 by @kemzeb

Resolves #32371.

#31970 should have just showed the commit summary, but
`strings.SplitN()` was misused such that we did not perform any
splitting at all and just used the message. This was not caught in the
unit test made in that PR since the test commit summary was > 50 (which
truncated away the commit description).

This snapshot resolves this and adds another unit test to ensure that we
only show the commit summary.

Co-authored-by: Kemal Zebari <60799661+kemzeb@users.noreply.github.com>
2024-11-08 09:13:49 +08:00

650 lines
15 KiB
Go

// Copyright 2019 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package webhook
import (
"testing"
api "code.gitea.io/gitea/modules/structs"
"github.com/stretchr/testify/assert"
)
func createTestPayload() *api.CreatePayload {
return &api.CreatePayload{
Sha: "2020558fe2e34debb818a514715839cabd25e777",
Ref: "refs/heads/test",
RefType: "branch",
Repo: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
}
}
func deleteTestPayload() *api.DeletePayload {
return &api.DeletePayload{
Ref: "refs/heads/test",
RefType: "branch",
Repo: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
}
}
func forkTestPayload() *api.ForkPayload {
return &api.ForkPayload{
Forkee: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo2",
Name: "repo2",
FullName: "test/repo2",
},
Repo: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
}
}
func pushTestPayload() *api.PushPayload {
return pushTestPayloadWithCommitMessage("commit message")
}
func pushTestMultilineCommitMessagePayload() *api.PushPayload {
return pushTestPayloadWithCommitMessage("chore: This is a commit summary\n\nThis is a commit description.")
}
func pushTestPayloadWithCommitMessage(message string) *api.PushPayload {
commit := &api.PayloadCommit{
ID: "2020558fe2e34debb818a514715839cabd25e778",
Message: message,
URL: "http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778",
Author: &api.PayloadUser{
Name: "user1",
Email: "user1@localhost",
UserName: "user1",
},
Committer: &api.PayloadUser{
Name: "user1",
Email: "user1@localhost",
UserName: "user1",
},
}
return &api.PushPayload{
Ref: "refs/heads/test",
Before: "2020558fe2e34debb818a514715839cabd25e777",
After: "2020558fe2e34debb818a514715839cabd25e778",
CompareURL: "",
HeadCommit: commit,
Commits: []*api.PayloadCommit{commit, commit},
TotalCommits: 2,
Repo: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Pusher: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
}
}
func issueTestPayload() *api.IssuePayload {
return &api.IssuePayload{
Index: 2,
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Repository: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Issue: &api.Issue{
ID: 2,
Index: 2,
URL: "http://localhost:3000/api/v1/repos/test/repo/issues/2",
HTMLURL: "http://localhost:3000/test/repo/issues/2",
Title: "crash",
Body: "issue body",
Poster: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Assignees: []*api.User{
{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
},
Milestone: &api.Milestone{
ID: 1,
Title: "Milestone Title",
Description: "Milestone Description",
},
},
}
}
func issueCommentTestPayload() *api.IssueCommentPayload {
return &api.IssueCommentPayload{
Action: api.HookIssueCommentCreated,
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Repository: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Comment: &api.Comment{
HTMLURL: "http://localhost:3000/test/repo/issues/2#issuecomment-4",
IssueURL: "http://localhost:3000/test/repo/issues/2",
Body: "more info needed",
},
Issue: &api.Issue{
ID: 2,
Index: 2,
URL: "http://localhost:3000/api/v1/repos/test/repo/issues/2",
HTMLURL: "http://localhost:3000/test/repo/issues/2",
Title: "crash",
Poster: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Body: "this happened",
},
}
}
func pullRequestCommentTestPayload() *api.IssueCommentPayload {
return &api.IssueCommentPayload{
Action: api.HookIssueCommentCreated,
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Repository: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Comment: &api.Comment{
HTMLURL: "http://localhost:3000/test/repo/pulls/12#issuecomment-4",
PRURL: "http://localhost:3000/test/repo/pulls/12",
Body: "changes requested",
},
Issue: &api.Issue{
ID: 12,
Index: 12,
URL: "http://localhost:3000/api/v1/repos/test/repo/pulls/12",
HTMLURL: "http://localhost:3000/test/repo/pulls/12",
Title: "Fix bug",
Body: "fixes bug #2",
Poster: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
},
IsPull: true,
}
}
func wikiTestPayload() *api.WikiPayload {
return &api.WikiPayload{
Repository: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Page: "index",
Comment: "Wiki change comment",
}
}
func pullReleaseTestPayload() *api.ReleasePayload {
return &api.ReleasePayload{
Action: api.HookReleasePublished,
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Repository: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
Release: &api.Release{
TagName: "v1.0",
Target: "master",
Title: "First stable release",
Note: "Note of first stable release",
HTMLURL: "http://localhost:3000/test/repo/releases/tag/v1.0",
},
}
}
func pullRequestTestPayload() *api.PullRequestPayload {
return &api.PullRequestPayload{
Action: api.HookIssueOpened,
Index: 12,
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Repository: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
PullRequest: &api.PullRequest{
ID: 12,
Index: 12,
URL: "http://localhost:3000/test/repo/pulls/12",
HTMLURL: "http://localhost:3000/test/repo/pulls/12",
Title: "Fix bug",
Body: "fixes bug #2",
Mergeable: true,
Poster: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Assignees: []*api.User{
{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
},
Milestone: &api.Milestone{
ID: 1,
Title: "Milestone Title",
Description: "Milestone Description",
},
},
Review: &api.ReviewPayload{
Content: "good job",
},
}
}
func repositoryTestPayload() *api.RepositoryPayload {
return &api.RepositoryPayload{
Action: api.HookRepoCreated,
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Repository: &api.Repository{
HTMLURL: "http://localhost:3000/test/repo",
Name: "repo",
FullName: "test/repo",
},
}
}
func packageTestPayload() *api.PackagePayload {
return &api.PackagePayload{
Action: api.HookPackageCreated,
Sender: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Repository: nil,
Organization: &api.User{
UserName: "org1",
AvatarURL: "http://localhost:3000/org1/avatar",
},
Package: &api.Package{
Owner: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Repository: nil,
Creator: &api.User{
UserName: "user1",
AvatarURL: "http://localhost:3000/user1/avatar",
},
Type: "container",
Name: "GiteaContainer",
Version: "latest",
HTMLURL: "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest",
},
}
}
func TestGetIssuesPayloadInfo(t *testing.T) {
p := issueTestPayload()
cases := []struct {
action api.HookIssueAction
text string
issueTitle string
attachmentText string
color int
}{
{
api.HookIssueOpened,
"[test/repo] Issue opened: #2 crash by user1",
"#2 crash",
"issue body",
orangeColor,
},
{
api.HookIssueClosed,
"[test/repo] Issue closed: #2 crash by user1",
"#2 crash",
"",
redColor,
},
{
api.HookIssueReOpened,
"[test/repo] Issue re-opened: #2 crash by user1",
"#2 crash",
"",
yellowColor,
},
{
api.HookIssueEdited,
"[test/repo] Issue edited: #2 crash by user1",
"#2 crash",
"issue body",
yellowColor,
},
{
api.HookIssueAssigned,
"[test/repo] Issue assigned to user1: #2 crash by user1",
"#2 crash",
"",
greenColor,
},
{
api.HookIssueUnassigned,
"[test/repo] Issue unassigned: #2 crash by user1",
"#2 crash",
"",
yellowColor,
},
{
api.HookIssueLabelUpdated,
"[test/repo] Issue labels updated: #2 crash by user1",
"#2 crash",
"",
yellowColor,
},
{
api.HookIssueLabelCleared,
"[test/repo] Issue labels cleared: #2 crash by user1",
"#2 crash",
"",
yellowColor,
},
{
api.HookIssueSynchronized,
"[test/repo] Issue synchronized: #2 crash by user1",
"#2 crash",
"",
yellowColor,
},
{
api.HookIssueMilestoned,
"[test/repo] Issue milestoned to Milestone Title: #2 crash by user1",
"#2 crash",
"",
yellowColor,
},
{
api.HookIssueDemilestoned,
"[test/repo] Issue milestone cleared: #2 crash by user1",
"#2 crash",
"",
yellowColor,
},
}
for i, c := range cases {
p.Action = c.action
text, issueTitle, attachmentText, color := getIssuesPayloadInfo(p, noneLinkFormatter, true)
assert.Equal(t, c.text, text, "case %d", i)
assert.Equal(t, c.issueTitle, issueTitle, "case %d", i)
assert.Equal(t, c.attachmentText, attachmentText, "case %d", i)
assert.Equal(t, c.color, color, "case %d", i)
}
}
func TestGetPullRequestPayloadInfo(t *testing.T) {
p := pullRequestTestPayload()
cases := []struct {
action api.HookIssueAction
text string
issueTitle string
attachmentText string
color int
}{
{
api.HookIssueOpened,
"[test/repo] Pull request opened: #12 Fix bug by user1",
"#12 Fix bug",
"fixes bug #2",
greenColor,
},
{
api.HookIssueClosed,
"[test/repo] Pull request closed: #12 Fix bug by user1",
"#12 Fix bug",
"",
redColor,
},
{
api.HookIssueReOpened,
"[test/repo] Pull request re-opened: #12 Fix bug by user1",
"#12 Fix bug",
"",
yellowColor,
},
{
api.HookIssueEdited,
"[test/repo] Pull request edited: #12 Fix bug by user1",
"#12 Fix bug",
"fixes bug #2",
yellowColor,
},
{
api.HookIssueAssigned,
"[test/repo] Pull request assigned to user1: #12 Fix bug by user1",
"#12 Fix bug",
"",
greenColor,
},
{
api.HookIssueUnassigned,
"[test/repo] Pull request unassigned: #12 Fix bug by user1",
"#12 Fix bug",
"",
yellowColor,
},
{
api.HookIssueLabelUpdated,
"[test/repo] Pull request labels updated: #12 Fix bug by user1",
"#12 Fix bug",
"",
yellowColor,
},
{
api.HookIssueLabelCleared,
"[test/repo] Pull request labels cleared: #12 Fix bug by user1",
"#12 Fix bug",
"",
yellowColor,
},
{
api.HookIssueSynchronized,
"[test/repo] Pull request synchronized: #12 Fix bug by user1",
"#12 Fix bug",
"",
yellowColor,
},
{
api.HookIssueMilestoned,
"[test/repo] Pull request milestoned to Milestone Title: #12 Fix bug by user1",
"#12 Fix bug",
"",
yellowColor,
},
{
api.HookIssueDemilestoned,
"[test/repo] Pull request milestone cleared: #12 Fix bug by user1",
"#12 Fix bug",
"",
yellowColor,
},
}
for i, c := range cases {
p.Action = c.action
text, issueTitle, attachmentText, color := getPullRequestPayloadInfo(p, noneLinkFormatter, true)
assert.Equal(t, c.text, text, "case %d", i)
assert.Equal(t, c.issueTitle, issueTitle, "case %d", i)
assert.Equal(t, c.attachmentText, attachmentText, "case %d", i)
assert.Equal(t, c.color, color, "case %d", i)
}
}
func TestGetWikiPayloadInfo(t *testing.T) {
p := wikiTestPayload()
cases := []struct {
action api.HookWikiAction
text string
color int
link string
}{
{
api.HookWikiCreated,
"[test/repo] New wiki page 'index' (Wiki change comment) by user1",
greenColor,
"index",
},
{
api.HookWikiEdited,
"[test/repo] Wiki page 'index' edited (Wiki change comment) by user1",
yellowColor,
"index",
},
{
api.HookWikiDeleted,
"[test/repo] Wiki page 'index' deleted by user1",
redColor,
"index",
},
}
for i, c := range cases {
p.Action = c.action
text, color, link := getWikiPayloadInfo(p, noneLinkFormatter, true)
assert.Equal(t, c.text, text, "case %d", i)
assert.Equal(t, c.color, color, "case %d", i)
assert.Equal(t, c.link, link, "case %d", i)
}
}
func TestGetReleasePayloadInfo(t *testing.T) {
p := pullReleaseTestPayload()
cases := []struct {
action api.HookReleaseAction
text string
color int
}{
{
api.HookReleasePublished,
"[test/repo] Release created: v1.0 by user1",
greenColor,
},
{
api.HookReleaseUpdated,
"[test/repo] Release updated: v1.0 by user1",
yellowColor,
},
{
api.HookReleaseDeleted,
"[test/repo] Release deleted: v1.0 by user1",
redColor,
},
}
for i, c := range cases {
p.Action = c.action
text, color := getReleasePayloadInfo(p, noneLinkFormatter, true)
assert.Equal(t, c.text, text, "case %d", i)
assert.Equal(t, c.color, color, "case %d", i)
}
}
func TestGetIssueCommentPayloadInfo(t *testing.T) {
p := pullRequestCommentTestPayload()
cases := []struct {
action api.HookIssueCommentAction
text string
issueTitle string
color int
}{
{
api.HookIssueCommentCreated,
"[test/repo] New comment on pull request #12 Fix bug by user1",
"#12 Fix bug",
greenColorLight,
},
{
api.HookIssueCommentEdited,
"[test/repo] Comment edited on pull request #12 Fix bug by user1",
"#12 Fix bug",
yellowColor,
},
{
api.HookIssueCommentDeleted,
"[test/repo] Comment deleted on pull request #12 Fix bug by user1",
"#12 Fix bug",
redColor,
},
}
for i, c := range cases {
p.Action = c.action
text, issueTitle, color := getIssueCommentPayloadInfo(p, noneLinkFormatter, true)
assert.Equal(t, c.text, text, "case %d", i)
assert.Equal(t, c.issueTitle, issueTitle, "case %d", i)
assert.Equal(t, c.color, color, "case %d", i)
}
}