forked from NYANDEV/forgejo
5104c887d3
close https://github.com/go-gitea/gitea/issues/24368 ## what my pull request does Since the official documentation states that custom bots do not support hyperlink functionality, simply adding it without making some formatting changes would result in an unappealing output. Therefore, I have modified the formatting of the output. Currently, it is only used for Feishu. --- [docs](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/im-v1/message/create_json#%E8%B6%85%E9%93%BE%E6%8E%A5%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) <img width="641" alt="image" src="https://github.com/go-gitea/gitea/assets/75628309/360e1c81-ab64-4ef6-851e-aa450d6e85a4"> - Issue <img width="423" alt="image" src="https://github.com/go-gitea/gitea/assets/75628309/519f6fae-81ab-4ec8-89b8-f6a73ff93783"> - Issue Comment <img width="548" alt="image" src="https://github.com/go-gitea/gitea/assets/75628309/749c0d1c-3657-431e-b787-8bf4c23cce83"> - Assign <img width="431" alt="image" src="https://github.com/go-gitea/gitea/assets/75628309/066f99e5-eabb-455d-91fb-a8359cc26dc7"> <img width="457" alt="image" src="https://github.com/go-gitea/gitea/assets/75628309/c6c10f99-db83-46ef-a775-4c91979fa68f"> - Merge <img width="408" alt="image" src="https://github.com/go-gitea/gitea/assets/75628309/e627bf43-5954-45aa-acf6-261ee046802f"> - PullRequest <img width="425" alt="image" src="https://github.com/go-gitea/gitea/assets/75628309/72cfa714-d3fa-4fb9-abdd-e8508d756056">
611 lines
14 KiB
Go
611 lines
14 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 {
|
|
commit := &api.PayloadCommit{
|
|
ID: "2020558fe2e34debb818a514715839cabd25e778",
|
|
Message: "commit 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",
|
|
URL: "http://localhost:3000/api/v1/repos/test/repo/releases/2",
|
|
},
|
|
}
|
|
}
|
|
|
|
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 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)
|
|
}
|
|
}
|