2019-12-28 11:55:09 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-12-28 11:55:09 +03:00
package webhook
import (
2021-06-21 05:12:19 +03:00
"testing"
2019-12-28 11:55:09 +03:00
api "code.gitea.io/gitea/modules/structs"
2021-06-21 05:12:19 +03:00
"github.com/stretchr/testify/assert"
2019-12-28 11:55:09 +03:00
)
2021-06-21 05:12:19 +03:00
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 {
2024-09-24 06:38:08 +03:00
return pushTestPayloadWithCommitMessage ( "commit message" )
}
func pushTestMultilineCommitMessagePayload ( ) * api . PushPayload {
2024-11-07 22:56:53 +03:00
return pushTestPayloadWithCommitMessage ( "chore: This is a commit summary\n\nThis is a commit description." )
2024-09-24 06:38:08 +03:00
}
func pushTestPayloadWithCommitMessage ( message string ) * api . PushPayload {
2021-06-21 05:12:19 +03:00
commit := & api . PayloadCommit {
ID : "2020558fe2e34debb818a514715839cabd25e778" ,
2024-09-24 06:38:08 +03:00
Message : message ,
2021-06-21 05:12:19 +03:00
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 {
2022-10-16 19:22:34 +03:00
Ref : "refs/heads/test" ,
Before : "2020558fe2e34debb818a514715839cabd25e777" ,
After : "2020558fe2e34debb818a514715839cabd25e778" ,
CompareURL : "" ,
HeadCommit : commit ,
Commits : [ ] * api . PayloadCommit { commit , commit } ,
TotalCommits : 2 ,
2021-06-21 05:12:19 +03:00
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" ,
} ,
}
}
2019-12-28 11:55:09 +03:00
func issueTestPayload ( ) * api . IssuePayload {
return & api . IssuePayload {
Index : 2 ,
Sender : & api . User {
2021-06-21 05:12:19 +03:00
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
2019-12-28 11:55:09 +03:00
} ,
Repository : & api . Repository {
HTMLURL : "http://localhost:3000/test/repo" ,
Name : "repo" ,
FullName : "test/repo" ,
} ,
Issue : & api . Issue {
2021-06-21 05:12:19 +03:00
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" ,
2023-08-24 04:00:11 +03:00
Poster : & api . User {
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
} ,
2021-06-21 05:12:19 +03:00
Assignees : [ ] * api . User {
{
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
} ,
} ,
Milestone : & api . Milestone {
ID : 1 ,
Title : "Milestone Title" ,
Description : "Milestone Description" ,
} ,
2019-12-28 11:55:09 +03:00
} ,
}
}
func issueCommentTestPayload ( ) * api . IssueCommentPayload {
return & api . IssueCommentPayload {
Action : api . HookIssueCommentCreated ,
Sender : & api . User {
2021-06-21 05:12:19 +03:00
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
2019-12-28 11:55:09 +03:00
} ,
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 {
2021-06-21 05:12:19 +03:00
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" ,
2023-08-24 04:00:11 +03:00
Poster : & api . User {
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
} ,
Body : "this happened" ,
2019-12-28 11:55:09 +03:00
} ,
}
}
func pullRequestCommentTestPayload ( ) * api . IssueCommentPayload {
return & api . IssueCommentPayload {
Action : api . HookIssueCommentCreated ,
Sender : & api . User {
2021-06-21 05:12:19 +03:00
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
2019-12-28 11:55:09 +03:00
} ,
Repository : & api . Repository {
HTMLURL : "http://localhost:3000/test/repo" ,
Name : "repo" ,
FullName : "test/repo" ,
} ,
Comment : & api . Comment {
2021-06-21 05:12:19 +03:00
HTMLURL : "http://localhost:3000/test/repo/pulls/12#issuecomment-4" ,
PRURL : "http://localhost:3000/test/repo/pulls/12" ,
2019-12-28 11:55:09 +03:00
Body : "changes requested" ,
} ,
Issue : & api . Issue {
2021-06-21 05:12:19 +03:00
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" ,
2023-08-24 04:00:11 +03:00
Poster : & api . User {
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
} ,
2019-12-28 11:55:09 +03:00
} ,
IsPull : true ,
}
}
2022-09-04 22:54:23 +03:00
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" ,
}
}
2019-12-28 11:55:09 +03:00
func pullReleaseTestPayload ( ) * api . ReleasePayload {
return & api . ReleasePayload {
Action : api . HookReleasePublished ,
Sender : & api . User {
2021-06-21 05:12:19 +03:00
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
2019-12-28 11:55:09 +03:00
} ,
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" ,
2021-06-21 05:12:19 +03:00
Note : "Note of first stable release" ,
2023-09-22 01:55:09 +03:00
HTMLURL : "http://localhost:3000/test/repo/releases/tag/v1.0" ,
2019-12-28 11:55:09 +03:00
} ,
}
}
func pullRequestTestPayload ( ) * api . PullRequestPayload {
return & api . PullRequestPayload {
Action : api . HookIssueOpened ,
2021-06-21 05:12:19 +03:00
Index : 12 ,
2019-12-28 11:55:09 +03:00
Sender : & api . User {
2021-06-21 05:12:19 +03:00
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
2019-12-28 11:55:09 +03:00
} ,
Repository : & api . Repository {
HTMLURL : "http://localhost:3000/test/repo" ,
Name : "repo" ,
FullName : "test/repo" ,
} ,
PullRequest : & api . PullRequest {
2021-06-21 05:12:19 +03:00
ID : 12 ,
Index : 12 ,
2019-12-28 11:55:09 +03:00
URL : "http://localhost:3000/test/repo/pulls/12" ,
2021-06-21 05:12:19 +03:00
HTMLURL : "http://localhost:3000/test/repo/pulls/12" ,
2019-12-28 11:55:09 +03:00
Title : "Fix bug" ,
Body : "fixes bug #2" ,
Mergeable : true ,
2023-08-24 04:00:11 +03:00
Poster : & api . User {
UserName : "user1" ,
AvatarURL : "http://localhost:3000/user1/avatar" ,
} ,
2021-06-21 05:12:19 +03:00
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" ,
2019-12-28 11:55:09 +03:00
} ,
2021-06-21 05:12:19 +03:00
Repository : & api . Repository {
HTMLURL : "http://localhost:3000/test/repo" ,
Name : "repo" ,
FullName : "test/repo" ,
} ,
}
}
2023-11-17 14:17:33 +03:00
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" ,
} ,
}
}
2021-06-21 05:12:19 +03:00
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
2024-07-10 14:37:16 +03:00
text , issueTitle , extraMarkdown , color := getIssuesPayloadInfo ( p , noneLinkFormatter , true )
2021-06-21 05:12:19 +03:00
assert . Equal ( t , c . text , text , "case %d" , i )
assert . Equal ( t , c . issueTitle , issueTitle , "case %d" , i )
2024-07-10 14:37:16 +03:00
assert . Equal ( t , c . attachmentText , extraMarkdown , "case %d" , i )
2021-06-21 05:12:19 +03:00
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
2024-07-10 14:37:16 +03:00
text , issueTitle , extraMarkdown , color := getPullRequestPayloadInfo ( p , noneLinkFormatter , true )
2021-06-21 05:12:19 +03:00
assert . Equal ( t , c . text , text , "case %d" , i )
assert . Equal ( t , c . issueTitle , issueTitle , "case %d" , i )
2024-07-10 14:37:16 +03:00
assert . Equal ( t , c . attachmentText , extraMarkdown , "case %d" , i )
2021-06-21 05:12:19 +03:00
assert . Equal ( t , c . color , color , "case %d" , i )
}
}
2022-09-04 22:54:23 +03:00
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 )
}
}
2021-06-21 05:12:19 +03:00
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 )
2019-12-28 11:55:09 +03:00
}
}