code.gitea.io/gitea@v1.22.3/services/webhook/discord_test.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package webhook
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	webhook_model "code.gitea.io/gitea/models/webhook"
    11  	"code.gitea.io/gitea/modules/json"
    12  	"code.gitea.io/gitea/modules/setting"
    13  	api "code.gitea.io/gitea/modules/structs"
    14  	webhook_module "code.gitea.io/gitea/modules/webhook"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  func TestDiscordPayload(t *testing.T) {
    21  	dc := discordConvertor{}
    22  
    23  	t.Run("Create", func(t *testing.T) {
    24  		p := createTestPayload()
    25  
    26  		pl, err := dc.Create(p)
    27  		require.NoError(t, err)
    28  
    29  		assert.Len(t, pl.Embeds, 1)
    30  		assert.Equal(t, "[test/repo] branch test created", pl.Embeds[0].Title)
    31  		assert.Empty(t, pl.Embeds[0].Description)
    32  		assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.Embeds[0].URL)
    33  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
    34  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
    35  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
    36  	})
    37  
    38  	t.Run("Delete", func(t *testing.T) {
    39  		p := deleteTestPayload()
    40  
    41  		pl, err := dc.Delete(p)
    42  		require.NoError(t, err)
    43  
    44  		assert.Len(t, pl.Embeds, 1)
    45  		assert.Equal(t, "[test/repo] branch test deleted", pl.Embeds[0].Title)
    46  		assert.Empty(t, pl.Embeds[0].Description)
    47  		assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.Embeds[0].URL)
    48  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
    49  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
    50  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
    51  	})
    52  
    53  	t.Run("Fork", func(t *testing.T) {
    54  		p := forkTestPayload()
    55  
    56  		pl, err := dc.Fork(p)
    57  		require.NoError(t, err)
    58  
    59  		assert.Len(t, pl.Embeds, 1)
    60  		assert.Equal(t, "test/repo2 is forked to test/repo", pl.Embeds[0].Title)
    61  		assert.Empty(t, pl.Embeds[0].Description)
    62  		assert.Equal(t, "http://localhost:3000/test/repo", pl.Embeds[0].URL)
    63  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
    64  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
    65  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
    66  	})
    67  
    68  	t.Run("Push", func(t *testing.T) {
    69  		p := pushTestPayload()
    70  
    71  		pl, err := dc.Push(p)
    72  		require.NoError(t, err)
    73  
    74  		assert.Len(t, pl.Embeds, 1)
    75  		assert.Equal(t, "[test/repo:test] 2 new commits", pl.Embeds[0].Title)
    76  		assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", pl.Embeds[0].Description)
    77  		assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.Embeds[0].URL)
    78  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
    79  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
    80  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
    81  	})
    82  
    83  	t.Run("PushWithLongCommitMessage", func(t *testing.T) {
    84  		p := pushTestMultilineCommitMessagePayload()
    85  
    86  		pl, err := dc.Push(p)
    87  		require.NoError(t, err)
    88  
    89  		assert.Len(t, pl.Embeds, 1)
    90  		assert.Equal(t, "[test/repo:test] 2 new commits", pl.Embeds[0].Title)
    91  		assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1", pl.Embeds[0].Description)
    92  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
    93  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
    94  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
    95  	})
    96  
    97  	t.Run("Issue", func(t *testing.T) {
    98  		p := issueTestPayload()
    99  
   100  		p.Action = api.HookIssueOpened
   101  		pl, err := dc.Issue(p)
   102  		require.NoError(t, err)
   103  
   104  		assert.Len(t, pl.Embeds, 1)
   105  		assert.Equal(t, "[test/repo] Issue opened: #2 crash", pl.Embeds[0].Title)
   106  		assert.Equal(t, "issue body", pl.Embeds[0].Description)
   107  		assert.Equal(t, "http://localhost:3000/test/repo/issues/2", pl.Embeds[0].URL)
   108  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   109  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   110  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   111  
   112  		p.Action = api.HookIssueClosed
   113  		pl, err = dc.Issue(p)
   114  		require.NoError(t, err)
   115  
   116  		assert.Len(t, pl.Embeds, 1)
   117  		assert.Equal(t, "[test/repo] Issue closed: #2 crash", pl.Embeds[0].Title)
   118  		assert.Empty(t, pl.Embeds[0].Description)
   119  		assert.Equal(t, "http://localhost:3000/test/repo/issues/2", pl.Embeds[0].URL)
   120  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   121  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   122  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   123  	})
   124  
   125  	t.Run("IssueComment", func(t *testing.T) {
   126  		p := issueCommentTestPayload()
   127  
   128  		pl, err := dc.IssueComment(p)
   129  		require.NoError(t, err)
   130  
   131  		assert.Len(t, pl.Embeds, 1)
   132  		assert.Equal(t, "[test/repo] New comment on issue #2 crash", pl.Embeds[0].Title)
   133  		assert.Equal(t, "more info needed", pl.Embeds[0].Description)
   134  		assert.Equal(t, "http://localhost:3000/test/repo/issues/2#issuecomment-4", pl.Embeds[0].URL)
   135  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   136  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   137  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   138  	})
   139  
   140  	t.Run("PullRequest", func(t *testing.T) {
   141  		p := pullRequestTestPayload()
   142  
   143  		pl, err := dc.PullRequest(p)
   144  		require.NoError(t, err)
   145  
   146  		assert.Len(t, pl.Embeds, 1)
   147  		assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug", pl.Embeds[0].Title)
   148  		assert.Equal(t, "fixes bug #2", pl.Embeds[0].Description)
   149  		assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", pl.Embeds[0].URL)
   150  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   151  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   152  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   153  	})
   154  
   155  	t.Run("PullRequestComment", func(t *testing.T) {
   156  		p := pullRequestCommentTestPayload()
   157  
   158  		pl, err := dc.IssueComment(p)
   159  		require.NoError(t, err)
   160  
   161  		assert.Len(t, pl.Embeds, 1)
   162  		assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug", pl.Embeds[0].Title)
   163  		assert.Equal(t, "changes requested", pl.Embeds[0].Description)
   164  		assert.Equal(t, "http://localhost:3000/test/repo/pulls/12#issuecomment-4", pl.Embeds[0].URL)
   165  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   166  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   167  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   168  	})
   169  
   170  	t.Run("Review", func(t *testing.T) {
   171  		p := pullRequestTestPayload()
   172  		p.Action = api.HookIssueReviewed
   173  
   174  		pl, err := dc.Review(p, webhook_module.HookEventPullRequestReviewApproved)
   175  		require.NoError(t, err)
   176  
   177  		assert.Len(t, pl.Embeds, 1)
   178  		assert.Equal(t, "[test/repo] Pull request review approved: #12 Fix bug", pl.Embeds[0].Title)
   179  		assert.Equal(t, "good job", pl.Embeds[0].Description)
   180  		assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", pl.Embeds[0].URL)
   181  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   182  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   183  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   184  	})
   185  
   186  	t.Run("Repository", func(t *testing.T) {
   187  		p := repositoryTestPayload()
   188  
   189  		pl, err := dc.Repository(p)
   190  		require.NoError(t, err)
   191  
   192  		assert.Len(t, pl.Embeds, 1)
   193  		assert.Equal(t, "[test/repo] Repository created", pl.Embeds[0].Title)
   194  		assert.Empty(t, pl.Embeds[0].Description)
   195  		assert.Equal(t, "http://localhost:3000/test/repo", pl.Embeds[0].URL)
   196  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   197  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   198  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   199  	})
   200  
   201  	t.Run("Package", func(t *testing.T) {
   202  		p := packageTestPayload()
   203  
   204  		pl, err := dc.Package(p)
   205  		require.NoError(t, err)
   206  
   207  		assert.Len(t, pl.Embeds, 1)
   208  		assert.Equal(t, "Package created: GiteaContainer:latest", pl.Embeds[0].Title)
   209  		assert.Empty(t, pl.Embeds[0].Description)
   210  		assert.Equal(t, "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest", pl.Embeds[0].URL)
   211  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   212  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   213  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   214  	})
   215  
   216  	t.Run("Wiki", func(t *testing.T) {
   217  		p := wikiTestPayload()
   218  
   219  		p.Action = api.HookWikiCreated
   220  		pl, err := dc.Wiki(p)
   221  		require.NoError(t, err)
   222  
   223  		assert.Len(t, pl.Embeds, 1)
   224  		assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment)", pl.Embeds[0].Title)
   225  		assert.Equal(t, "Wiki change comment", pl.Embeds[0].Description)
   226  		assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.Embeds[0].URL)
   227  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   228  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   229  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   230  
   231  		p.Action = api.HookWikiEdited
   232  		pl, err = dc.Wiki(p)
   233  		require.NoError(t, err)
   234  
   235  		assert.Len(t, pl.Embeds, 1)
   236  		assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment)", pl.Embeds[0].Title)
   237  		assert.Equal(t, "Wiki change comment", pl.Embeds[0].Description)
   238  		assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.Embeds[0].URL)
   239  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   240  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   241  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   242  
   243  		p.Action = api.HookWikiDeleted
   244  		pl, err = dc.Wiki(p)
   245  		require.NoError(t, err)
   246  
   247  		assert.Len(t, pl.Embeds, 1)
   248  		assert.Equal(t, "[test/repo] Wiki page 'index' deleted", pl.Embeds[0].Title)
   249  		assert.Empty(t, pl.Embeds[0].Description)
   250  		assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.Embeds[0].URL)
   251  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   252  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   253  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   254  	})
   255  
   256  	t.Run("Release", func(t *testing.T) {
   257  		p := pullReleaseTestPayload()
   258  
   259  		pl, err := dc.Release(p)
   260  		require.NoError(t, err)
   261  
   262  		assert.Len(t, pl.Embeds, 1)
   263  		assert.Equal(t, "[test/repo] Release created: v1.0", pl.Embeds[0].Title)
   264  		assert.Equal(t, "Note of first stable release", pl.Embeds[0].Description)
   265  		assert.Equal(t, "http://localhost:3000/test/repo/releases/tag/v1.0", pl.Embeds[0].URL)
   266  		assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
   267  		assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
   268  		assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
   269  	})
   270  }
   271  
   272  func TestDiscordJSONPayload(t *testing.T) {
   273  	p := pushTestPayload()
   274  	data, err := p.JSONPayload()
   275  	require.NoError(t, err)
   276  
   277  	hook := &webhook_model.Webhook{
   278  		RepoID:     3,
   279  		IsActive:   true,
   280  		Type:       webhook_module.DISCORD,
   281  		URL:        "https://discord.example.com/",
   282  		Meta:       `{}`,
   283  		HTTPMethod: "POST",
   284  	}
   285  	task := &webhook_model.HookTask{
   286  		HookID:         hook.ID,
   287  		EventType:      webhook_module.HookEventPush,
   288  		PayloadContent: string(data),
   289  		PayloadVersion: 2,
   290  	}
   291  
   292  	req, reqBody, err := newDiscordRequest(context.Background(), hook, task)
   293  	require.NotNil(t, req)
   294  	require.NotNil(t, reqBody)
   295  	require.NoError(t, err)
   296  
   297  	assert.Equal(t, "POST", req.Method)
   298  	assert.Equal(t, "https://discord.example.com/", req.URL.String())
   299  	assert.Equal(t, "sha256=", req.Header.Get("X-Hub-Signature-256"))
   300  	assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
   301  	var body DiscordPayload
   302  	err = json.NewDecoder(req.Body).Decode(&body)
   303  	assert.NoError(t, err)
   304  	assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", body.Embeds[0].Description)
   305  }