code.gitea.io/gitea@v1.22.3/services/webhook/msteams_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  	api "code.gitea.io/gitea/modules/structs"
    13  	webhook_module "code.gitea.io/gitea/modules/webhook"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func TestMSTeamsPayload(t *testing.T) {
    20  	mc := msteamsConvertor{}
    21  	t.Run("Create", func(t *testing.T) {
    22  		p := createTestPayload()
    23  
    24  		pl, err := mc.Create(p)
    25  		require.NoError(t, err)
    26  
    27  		assert.Equal(t, "[test/repo] branch test created", pl.Title)
    28  		assert.Equal(t, "[test/repo] branch test created", pl.Summary)
    29  		assert.Len(t, pl.Sections, 1)
    30  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
    31  		assert.Empty(t, pl.Sections[0].Text)
    32  		assert.Len(t, pl.Sections[0].Facts, 2)
    33  		for _, fact := range pl.Sections[0].Facts {
    34  			if fact.Name == "Repository:" {
    35  				assert.Equal(t, p.Repo.FullName, fact.Value)
    36  			} else if fact.Name == "branch:" {
    37  				assert.Equal(t, "test", fact.Value)
    38  			} else {
    39  				t.Fail()
    40  			}
    41  		}
    42  		assert.Len(t, pl.PotentialAction, 1)
    43  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
    44  		assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.PotentialAction[0].Targets[0].URI)
    45  	})
    46  
    47  	t.Run("Delete", func(t *testing.T) {
    48  		p := deleteTestPayload()
    49  
    50  		pl, err := mc.Delete(p)
    51  		require.NoError(t, err)
    52  
    53  		assert.Equal(t, "[test/repo] branch test deleted", pl.Title)
    54  		assert.Equal(t, "[test/repo] branch test deleted", pl.Summary)
    55  		assert.Len(t, pl.Sections, 1)
    56  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
    57  		assert.Empty(t, pl.Sections[0].Text)
    58  		assert.Len(t, pl.Sections[0].Facts, 2)
    59  		for _, fact := range pl.Sections[0].Facts {
    60  			if fact.Name == "Repository:" {
    61  				assert.Equal(t, p.Repo.FullName, fact.Value)
    62  			} else if fact.Name == "branch:" {
    63  				assert.Equal(t, "test", fact.Value)
    64  			} else {
    65  				t.Fail()
    66  			}
    67  		}
    68  		assert.Len(t, pl.PotentialAction, 1)
    69  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
    70  		assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.PotentialAction[0].Targets[0].URI)
    71  	})
    72  
    73  	t.Run("Fork", func(t *testing.T) {
    74  		p := forkTestPayload()
    75  
    76  		pl, err := mc.Fork(p)
    77  		require.NoError(t, err)
    78  
    79  		assert.Equal(t, "test/repo2 is forked to test/repo", pl.Title)
    80  		assert.Equal(t, "test/repo2 is forked to test/repo", pl.Summary)
    81  		assert.Len(t, pl.Sections, 1)
    82  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
    83  		assert.Empty(t, pl.Sections[0].Text)
    84  		assert.Len(t, pl.Sections[0].Facts, 2)
    85  		for _, fact := range pl.Sections[0].Facts {
    86  			if fact.Name == "Repository:" {
    87  				assert.Equal(t, p.Repo.FullName, fact.Value)
    88  			} else if fact.Name == "Forkee:" {
    89  				assert.Equal(t, p.Forkee.FullName, fact.Value)
    90  			} else {
    91  				t.Fail()
    92  			}
    93  		}
    94  		assert.Len(t, pl.PotentialAction, 1)
    95  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
    96  		assert.Equal(t, "http://localhost:3000/test/repo", pl.PotentialAction[0].Targets[0].URI)
    97  	})
    98  
    99  	t.Run("Push", func(t *testing.T) {
   100  		p := pushTestPayload()
   101  
   102  		pl, err := mc.Push(p)
   103  		require.NoError(t, err)
   104  
   105  		assert.Equal(t, "[test/repo:test] 2 new commits", pl.Title)
   106  		assert.Equal(t, "[test/repo:test] 2 new commits", pl.Summary)
   107  		assert.Len(t, pl.Sections, 1)
   108  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   109  		assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", pl.Sections[0].Text)
   110  		assert.Len(t, pl.Sections[0].Facts, 2)
   111  		for _, fact := range pl.Sections[0].Facts {
   112  			if fact.Name == "Repository:" {
   113  				assert.Equal(t, p.Repo.FullName, fact.Value)
   114  			} else if fact.Name == "Commit count:" {
   115  				assert.Equal(t, "2", fact.Value)
   116  			} else {
   117  				t.Fail()
   118  			}
   119  		}
   120  		assert.Len(t, pl.PotentialAction, 1)
   121  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   122  		assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.PotentialAction[0].Targets[0].URI)
   123  	})
   124  
   125  	t.Run("Issue", func(t *testing.T) {
   126  		p := issueTestPayload()
   127  
   128  		p.Action = api.HookIssueOpened
   129  		pl, err := mc.Issue(p)
   130  		require.NoError(t, err)
   131  
   132  		assert.Equal(t, "[test/repo] Issue opened: #2 crash", pl.Title)
   133  		assert.Equal(t, "[test/repo] Issue opened: #2 crash", pl.Summary)
   134  		assert.Len(t, pl.Sections, 1)
   135  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   136  		assert.Equal(t, "issue body", pl.Sections[0].Text)
   137  		assert.Len(t, pl.Sections[0].Facts, 2)
   138  		for _, fact := range pl.Sections[0].Facts {
   139  			if fact.Name == "Repository:" {
   140  				assert.Equal(t, p.Repository.FullName, fact.Value)
   141  			} else if fact.Name == "Issue #:" {
   142  				assert.Equal(t, "2", fact.Value)
   143  			} else {
   144  				t.Fail()
   145  			}
   146  		}
   147  		assert.Len(t, pl.PotentialAction, 1)
   148  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   149  		assert.Equal(t, "http://localhost:3000/test/repo/issues/2", pl.PotentialAction[0].Targets[0].URI)
   150  
   151  		p.Action = api.HookIssueClosed
   152  		pl, err = mc.Issue(p)
   153  		require.NoError(t, err)
   154  
   155  		assert.Equal(t, "[test/repo] Issue closed: #2 crash", pl.Title)
   156  		assert.Equal(t, "[test/repo] Issue closed: #2 crash", pl.Summary)
   157  		assert.Len(t, pl.Sections, 1)
   158  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   159  		assert.Empty(t, pl.Sections[0].Text)
   160  		assert.Len(t, pl.Sections[0].Facts, 2)
   161  		for _, fact := range pl.Sections[0].Facts {
   162  			if fact.Name == "Repository:" {
   163  				assert.Equal(t, p.Repository.FullName, fact.Value)
   164  			} else if fact.Name == "Issue #:" {
   165  				assert.Equal(t, "2", fact.Value)
   166  			} else {
   167  				t.Fail()
   168  			}
   169  		}
   170  		assert.Len(t, pl.PotentialAction, 1)
   171  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   172  		assert.Equal(t, "http://localhost:3000/test/repo/issues/2", pl.PotentialAction[0].Targets[0].URI)
   173  	})
   174  
   175  	t.Run("IssueComment", func(t *testing.T) {
   176  		p := issueCommentTestPayload()
   177  
   178  		pl, err := mc.IssueComment(p)
   179  		require.NoError(t, err)
   180  
   181  		assert.Equal(t, "[test/repo] New comment on issue #2 crash", pl.Title)
   182  		assert.Equal(t, "[test/repo] New comment on issue #2 crash", pl.Summary)
   183  		assert.Len(t, pl.Sections, 1)
   184  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   185  		assert.Equal(t, "more info needed", pl.Sections[0].Text)
   186  		assert.Len(t, pl.Sections[0].Facts, 2)
   187  		for _, fact := range pl.Sections[0].Facts {
   188  			if fact.Name == "Repository:" {
   189  				assert.Equal(t, p.Repository.FullName, fact.Value)
   190  			} else if fact.Name == "Issue #:" {
   191  				assert.Equal(t, "2", fact.Value)
   192  			} else {
   193  				t.Fail()
   194  			}
   195  		}
   196  		assert.Len(t, pl.PotentialAction, 1)
   197  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   198  		assert.Equal(t, "http://localhost:3000/test/repo/issues/2#issuecomment-4", pl.PotentialAction[0].Targets[0].URI)
   199  	})
   200  
   201  	t.Run("PullRequest", func(t *testing.T) {
   202  		p := pullRequestTestPayload()
   203  
   204  		pl, err := mc.PullRequest(p)
   205  		require.NoError(t, err)
   206  
   207  		assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug", pl.Title)
   208  		assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug", pl.Summary)
   209  		assert.Len(t, pl.Sections, 1)
   210  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   211  		assert.Equal(t, "fixes bug #2", pl.Sections[0].Text)
   212  		assert.Len(t, pl.Sections[0].Facts, 2)
   213  		for _, fact := range pl.Sections[0].Facts {
   214  			if fact.Name == "Repository:" {
   215  				assert.Equal(t, p.Repository.FullName, fact.Value)
   216  			} else if fact.Name == "Pull request #:" {
   217  				assert.Equal(t, "12", fact.Value)
   218  			} else {
   219  				t.Fail()
   220  			}
   221  		}
   222  		assert.Len(t, pl.PotentialAction, 1)
   223  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   224  		assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", pl.PotentialAction[0].Targets[0].URI)
   225  	})
   226  
   227  	t.Run("PullRequestComment", func(t *testing.T) {
   228  		p := pullRequestCommentTestPayload()
   229  
   230  		pl, err := mc.IssueComment(p)
   231  		require.NoError(t, err)
   232  
   233  		assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug", pl.Title)
   234  		assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug", pl.Summary)
   235  		assert.Len(t, pl.Sections, 1)
   236  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   237  		assert.Equal(t, "changes requested", pl.Sections[0].Text)
   238  		assert.Len(t, pl.Sections[0].Facts, 2)
   239  		for _, fact := range pl.Sections[0].Facts {
   240  			if fact.Name == "Repository:" {
   241  				assert.Equal(t, p.Repository.FullName, fact.Value)
   242  			} else if fact.Name == "Issue #:" {
   243  				assert.Equal(t, "12", fact.Value)
   244  			} else {
   245  				t.Fail()
   246  			}
   247  		}
   248  		assert.Len(t, pl.PotentialAction, 1)
   249  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   250  		assert.Equal(t, "http://localhost:3000/test/repo/pulls/12#issuecomment-4", pl.PotentialAction[0].Targets[0].URI)
   251  	})
   252  
   253  	t.Run("Review", func(t *testing.T) {
   254  		p := pullRequestTestPayload()
   255  		p.Action = api.HookIssueReviewed
   256  
   257  		pl, err := mc.Review(p, webhook_module.HookEventPullRequestReviewApproved)
   258  		require.NoError(t, err)
   259  
   260  		assert.Equal(t, "[test/repo] Pull request review approved: #12 Fix bug", pl.Title)
   261  		assert.Equal(t, "[test/repo] Pull request review approved: #12 Fix bug", pl.Summary)
   262  		assert.Len(t, pl.Sections, 1)
   263  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   264  		assert.Equal(t, "good job", pl.Sections[0].Text)
   265  		assert.Len(t, pl.Sections[0].Facts, 2)
   266  		for _, fact := range pl.Sections[0].Facts {
   267  			if fact.Name == "Repository:" {
   268  				assert.Equal(t, p.Repository.FullName, fact.Value)
   269  			} else if fact.Name == "Pull request #:" {
   270  				assert.Equal(t, "12", fact.Value)
   271  			} else {
   272  				t.Fail()
   273  			}
   274  		}
   275  		assert.Len(t, pl.PotentialAction, 1)
   276  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   277  		assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", pl.PotentialAction[0].Targets[0].URI)
   278  	})
   279  
   280  	t.Run("Repository", func(t *testing.T) {
   281  		p := repositoryTestPayload()
   282  
   283  		pl, err := mc.Repository(p)
   284  		require.NoError(t, err)
   285  
   286  		assert.Equal(t, "[test/repo] Repository created", pl.Title)
   287  		assert.Equal(t, "[test/repo] Repository created", pl.Summary)
   288  		assert.Len(t, pl.Sections, 1)
   289  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   290  		assert.Empty(t, pl.Sections[0].Text)
   291  		assert.Len(t, pl.Sections[0].Facts, 1)
   292  		for _, fact := range pl.Sections[0].Facts {
   293  			if fact.Name == "Repository:" {
   294  				assert.Equal(t, p.Repository.FullName, fact.Value)
   295  			} else {
   296  				t.Fail()
   297  			}
   298  		}
   299  		assert.Len(t, pl.PotentialAction, 1)
   300  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   301  		assert.Equal(t, "http://localhost:3000/test/repo", pl.PotentialAction[0].Targets[0].URI)
   302  	})
   303  
   304  	t.Run("Package", func(t *testing.T) {
   305  		p := packageTestPayload()
   306  
   307  		pl, err := mc.Package(p)
   308  		require.NoError(t, err)
   309  
   310  		assert.Equal(t, "Package created: GiteaContainer:latest", pl.Title)
   311  		assert.Equal(t, "Package created: GiteaContainer:latest", pl.Summary)
   312  		assert.Len(t, pl.Sections, 1)
   313  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   314  		assert.Empty(t, pl.Sections[0].Text)
   315  		assert.Len(t, pl.Sections[0].Facts, 1)
   316  		for _, fact := range pl.Sections[0].Facts {
   317  			if fact.Name == "Package:" {
   318  				assert.Equal(t, p.Package.Name, fact.Value)
   319  			} else {
   320  				t.Fail()
   321  			}
   322  		}
   323  		assert.Len(t, pl.PotentialAction, 1)
   324  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   325  		assert.Equal(t, "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest", pl.PotentialAction[0].Targets[0].URI)
   326  	})
   327  
   328  	t.Run("Wiki", func(t *testing.T) {
   329  		p := wikiTestPayload()
   330  
   331  		p.Action = api.HookWikiCreated
   332  		pl, err := mc.Wiki(p)
   333  		require.NoError(t, err)
   334  
   335  		assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment)", pl.Title)
   336  		assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment)", pl.Summary)
   337  		assert.Len(t, pl.Sections, 1)
   338  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   339  		assert.Equal(t, "", pl.Sections[0].Text)
   340  		assert.Len(t, pl.Sections[0].Facts, 2)
   341  		for _, fact := range pl.Sections[0].Facts {
   342  			if fact.Name == "Repository:" {
   343  				assert.Equal(t, p.Repository.FullName, fact.Value)
   344  			} else {
   345  				t.Fail()
   346  			}
   347  		}
   348  		assert.Len(t, pl.PotentialAction, 1)
   349  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   350  		assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.PotentialAction[0].Targets[0].URI)
   351  
   352  		p.Action = api.HookWikiEdited
   353  		pl, err = mc.Wiki(p)
   354  		require.NoError(t, err)
   355  
   356  		assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment)", pl.Title)
   357  		assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment)", pl.Summary)
   358  		assert.Len(t, pl.Sections, 1)
   359  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   360  		assert.Equal(t, "", pl.Sections[0].Text)
   361  		assert.Len(t, pl.Sections[0].Facts, 2)
   362  		for _, fact := range pl.Sections[0].Facts {
   363  			if fact.Name == "Repository:" {
   364  				assert.Equal(t, p.Repository.FullName, fact.Value)
   365  			} else {
   366  				t.Fail()
   367  			}
   368  		}
   369  		assert.Len(t, pl.PotentialAction, 1)
   370  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   371  		assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.PotentialAction[0].Targets[0].URI)
   372  
   373  		p.Action = api.HookWikiDeleted
   374  		pl, err = mc.Wiki(p)
   375  		require.NoError(t, err)
   376  
   377  		assert.Equal(t, "[test/repo] Wiki page 'index' deleted", pl.Title)
   378  		assert.Equal(t, "[test/repo] Wiki page 'index' deleted", pl.Summary)
   379  		assert.Len(t, pl.Sections, 1)
   380  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   381  		assert.Empty(t, pl.Sections[0].Text)
   382  		assert.Len(t, pl.Sections[0].Facts, 2)
   383  		for _, fact := range pl.Sections[0].Facts {
   384  			if fact.Name == "Repository:" {
   385  				assert.Equal(t, p.Repository.FullName, fact.Value)
   386  			} else {
   387  				t.Fail()
   388  			}
   389  		}
   390  		assert.Len(t, pl.PotentialAction, 1)
   391  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   392  		assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.PotentialAction[0].Targets[0].URI)
   393  	})
   394  
   395  	t.Run("Release", func(t *testing.T) {
   396  		p := pullReleaseTestPayload()
   397  
   398  		pl, err := mc.Release(p)
   399  		require.NoError(t, err)
   400  
   401  		assert.Equal(t, "[test/repo] Release created: v1.0", pl.Title)
   402  		assert.Equal(t, "[test/repo] Release created: v1.0", pl.Summary)
   403  		assert.Len(t, pl.Sections, 1)
   404  		assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle)
   405  		assert.Empty(t, pl.Sections[0].Text)
   406  		assert.Len(t, pl.Sections[0].Facts, 2)
   407  		for _, fact := range pl.Sections[0].Facts {
   408  			if fact.Name == "Repository:" {
   409  				assert.Equal(t, p.Repository.FullName, fact.Value)
   410  			} else if fact.Name == "Tag:" {
   411  				assert.Equal(t, "v1.0", fact.Value)
   412  			} else {
   413  				t.Fail()
   414  			}
   415  		}
   416  		assert.Len(t, pl.PotentialAction, 1)
   417  		assert.Len(t, pl.PotentialAction[0].Targets, 1)
   418  		assert.Equal(t, "http://localhost:3000/test/repo/releases/tag/v1.0", pl.PotentialAction[0].Targets[0].URI)
   419  	})
   420  }
   421  
   422  func TestMSTeamsJSONPayload(t *testing.T) {
   423  	p := pushTestPayload()
   424  	data, err := p.JSONPayload()
   425  	require.NoError(t, err)
   426  
   427  	hook := &webhook_model.Webhook{
   428  		RepoID:     3,
   429  		IsActive:   true,
   430  		Type:       webhook_module.MSTEAMS,
   431  		URL:        "https://msteams.example.com/",
   432  		Meta:       ``,
   433  		HTTPMethod: "POST",
   434  	}
   435  	task := &webhook_model.HookTask{
   436  		HookID:         hook.ID,
   437  		EventType:      webhook_module.HookEventPush,
   438  		PayloadContent: string(data),
   439  		PayloadVersion: 2,
   440  	}
   441  
   442  	req, reqBody, err := newMSTeamsRequest(context.Background(), hook, task)
   443  	require.NotNil(t, req)
   444  	require.NotNil(t, reqBody)
   445  	require.NoError(t, err)
   446  
   447  	assert.Equal(t, "POST", req.Method)
   448  	assert.Equal(t, "https://msteams.example.com/", req.URL.String())
   449  	assert.Equal(t, "sha256=", req.Header.Get("X-Hub-Signature-256"))
   450  	assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
   451  	var body MSTeamsPayload
   452  	err = json.NewDecoder(req.Body).Decode(&body)
   453  	assert.NoError(t, err)
   454  	assert.Equal(t, "[test/repo:test] 2 new commits", body.Summary)
   455  }