2019-12-28 16:55:09 +08:00
|
|
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
2022-11-27 13:20:29 -05:00
|
|
|
// SPDX-License-Identifier: MIT
|
2019-12-28 16:55:09 +08:00
|
|
|
|
|
|
|
package webhook
|
|
|
|
|
|
|
|
import (
|
2024-10-07 22:47:52 +02:00
|
|
|
"strings"
|
2021-06-21 04:12:19 +02:00
|
|
|
"testing"
|
|
|
|
|
2025-03-27 19:40:14 +00:00
|
|
|
api "forgejo.org/modules/structs"
|
2021-06-21 04:12:19 +02:00
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2019-12-28 16:55:09 +08:00
|
|
|
)
|
|
|
|
|
2021-06-21 04:12:19 +02: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-23 20:38:08 -07:00
|
|
|
return pushTestPayloadWithCommitMessage("commit message")
|
|
|
|
}
|
|
|
|
|
|
|
|
func pushTestMultilineCommitMessagePayload() *api.PushPayload {
|
|
|
|
return pushTestPayloadWithCommitMessage("This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好 ⚠️⚠️️\n\nThis is the message body.")
|
|
|
|
}
|
|
|
|
|
2024-11-18 21:47:11 +00:00
|
|
|
func pushTestEscapeCommitMessagePayload() *api.PushPayload {
|
|
|
|
return pushTestPayloadWithCommitMessage("# conflicts\n# - some/conflicting/file.txt")
|
|
|
|
}
|
|
|
|
|
2024-09-23 20:38:08 -07:00
|
|
|
func pushTestPayloadWithCommitMessage(message string) *api.PushPayload {
|
2021-06-21 04:12:19 +02:00
|
|
|
commit := &api.PayloadCommit{
|
|
|
|
ID: "2020558fe2e34debb818a514715839cabd25e778",
|
2024-09-23 20:38:08 -07:00
|
|
|
Message: message,
|
2021-06-21 04:12:19 +02: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 18:22:34 +02:00
|
|
|
Ref: "refs/heads/test",
|
|
|
|
Before: "2020558fe2e34debb818a514715839cabd25e777",
|
|
|
|
After: "2020558fe2e34debb818a514715839cabd25e778",
|
|
|
|
CompareURL: "",
|
|
|
|
HeadCommit: commit,
|
|
|
|
Commits: []*api.PayloadCommit{commit, commit},
|
|
|
|
TotalCommits: 2,
|
2021-06-21 04:12:19 +02: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 16:55:09 +08:00
|
|
|
func issueTestPayload() *api.IssuePayload {
|
2024-10-07 22:47:52 +02:00
|
|
|
return issuePayloadWithTitleAndBody("crash", "issue body")
|
|
|
|
}
|
|
|
|
|
|
|
|
func issueTestPayloadWithLongBody() *api.IssuePayload {
|
|
|
|
return issuePayloadWithTitleAndBody("crash", strings.Repeat("issue body", 4097))
|
|
|
|
}
|
|
|
|
|
|
|
|
func issueTestPayloadWithLongTitle() *api.IssuePayload {
|
|
|
|
return issuePayloadWithTitleAndBody(strings.Repeat("a", 257), "issue body")
|
|
|
|
}
|
|
|
|
|
|
|
|
func issuePayloadWithTitleAndBody(title, body string) *api.IssuePayload {
|
2019-12-28 16:55:09 +08:00
|
|
|
return &api.IssuePayload{
|
|
|
|
Index: 2,
|
|
|
|
Sender: &api.User{
|
2021-06-21 04:12:19 +02:00
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
2019-12-28 16:55:09 +08:00
|
|
|
},
|
|
|
|
Repository: &api.Repository{
|
|
|
|
HTMLURL: "http://localhost:3000/test/repo",
|
|
|
|
Name: "repo",
|
|
|
|
FullName: "test/repo",
|
|
|
|
},
|
|
|
|
Issue: &api.Issue{
|
2021-06-21 04:12:19 +02:00
|
|
|
ID: 2,
|
|
|
|
Index: 2,
|
|
|
|
URL: "http://localhost:3000/api/v1/repos/test/repo/issues/2",
|
|
|
|
HTMLURL: "http://localhost:3000/test/repo/issues/2",
|
2024-10-07 22:47:52 +02:00
|
|
|
Title: title,
|
|
|
|
Body: body,
|
2023-08-24 09:00:11 +08:00
|
|
|
Poster: &api.User{
|
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
|
|
|
},
|
2021-06-21 04:12:19 +02: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 16:55:09 +08:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func issueCommentTestPayload() *api.IssueCommentPayload {
|
|
|
|
return &api.IssueCommentPayload{
|
|
|
|
Action: api.HookIssueCommentCreated,
|
|
|
|
Sender: &api.User{
|
2021-06-21 04:12:19 +02:00
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
2019-12-28 16:55:09 +08: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 04:12:19 +02: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 09:00:11 +08:00
|
|
|
Poster: &api.User{
|
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
|
|
|
},
|
|
|
|
Body: "this happened",
|
2019-12-28 16:55:09 +08:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func pullRequestCommentTestPayload() *api.IssueCommentPayload {
|
|
|
|
return &api.IssueCommentPayload{
|
|
|
|
Action: api.HookIssueCommentCreated,
|
|
|
|
Sender: &api.User{
|
2021-06-21 04:12:19 +02:00
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
2019-12-28 16:55:09 +08:00
|
|
|
},
|
|
|
|
Repository: &api.Repository{
|
|
|
|
HTMLURL: "http://localhost:3000/test/repo",
|
|
|
|
Name: "repo",
|
|
|
|
FullName: "test/repo",
|
|
|
|
},
|
|
|
|
Comment: &api.Comment{
|
2021-06-21 04:12:19 +02:00
|
|
|
HTMLURL: "http://localhost:3000/test/repo/pulls/12#issuecomment-4",
|
|
|
|
PRURL: "http://localhost:3000/test/repo/pulls/12",
|
2019-12-28 16:55:09 +08:00
|
|
|
Body: "changes requested",
|
|
|
|
},
|
|
|
|
Issue: &api.Issue{
|
2021-06-21 04:12:19 +02: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 09:00:11 +08:00
|
|
|
Poster: &api.User{
|
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
|
|
|
},
|
2019-12-28 16:55:09 +08:00
|
|
|
},
|
|
|
|
IsPull: true,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-04 21:54:23 +02: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 16:55:09 +08:00
|
|
|
func pullReleaseTestPayload() *api.ReleasePayload {
|
|
|
|
return &api.ReleasePayload{
|
|
|
|
Action: api.HookReleasePublished,
|
|
|
|
Sender: &api.User{
|
2021-06-21 04:12:19 +02:00
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
2019-12-28 16:55:09 +08: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 04:12:19 +02:00
|
|
|
Note: "Note of first stable release",
|
2023-09-21 17:55:09 -05:00
|
|
|
HTMLURL: "http://localhost:3000/test/repo/releases/tag/v1.0",
|
2019-12-28 16:55:09 +08:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Actions Failure, Succes, Recover Webhooks (#7508)
Implement Actions Success, Failure and Recover webhooks for Forgejo, Gitea, Gogs, Slack, Discord, DingTalk, Telegram, Microsoft Teams, Feishu / Lark Suite, Matrix, WeCom (Wechat Work), Packagist. Some of these webhooks have not been manually tested.
Implement settings for these new webhooks.
## Checklist
The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).
### Tests
- I added test coverage for Go changes...
- [x] in their respective `*_test.go` for unit tests.
- [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
- [ ] in `web_src/js/*.test.js` if it can be unit tested.
- [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).
### Documentation
- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.
### Release notes
- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.
<!--start release-notes-assistant-->
## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Features
- [PR](https://codeberg.org/forgejo/forgejo/pulls/7508): <!--number 7508 --><!--line 0 --><!--description QWN0aW9ucyBGYWlsdXJlLCBTdWNjZXMsIFJlY292ZXIgV2ViaG9va3M=-->Actions Failure, Succes, Recover Webhooks<!--description-->
<!--end release-notes-assistant-->
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7508
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: christopher-besch <mail@chris-besch.com>
Co-committed-by: christopher-besch <mail@chris-besch.com>
2025-06-03 14:29:19 +02:00
|
|
|
func ActionTestPayload() *api.ActionPayload {
|
|
|
|
// this is not a complete action payload but enough for testing purposes
|
|
|
|
return &api.ActionPayload{
|
|
|
|
Run: &api.ActionRun{
|
|
|
|
Repo: &api.Repository{
|
|
|
|
HTMLURL: "http://localhost:3000/test/repo",
|
|
|
|
Name: "repo",
|
|
|
|
FullName: "test/repo",
|
|
|
|
},
|
|
|
|
PrettyRef: "main",
|
|
|
|
HTMLURL: "http://localhost:3000/test/repo/actions/runs/69",
|
|
|
|
Title: "Build release",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-28 16:55:09 +08:00
|
|
|
func pullRequestTestPayload() *api.PullRequestPayload {
|
|
|
|
return &api.PullRequestPayload{
|
|
|
|
Action: api.HookIssueOpened,
|
2021-06-21 04:12:19 +02:00
|
|
|
Index: 12,
|
2019-12-28 16:55:09 +08:00
|
|
|
Sender: &api.User{
|
2021-06-21 04:12:19 +02:00
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
2019-12-28 16:55:09 +08:00
|
|
|
},
|
|
|
|
Repository: &api.Repository{
|
|
|
|
HTMLURL: "http://localhost:3000/test/repo",
|
|
|
|
Name: "repo",
|
|
|
|
FullName: "test/repo",
|
|
|
|
},
|
|
|
|
PullRequest: &api.PullRequest{
|
2021-06-21 04:12:19 +02:00
|
|
|
ID: 12,
|
|
|
|
Index: 12,
|
2019-12-28 16:55:09 +08:00
|
|
|
URL: "http://localhost:3000/test/repo/pulls/12",
|
2021-06-21 04:12:19 +02:00
|
|
|
HTMLURL: "http://localhost:3000/test/repo/pulls/12",
|
2019-12-28 16:55:09 +08:00
|
|
|
Title: "Fix bug",
|
|
|
|
Body: "fixes bug #2",
|
|
|
|
Mergeable: true,
|
2023-08-24 09:00:11 +08:00
|
|
|
Poster: &api.User{
|
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
|
|
|
},
|
2021-06-21 04:12:19 +02:00
|
|
|
Assignees: []*api.User{
|
|
|
|
{
|
|
|
|
UserName: "user1",
|
|
|
|
AvatarURL: "http://localhost:3000/user1/avatar",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Milestone: &api.Milestone{
|
|
|
|
ID: 1,
|
|
|
|
Title: "Milestone Title",
|
|
|
|
Description: "Milestone Description",
|
|
|
|
},
|
2024-06-05 15:17:11 +02:00
|
|
|
Base: &api.PRBranchInfo{
|
|
|
|
Name: "branch1",
|
|
|
|
Ref: "refs/pull/2/head",
|
|
|
|
Sha: "4a357436d925b5c974181ff12a994538ddc5a269",
|
|
|
|
RepoID: 1,
|
|
|
|
Repository: &api.Repository{
|
|
|
|
HTMLURL: "http://localhost:3000/test/repo",
|
|
|
|
Name: "repo",
|
|
|
|
FullName: "test/repo",
|
|
|
|
},
|
|
|
|
},
|
2021-06-21 04:12:19 +02:00
|
|
|
},
|
|
|
|
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 16:55:09 +08:00
|
|
|
},
|
2021-06-21 04:12:19 +02:00
|
|
|
Repository: &api.Repository{
|
|
|
|
HTMLURL: "http://localhost:3000/test/repo",
|
|
|
|
Name: "repo",
|
|
|
|
FullName: "test/repo",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-17 12:17:33 +01: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 04:12:19 +02: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
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-04 21:54:23 +02: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 04:12:19 +02: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 16:55:09 +08:00
|
|
|
}
|
|
|
|
}
|
Actions Failure, Succes, Recover Webhooks (#7508)
Implement Actions Success, Failure and Recover webhooks for Forgejo, Gitea, Gogs, Slack, Discord, DingTalk, Telegram, Microsoft Teams, Feishu / Lark Suite, Matrix, WeCom (Wechat Work), Packagist. Some of these webhooks have not been manually tested.
Implement settings for these new webhooks.
## Checklist
The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).
### Tests
- I added test coverage for Go changes...
- [x] in their respective `*_test.go` for unit tests.
- [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
- [ ] in `web_src/js/*.test.js` if it can be unit tested.
- [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).
### Documentation
- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.
### Release notes
- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.
<!--start release-notes-assistant-->
## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Features
- [PR](https://codeberg.org/forgejo/forgejo/pulls/7508): <!--number 7508 --><!--line 0 --><!--description QWN0aW9ucyBGYWlsdXJlLCBTdWNjZXMsIFJlY292ZXIgV2ViaG9va3M=-->Actions Failure, Succes, Recover Webhooks<!--description-->
<!--end release-notes-assistant-->
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7508
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: christopher-besch <mail@chris-besch.com>
Co-committed-by: christopher-besch <mail@chris-besch.com>
2025-06-03 14:29:19 +02:00
|
|
|
|
|
|
|
func TestGetActionPayloadInfo(t *testing.T) {
|
|
|
|
p := ActionTestPayload()
|
|
|
|
|
|
|
|
cases := []struct {
|
|
|
|
action api.HookActionAction
|
|
|
|
text string
|
|
|
|
color int
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
api.HookActionFailure,
|
|
|
|
"Build release Action Failed in test/repo main",
|
|
|
|
redColor,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
api.HookActionSuccess,
|
|
|
|
"Build release Action Succeeded in test/repo main",
|
|
|
|
greenColor,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
api.HookActionRecover,
|
|
|
|
"Build release Action Recovered in test/repo main",
|
|
|
|
greenColor,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for i, c := range cases {
|
|
|
|
p.Action = c.action
|
|
|
|
text, color := getActionPayloadInfo(p, noneLinkFormatter)
|
|
|
|
assert.Equal(t, c.text, text, "case %d", i)
|
|
|
|
assert.Equal(t, c.color, color, "case %d", i)
|
|
|
|
}
|
|
|
|
}
|