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