github.com/go-playground/webhooks/v6@v6.3.0/bitbucket-server/bitbucketserver_test.go (about)

     1  package bitbucketserver
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"log"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"os"
    10  	"reflect"
    11  	"testing"
    12  
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  const (
    17  	path = "/webhooks"
    18  )
    19  
    20  var hook *Webhook
    21  
    22  func TestMain(m *testing.M) {
    23  	// setup
    24  	var err error
    25  	hook, err = New(Options.Secret("secret"))
    26  	if err != nil {
    27  		log.Fatal(err)
    28  	}
    29  	os.Exit(m.Run())
    30  	// teardown
    31  }
    32  
    33  func newServer(handler http.HandlerFunc) *httptest.Server {
    34  	mux := http.NewServeMux()
    35  	mux.HandleFunc(path, handler)
    36  	return httptest.NewServer(mux)
    37  }
    38  
    39  func TestBadRequests(t *testing.T) {
    40  	assert := require.New(t)
    41  	tests := []struct {
    42  		name    string
    43  		event   Event
    44  		payload io.Reader
    45  		headers http.Header
    46  	}{
    47  		{
    48  			name:    "BadNoEventHeader",
    49  			event:   RepositoryReferenceChangedEvent,
    50  			payload: bytes.NewBuffer([]byte("{}")),
    51  			headers: http.Header{},
    52  		},
    53  		{
    54  			name:    "BadSignatureLength",
    55  			event:   RepositoryReferenceChangedEvent,
    56  			payload: bytes.NewBuffer([]byte("{}")),
    57  			headers: http.Header{
    58  				"X-Event-Key":     []string{"repo:refs_changed"},
    59  				"X-Hub-Signature": []string{""},
    60  			},
    61  		},
    62  		{
    63  			name:    "BadSignatureMatch",
    64  			event:   RepositoryReferenceChangedEvent,
    65  			payload: bytes.NewBuffer([]byte("{}")),
    66  			headers: http.Header{
    67  				"X-Event-Key":     []string{"repo:refs_changed"},
    68  				"X-Hub-Signature": []string{"sha256=111"},
    69  			},
    70  		},
    71  		{
    72  			name:    "UnsubscribedEvent",
    73  			event:   RepositoryReferenceChangedEvent,
    74  			payload: bytes.NewBuffer([]byte("{}")),
    75  			headers: http.Header{
    76  				"X-Event-Key":     []string{"nonexistent_event"},
    77  				"X-Hub-Signature": []string{"sha256=111"},
    78  			},
    79  		},
    80  	}
    81  
    82  	for _, tt := range tests {
    83  		tc := tt
    84  		client := &http.Client{}
    85  		t.Run(tt.name, func(t *testing.T) {
    86  			t.Parallel()
    87  			var parseError error
    88  			server := newServer(func(w http.ResponseWriter, r *http.Request) {
    89  				_, parseError = hook.Parse(r, tc.event)
    90  			})
    91  			defer server.Close()
    92  
    93  			req, err := http.NewRequest(http.MethodPost, server.URL+path, tc.payload)
    94  			assert.NoError(err)
    95  			req.Header = tc.headers
    96  			req.Header.Set("Content-Type", "application/json")
    97  
    98  			resp, err := client.Do(req)
    99  
   100  			assert.NoError(err)
   101  			assert.Equal(http.StatusOK, resp.StatusCode)
   102  			assert.Error(parseError)
   103  		})
   104  	}
   105  }
   106  
   107  func TestWebhooks(t *testing.T) {
   108  	assert := require.New(t)
   109  	tests := []struct {
   110  		name        string
   111  		event       Event
   112  		payloadType interface{}
   113  		filename    string
   114  		headers     http.Header
   115  	}{
   116  		{
   117  			name:        "Repository refs updated",
   118  			event:       RepositoryReferenceChangedEvent,
   119  			payloadType: RepositoryReferenceChangedPayload{},
   120  			filename:    "../testdata/bitbucket-server/repo-refs-changed.json",
   121  			headers: http.Header{
   122  				"X-Event-Key":     []string{"repo:refs_changed"},
   123  				"X-Hub-Signature": []string{"sha256=8a60f7487d167f55886df87d4077192035d76f76a8e0b3a48fd8ae8cad25f391"},
   124  			},
   125  		},
   126  		{
   127  			name:        "Repository modified",
   128  			event:       RepositoryModifiedEvent,
   129  			payloadType: RepositoryModifiedPayload{},
   130  			filename:    "../testdata/bitbucket-server/repo-modified.json",
   131  			headers: http.Header{
   132  				"X-Event-Key":     []string{"repo:modified"},
   133  				"X-Hub-Signature": []string{"sha256=1511ed69d7697ede1699b0217e17b7d0b492eeccc9a5649d5d30dd84f0e5a89a"},
   134  			},
   135  		},
   136  		{
   137  			name:        "Repository forked",
   138  			event:       RepositoryForkedEvent,
   139  			payloadType: RepositoryForkedPayload{},
   140  			filename:    "../testdata/bitbucket-server/repo-forked.json",
   141  			headers: http.Header{
   142  				"X-Event-Key":     []string{"repo:forked"},
   143  				"X-Hub-Signature": []string{"sha256=d34115023042f9e7ef7020200650e2f34da137e0217708475f9b749ad889a16d"},
   144  			},
   145  		},
   146  		{
   147  			name:        "Repository commit comment edited",
   148  			event:       RepositoryCommentEditedEvent,
   149  			payloadType: RepositoryCommentEditedPayload{},
   150  			filename:    "../testdata/bitbucket-server/repo-comment-edited.json",
   151  			headers: http.Header{
   152  				"X-Event-Key":     []string{"repo:comment:edited"},
   153  				"X-Hub-Signature": []string{"sha256=90a8f4898d8dd7a4ef99e33a7f1d86dd3645f45b2a5b59110493cc4b3062a712"},
   154  			},
   155  		},
   156  		{
   157  			name:        "Repository commit comment deleted",
   158  			event:       RepositoryCommentDeletedEvent,
   159  			payloadType: RepositoryCommentDeletedPayload{},
   160  			filename:    "../testdata/bitbucket-server/repo-comment-deleted.json",
   161  			headers: http.Header{
   162  				"X-Event-Key":     []string{"repo:comment:deleted"},
   163  				"X-Hub-Signature": []string{"sha256=e8b6d3d1581366c9f65949c93149b29ba33252f6afa807432f8f823fb08680e7"},
   164  			},
   165  		},
   166  		{
   167  			name:        "Repository commit comment added",
   168  			event:       RepositoryCommentAddedEvent,
   169  			payloadType: RepositoryCommentAddedPayload{},
   170  			filename:    "../testdata/bitbucket-server/repo-comment-added.json",
   171  			headers: http.Header{
   172  				"X-Event-Key":     []string{"repo:comment:added"},
   173  				"X-Hub-Signature": []string{"sha256=80b121d53ec48bb3f8bed9243ba53be62c8eb7d1ce0395ca87fef1938bf9620e"},
   174  			},
   175  		},
   176  		{
   177  			name:        "Pull request unapproved",
   178  			event:       PullRequestReviewerUnapprovedEvent,
   179  			payloadType: PullRequestReviewerUnapprovedPayload{},
   180  			filename:    "../testdata/bitbucket-server/pr-reviewer-unapproved.json",
   181  			headers: http.Header{
   182  				"X-Event-Key":     []string{"pr:reviewer:unapproved"},
   183  				"X-Hub-Signature": []string{"sha256=9822024378738817dc85c0a41feb9fa4825058d28a9a1ee7065bfacd6a04c7c1"},
   184  			},
   185  		},
   186  		{
   187  			name:        "Pull request reviewer updated",
   188  			event:       PullRequestReviewerUpdatedEvent,
   189  			payloadType: PullRequestReviewerUpdatedPayload{},
   190  			filename:    "../testdata/bitbucket-server/pr-reviewer-updated.json",
   191  			headers: http.Header{
   192  				"X-Event-Key":     []string{"pr:reviewer:updated"},
   193  				"X-Hub-Signature": []string{"sha256=07ca94a0a5c5913819a16ce0414f976023aeb0065fa9d80f990aad7f1d936be5"},
   194  			},
   195  		},
   196  		{
   197  			name:        "Pull request opened",
   198  			event:       PullRequestOpenedEvent,
   199  			payloadType: PullRequestOpenedPayload{},
   200  			filename:    "../testdata/bitbucket-server/pr-opened.json",
   201  			headers: http.Header{
   202  				"X-Event-Key":     []string{"pr:opened"},
   203  				"X-Hub-Signature": []string{"sha256=b82c323978a741aa256c0a6bfa13a8f211e1795bd8ddb2641ced122769f7a7c6"},
   204  			},
   205  		},
   206  		{
   207  			name:        "Pull request modified",
   208  			event:       PullRequestModifiedEvent,
   209  			payloadType: PullRequestModifiedPayload{},
   210  			filename:    "../testdata/bitbucket-server/pr-modified.json",
   211  			headers: http.Header{
   212  				"X-Event-Key":     []string{"pr:modified"},
   213  				"X-Hub-Signature": []string{"sha256=1e307462390ff6f0c59fcdb8eb4b2977058b5cbc502a24a0db385f5331136227"},
   214  			},
   215  		},
   216  		{
   217  			name:        "Pull request merged",
   218  			event:       PullRequestMergedEvent,
   219  			payloadType: PullRequestMergedPayload{},
   220  			filename:    "../testdata/bitbucket-server/pr-merged.json",
   221  			headers: http.Header{
   222  				"X-Event-Key":     []string{"pr:merged"},
   223  				"X-Hub-Signature": []string{"sha256=adbee42ddd6a178b0c1160e89f666b53fb8c76495f782a4e3055e3fbee232704"},
   224  			},
   225  		},
   226  		{
   227  			name:        "Pull request marked needs work",
   228  			event:       PullRequestReviewerNeedsWorkEvent,
   229  			payloadType: PullRequestReviewerNeedsWorkPayload{},
   230  			filename:    "../testdata/bitbucket-server/pr-reviewer-needs-work.json",
   231  			headers: http.Header{
   232  				"X-Event-Key":     []string{"pr:reviewer:needs_work"},
   233  				"X-Hub-Signature": []string{"sha256=3d10aadcede2131674654bb48c10fe904b0b2ed3d3b283bdc5c64dbc4856582d"},
   234  			},
   235  		},
   236  		{
   237  			name:        "Pull request deleted",
   238  			event:       PullRequestDeletedEvent,
   239  			payloadType: PullRequestDeletedPayload{},
   240  			filename:    "../testdata/bitbucket-server/pr-deleted.json",
   241  			headers: http.Header{
   242  				"X-Event-Key":     []string{"pr:deleted"},
   243  				"X-Hub-Signature": []string{"sha256=657c5d9839c0e3c1c95e5ceceacb07f0e372328883dab6e25bb619ee8b19a359"},
   244  			},
   245  		},
   246  		{
   247  			name:        "Pull request declined",
   248  			event:       PullRequestDeclinedEvent,
   249  			payloadType: PullRequestDeclinedPayload{},
   250  			filename:    "../testdata/bitbucket-server/pr-declined.json",
   251  			headers: http.Header{
   252  				"X-Event-Key":     []string{"pr:declined"},
   253  				"X-Hub-Signature": []string{"sha256=e323ab4d057f32475340d03c90aa9ec20cd3a96c15200d75e59f221c14053528"},
   254  			},
   255  		},
   256  		{
   257  			name:        "Pull request comment edited",
   258  			event:       PullRequestCommentEditedEvent,
   259  			payloadType: PullRequestCommentEditedPayload{},
   260  			filename:    "../testdata/bitbucket-server/pr-comment-edited.json",
   261  			headers: http.Header{
   262  				"X-Event-Key":     []string{"pr:comment:edited"},
   263  				"X-Hub-Signature": []string{"sha256=66580d1b02904e470cb48c1333452ea0748aecc3a9806f5a0f949be3a8b0a5ec"},
   264  			},
   265  		},
   266  		{
   267  			name:        "Pull request comment deleted",
   268  			event:       PullRequestCommentDeletedEvent,
   269  			payloadType: PullRequestCommentDeletedPayload{},
   270  			filename:    "../testdata/bitbucket-server/pr-comment-deleted.json",
   271  			headers: http.Header{
   272  				"X-Event-Key":     []string{"pr:comment:deleted"},
   273  				"X-Hub-Signature": []string{"sha256=7c9575a6e9b141e063ef34e5066ebe67c3a5b59241e633d1332d70aba468fd04"},
   274  			},
   275  		},
   276  		{
   277  			name:        "Pull request comment added",
   278  			event:       PullRequestReviewerApprovedEvent,
   279  			payloadType: PullRequestReviewerApprovedPayload{},
   280  			filename:    "../testdata/bitbucket-server/pr-reviewer-approved.json",
   281  			headers: http.Header{
   282  				"X-Event-Key":     []string{"pr:reviewer:approved"},
   283  				"X-Hub-Signature": []string{"sha256=a8b78d774dea02f234069f724ee6c6a3c5c13fc3a3b856dac0a33d8ed9ec1823"},
   284  			},
   285  		},
   286  	}
   287  
   288  	for _, tt := range tests {
   289  		tc := tt
   290  		client := &http.Client{}
   291  		t.Run(tt.name, func(t *testing.T) {
   292  			t.Parallel()
   293  			payload, err := os.Open(tc.filename)
   294  			assert.NoError(err)
   295  			defer func() {
   296  				_ = payload.Close()
   297  			}()
   298  
   299  			var parseError error
   300  			var results interface{}
   301  
   302  			server := newServer(func(w http.ResponseWriter, r *http.Request) {
   303  				results, parseError = hook.Parse(r, tc.event)
   304  			})
   305  			defer server.Close()
   306  
   307  			req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
   308  			assert.NoError(err)
   309  			req.Header = tc.headers
   310  			req.Header.Set("Content-Type", "application/json")
   311  
   312  			resp, err := client.Do(req)
   313  			assert.NoError(err)
   314  			assert.Equal(http.StatusOK, resp.StatusCode)
   315  			assert.NoError(parseError)
   316  			assert.Equal(reflect.TypeOf(tc.payloadType), reflect.TypeOf(results))
   317  		})
   318  	}
   319  }