fb03062478
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.
650 lines
15 KiB
Go
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, extraMarkdown, 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, extraMarkdown, "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, extraMarkdown, 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, extraMarkdown, "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)
|
|
}
|
|
}
|