github.com/go-playground/webhooks/v6@v6.3.0/gitea/gitea_test.go (about)

     1  package gitea
     2  
     3  import (
     4  	"bytes"
     5  	"log"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"os"
     9  	"reflect"
    10  	"testing"
    11  
    12  	"io"
    13  
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  // NOTES:
    18  // - Run "go test" to run tests
    19  // - Run "gocov test | gocov report" to report on test converage by file
    20  // - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called
    21  //
    22  // or
    23  //
    24  // -- may be a good idea to change to output path to somewherelike /tmp
    25  // go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html
    26  //
    27  
    28  const (
    29  	path = "/webhooks"
    30  )
    31  
    32  var hook *Webhook
    33  
    34  func TestMain(m *testing.M) {
    35  
    36  	// setup
    37  	var err error
    38  	hook, err = New(Options.Secret("IsWishesWereHorsesWedAllBeEatingSteak!"))
    39  	if err != nil {
    40  		log.Fatal(err)
    41  	}
    42  	os.Exit(m.Run())
    43  	// teardown
    44  }
    45  
    46  func newServer(handler http.HandlerFunc) *httptest.Server {
    47  	mux := http.NewServeMux()
    48  	mux.HandleFunc(path, handler)
    49  	return httptest.NewServer(mux)
    50  }
    51  
    52  func TestBadRequests(t *testing.T) {
    53  	assert := require.New(t)
    54  	tests := []struct {
    55  		name    string
    56  		event   Event
    57  		payload io.Reader
    58  		headers http.Header
    59  	}{
    60  		{
    61  			name:    "BadNoEventHeader",
    62  			event:   PushEvent,
    63  			payload: bytes.NewBuffer([]byte("{}")),
    64  			headers: http.Header{},
    65  		},
    66  		{
    67  			name:    "UnsubscribedEvent",
    68  			event:   PushEvent,
    69  			payload: bytes.NewBuffer([]byte("{}")),
    70  			headers: http.Header{
    71  				"X-Gitea-Event": []string{"noneexistant_event"},
    72  			},
    73  		},
    74  		{
    75  			name:    "BadBody",
    76  			event:   PushEvent,
    77  			payload: bytes.NewBuffer([]byte("")),
    78  			headers: http.Header{
    79  				"X-Gitea-Event": []string{"push"},
    80  			},
    81  		},
    82  		{
    83  			name:    "BadSignatureLength",
    84  			event:   PushEvent,
    85  			payload: bytes.NewBuffer([]byte("{}")),
    86  			headers: http.Header{
    87  				"X-Gitea-Event":  []string{"push"},
    88  				"X-Gitea-Signature": []string{""},
    89  			},
    90  		},
    91  		{
    92  			name:    "BadSignatureMatch",
    93  			event:   PushEvent,
    94  			payload: bytes.NewBuffer([]byte("{}")),
    95  			headers: http.Header{
    96  				"X-Gitea-Event":  []string{"push"},
    97  				"X-Gitea-Signature": []string{"111"},
    98  			},
    99  		},
   100  	}
   101  
   102  	for _, tt := range tests {
   103  		tc := tt
   104  		client := &http.Client{}
   105  		t.Run(tt.name, func(t *testing.T) {
   106  			t.Parallel()
   107  			var parseError error
   108  			server := newServer(func(w http.ResponseWriter, r *http.Request) {
   109  				_, parseError = hook.Parse(r, tc.event)
   110  			})
   111  			defer server.Close()
   112  			req, err := http.NewRequest(http.MethodPost, server.URL+path, tc.payload)
   113  			assert.NoError(err)
   114  			req.Header = tc.headers
   115  			req.Header.Set("Content-Type", "application/json")
   116  
   117  			resp, err := client.Do(req)
   118  			assert.NoError(err)
   119  			assert.Equal(http.StatusOK, resp.StatusCode)
   120  			assert.Error(parseError)
   121  		})
   122  	}
   123  }
   124  
   125  func TestWebhooks(t *testing.T) {
   126  	assert := require.New(t)
   127  	tests := []struct {
   128  		name     string
   129  		event    Event
   130  		typ      interface{}
   131  		filename string
   132  		headers  http.Header
   133  	}{
   134  		{
   135  			name:     "CreateEvent",
   136  			event:    CreateEvent,
   137  			typ:      CreatePayload{},
   138  			filename: "../testdata/gitea/create-event.json",
   139  			headers: http.Header{
   140  				"X-Gitea-Event":   []string{"create"},
   141  				"X-Gitea-Signature": []string{"6f250ac7a090096574758e31bd31770eab63dfd0459404f0c18431f1c6b9024a"},
   142  			},
   143  		},
   144  		{
   145  			name:     "DeleteEvent",
   146  			event:    DeleteEvent,
   147  			typ:      DeletePayload{},
   148  			filename: "../testdata/gitea/delete-event.json",
   149  			headers: http.Header{
   150  				"X-Gitea-Event":   []string{"delete"},
   151  				"X-Gitea-Signature": []string{"84307b509e663cd897bc719b2a564e64fa4af8716fda389488f18369139e0fdd"},
   152  			},
   153  		},
   154  		{
   155  			name:     "ForkEvent",
   156  			event:    ForkEvent,
   157  			typ:      ForkPayload{},
   158  			filename: "../testdata/gitea/fork-event.json",
   159  			headers: http.Header{
   160  				"X-Gitea-Event":   []string{"fork"},
   161  				"X-Gitea-Signature": []string{"b7750f34adeaf333ac83a1fadcda4cbac097c8587e8dda297c3e7f059012215f"},
   162  			},
   163  		},
   164  		{
   165  			name:     "IssuesEvent",
   166  			event:    IssuesEvent,
   167  			typ:      IssuePayload{},
   168  			filename: "../testdata/gitea/issues-event.json",
   169  			headers: http.Header{
   170  				"X-Gitea-Event":   []string{"issues"},
   171  				"X-Gitea-Signature": []string{"98c44fd0ae42ca4208eac6f81e59b436837740abc8693bf828366b32d33b1cbc"},
   172  			},
   173  		},
   174  		{
   175  			name:     "IssueAssignEvent",
   176  			event:    IssueAssignEvent,
   177  			typ:      IssuePayload{},
   178  			filename: "../testdata/gitea/issue-assign-event.json",
   179  			headers: http.Header{
   180  				"X-Gitea-Event":   []string{"issue_assign"},
   181  				"X-Gitea-Signature": []string{"7d2adaf2fb3dc3769294c737ff48da003b7c3660b4f917b85c2c25dabd34a13c"},
   182  			},
   183  		},
   184  		{
   185  			name:     "IssueLabelEvent",
   186  			event:    IssueLabelEvent,
   187  			typ:      IssuePayload{},
   188  			filename: "../testdata/gitea/issue-label-event.json",
   189  			headers: http.Header{
   190  				"X-Gitea-Event":   []string{"issue_label"},
   191  				"X-Gitea-Signature": []string{"3611415860ed5904c87dd589a7c5fa7e87d2a72b0b2a92ea149ba9691ba8c785"},
   192  			},
   193  		},
   194  		{
   195  			name:     "IssueMilestoneEvent",
   196  			event:    IssueMilestoneEvent,
   197  			typ:      IssuePayload{},
   198  			filename: "../testdata/gitea/issue-milestone-event.json",
   199  			headers: http.Header{
   200  				"X-Gitea-Event":   []string{"issue_milestone"},
   201  				"X-Gitea-Signature": []string{"4b782b02035ca264c8e7782b8f2eb9d64e4a61344a1bc3a08fa85d7eed1e77b5"},
   202  			},
   203  		},
   204  		{
   205  			name:     "IssueCommentEvent",
   206  			event:    IssueCommentEvent,
   207  			typ:      IssueCommentPayload{},
   208  			filename: "../testdata/gitea/issue-comment-event.json",
   209  			headers: http.Header{
   210  				"X-Gitea-Event":   []string{"issue_comment"},
   211  				"X-Gitea-Signature": []string{"690180a8c853460cba88f9b09911a531d449e9f63ed6b1ff0a0def3b972ca744"},
   212  			},
   213  		},
   214  		{
   215  			name:     "PushEvent",
   216  			event:    PushEvent,
   217  			typ:      PushPayload{},
   218  			filename: "../testdata/gitea/push-event.json",
   219  			headers: http.Header{
   220  				"X-Gitea-Event":   []string{"push"},
   221  				"X-Gitea-Signature": []string{"60fe446c74fa0cb9474f98cc557db79e10c7aaf22cf324ad65239600b9e4d915"},
   222  			},
   223  		},
   224  		{
   225  			name:     "PullRequestEvent",
   226  			event:    PullRequestEvent,
   227  			typ:      PullRequestPayload{},
   228  			filename: "../testdata/gitea/pull-request-event.json",
   229  			headers: http.Header{
   230  				"X-Gitea-Event":   []string{"pull_request"},
   231  				"X-Gitea-Signature": []string{"65c18a212efc7bde0f336acaec87f596fe20e80b2a0e7e51a790dd38393ff771"},
   232  			},
   233  		},
   234  		{
   235  			name:     "PullRequestAssignEvent",
   236  			event:    PullRequestAssignEvent,
   237  			typ:      PullRequestPayload{},
   238  			filename: "../testdata/gitea/pull-request-assign-event.json",
   239  			headers: http.Header{
   240  				"X-Gitea-Event":   []string{"pull_request_assign"},
   241  				"X-Gitea-Signature": []string{"6e96f0515898d427d87fc022cef60e4a02695739e8eae05f8cccd79b2ce4809a"},
   242  			},
   243  		},
   244  		{
   245  			name:     "PullRequestLabelEvent",
   246  			event:    PullRequestLabelEvent,
   247  			typ:      PullRequestPayload{},
   248  			filename: "../testdata/gitea/pull-request-label-event.json",
   249  			headers: http.Header{
   250  				"X-Gitea-Event":   []string{"pull_request_label"},
   251  				"X-Gitea-Signature": []string{"c52fa035b8d9ac4d94449349b16bac5892bc59faa72be19ff39f33b6bc24315a"},
   252  			},
   253  		},
   254  		{
   255  			name:     "PullRequestMilestoneEvent",
   256  			event:    PullRequestMilestoneEvent,
   257  			typ:      PullRequestPayload{},
   258  			filename: "../testdata/gitea/pull-request-milestone-event.json",
   259  			headers: http.Header{
   260  				"X-Gitea-Event":   []string{"pull_request_milestone"},
   261  				"X-Gitea-Signature": []string{"38b2cf88e15b15795371517cb4121a92c7db1116f83eba57c13c192a7e0730dc"},
   262  			},
   263  		},
   264  		{
   265  			name:     "PullRequestCommentEvent",
   266  			event:    PullRequestCommentEvent,
   267  			typ:      IssueCommentPayload{},
   268  			filename: "../testdata/gitea/pull-request-comment-event.json",
   269  			headers: http.Header{
   270  				"X-Gitea-Event":   []string{"pull_request_comment"},
   271  				"X-Gitea-Signature": []string{"8b38bf221adbaef2ce01cfa810c6d9cb977414fec306895973aea61e10e8d5a8"},
   272  			},
   273  		},
   274  		{
   275  			name:     "PullRequestReviewEvent",
   276  			event:    PullRequestReviewEvent,
   277  			typ:      PullRequestPayload{},
   278  			filename: "../testdata/gitea/pull-request-review-event.json",
   279  			headers: http.Header{
   280  				"X-Gitea-Event":   []string{"pull_request_review"},
   281  				"X-Gitea-Signature": []string{"5d5c315cc199807a23da81b788dcf7874299a223ba81fc77d76ab248fdab4d1c"},
   282  			},
   283  		},
   284  		{
   285  			name:     "RepositoryEvent",
   286  			event:    RepositoryEvent,
   287  			typ:      RepositoryPayload{},
   288  			filename: "../testdata/gitea/repository-event.json",
   289  			headers: http.Header{
   290  				"X-Gitea-Event":   []string{"repository"},
   291  				"X-Gitea-Signature": []string{"52ca39cfb873254a9cbbda10f8a878f9df16216da6ae92267fc81352ac685d97"},
   292  			},
   293  		},
   294  		{
   295  			name:     "ReleaseEvent",
   296  			event:    ReleaseEvent,
   297  			typ:      ReleasePayload{},
   298  			filename: "../testdata/gitea/release-event.json",
   299  			headers: http.Header{
   300  				"X-Gitea-Event":   []string{"release"},
   301  				"X-Gitea-Signature": []string{"847fcef001c2e59dadac3fa5fa01ca26c9985a5faa10e48a9868a8ad98e9dd18"},
   302  			},
   303  		},
   304  	}
   305  
   306  	for _, tt := range tests {
   307  		tc := tt
   308  		client := &http.Client{}
   309  		t.Run(tt.name, func(t *testing.T) {
   310  			t.Parallel()
   311  			payload, err := os.Open(tc.filename)
   312  			assert.NoError(err)
   313  			defer func() {
   314  				_ = payload.Close()
   315  			}()
   316  
   317  			var parseError error
   318  			var results interface{}
   319  			server := newServer(func(w http.ResponseWriter, r *http.Request) {
   320  				results, parseError = hook.Parse(r, tc.event)
   321  			})
   322  			defer server.Close()
   323  			req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
   324  			assert.NoError(err)
   325  			req.Header = tc.headers
   326  			req.Header.Set("Content-Type", "application/json")
   327  
   328  			resp, err := client.Do(req)
   329  			assert.NoError(err)
   330  			assert.Equal(http.StatusOK, resp.StatusCode)
   331  			assert.NoError(parseError)
   332  			assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results))
   333  		})
   334  	}
   335  }