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 }