github.com/go-playground/webhooks/v6@v6.3.0/gogs/gogs_test.go (about) 1 package gogs 2 3 import ( 4 "bytes" 5 "io" 6 "log" 7 "net/http" 8 "net/http/httptest" 9 "os" 10 "reflect" 11 "testing" 12 13 client "github.com/gogits/go-gogs-client" 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("sampleToken!")) 39 if err != nil { 40 log.Fatal(err) 41 } 42 os.Exit(m.Run()) 43 44 //teardown 45 46 } 47 48 func newServer(handler http.HandlerFunc) *httptest.Server { 49 mux := http.NewServeMux() 50 mux.HandleFunc(path, handler) 51 return httptest.NewServer(mux) 52 } 53 54 func TestBadRequests(t *testing.T) { 55 assert := require.New(t) 56 tests := []struct { 57 name string 58 event Event 59 payload io.Reader 60 headers http.Header 61 }{ 62 { 63 name: "BadNoEventHeader", 64 event: CreateEvent, 65 payload: bytes.NewBuffer([]byte("{}")), 66 headers: http.Header{}, 67 }, 68 { 69 name: "UnsubscribedEvent", 70 event: CreateEvent, 71 payload: bytes.NewBuffer([]byte("{}")), 72 headers: http.Header{ 73 "X-Gogs-Event": []string{"noneexistant_event"}, 74 }, 75 }, 76 { 77 name: "BadBody", 78 event: PushEvent, 79 payload: bytes.NewBuffer([]byte("")), 80 headers: http.Header{ 81 "X-Gogs-Event": []string{"push"}, 82 "X-Gogs-Signature": []string{"0dacdb7c00bc1cdc0c24038b7b244cf65146b33da862a769e2608a063529fffc"}, 83 }, 84 }, 85 { 86 name: "BadSignatureLength", 87 event: PushEvent, 88 payload: bytes.NewBuffer([]byte("{}")), 89 headers: http.Header{ 90 "X-Gogs-Event": []string{"push"}, 91 "X-Gogs-Signature": []string{""}, 92 }, 93 }, 94 { 95 name: "BadSignatureMatch", 96 event: PushEvent, 97 payload: bytes.NewBuffer([]byte("{}")), 98 headers: http.Header{ 99 "X-Github-Event": []string{"push"}, 100 "X-Gogs-Signature": []string{"111"}, 101 }, 102 }, 103 } 104 105 for _, tt := range tests { 106 tc := tt 107 client := &http.Client{} 108 t.Run(tt.name, func(t *testing.T) { 109 t.Parallel() 110 var parseError error 111 server := newServer(func(w http.ResponseWriter, r *http.Request) { 112 _, parseError = hook.Parse(r, tc.event) 113 }) 114 defer server.Close() 115 req, err := http.NewRequest(http.MethodPost, server.URL+path, tc.payload) 116 assert.NoError(err) 117 req.Header = tc.headers 118 req.Header.Set("Content-Type", "application/json") 119 120 resp, err := client.Do(req) 121 assert.NoError(err) 122 assert.Equal(http.StatusOK, resp.StatusCode) 123 assert.Error(parseError) 124 }) 125 } 126 } 127 128 func TestWebhooks(t *testing.T) { 129 assert := require.New(t) 130 tests := []struct { 131 name string 132 event Event 133 typ interface{} 134 filename string 135 headers http.Header 136 }{ 137 { 138 name: "CreateEvent", 139 event: CreateEvent, 140 typ: client.CreatePayload{}, 141 filename: "../testdata/gogs/create-event.json", 142 headers: http.Header{ 143 "X-Gogs-Delivery": []string{"f6266f16-1bf3-46a5-9ea4-602e06ead473"}, 144 "X-Gogs-Event": []string{"create"}, 145 "X-Gogs-Signature": []string{"d3c99a5711de365c4ff897be0692d9016de2cee6e3e1d6b3fb49154f9efb354d"}, 146 }, 147 }, 148 { 149 name: "DeleteEvent", 150 event: DeleteEvent, 151 typ: client.DeletePayload{}, 152 filename: "../testdata/gogs/delete-event.json", 153 headers: http.Header{ 154 "X-Gogs-Delivery": []string{"f6266f16-1bf3-46a5-9ea4-602e06ead473"}, 155 "X-Gogs-Event": []string{"delete"}, 156 "X-Gogs-Signature": []string{"6208970efc3c5283df65f726d69ae8331491d7857f812dfaeaedf11a68d8da79"}, 157 }, 158 }, 159 { 160 name: "ForkEvent", 161 event: ForkEvent, 162 typ: client.ForkPayload{}, 163 filename: "../testdata/gogs/fork-event.json", 164 headers: http.Header{ 165 "X-Gogs-Delivery": []string{"f6266f16-1bf3-46a5-9ea4-602e06ead473"}, 166 "X-Gogs-Event": []string{"fork"}, 167 "X-Gogs-Signature": []string{"bd5fda972bd27745d9e108c3d92a926a47baf8b715a422f73ff9acdfa6a86402"}, 168 }, 169 }, 170 { 171 name: "PushEvent", 172 event: PushEvent, 173 typ: client.PushPayload{}, 174 filename: "../testdata/gogs/push-event.json", 175 headers: http.Header{ 176 "X-Gogs-Delivery": []string{"f6266f16-1bf3-46a5-9ea4-602e06ead473"}, 177 "X-Gogs-Event": []string{"push"}, 178 "X-Gogs-Signature": []string{"83d4163fb936904aeb9ffd6ce22cf86e4b36273b2e1c63a57f5a6ddc371ce3ba"}, 179 }, 180 }, 181 { 182 name: "IssuesEvent", 183 event: IssuesEvent, 184 typ: client.IssuesPayload{}, 185 filename: "../testdata/gogs/issues-event.json", 186 headers: http.Header{ 187 "X-Gogs-Delivery": []string{"f6266f16-1bf3-46a5-9ea4-602e06ead473"}, 188 "X-Gogs-Event": []string{"issues"}, 189 "X-Gogs-Signature": []string{"bb61f632278cc601f37bc0a611e2a06bba3b53453f3e58092dc20ffa0cec6916"}, 190 }, 191 }, 192 { 193 name: "IssueCommentEvent", 194 event: IssueCommentEvent, 195 typ: client.IssueCommentPayload{}, 196 filename: "../testdata/gogs/issue-comment-event.json", 197 headers: http.Header{ 198 "X-Gogs-Delivery": []string{"f6266f16-1bf3-46a5-9ea4-602e06ead473"}, 199 "X-Gogs-Event": []string{"issue_comment"}, 200 "X-Gogs-Signature": []string{"1d45142f03ed44a06d6630e57aa8c8c0ad7ed90a57cc0ee9fec8fb5434efd92e"}, 201 }, 202 }, 203 { 204 name: "PullRequestEvent", 205 event: PullRequestEvent, 206 typ: client.PullRequestPayload{}, 207 filename: "../testdata/gogs/pull-request-event.json", 208 headers: http.Header{ 209 "X-Gogs-Delivery": []string{"f6266f16-1bf3-46a5-9ea4-602e06ead473"}, 210 "X-Gogs-Event": []string{"pull_request"}, 211 "X-Gogs-Signature": []string{"69105ac4cada9f0b099be34722b26d3854be20988c26bd9e135fec74a830d00a"}, 212 }, 213 }, 214 { 215 name: "ReleaseEvent", 216 event: ReleaseEvent, 217 typ: client.ReleasePayload{}, 218 filename: "../testdata/gogs/release-event.json", 219 headers: http.Header{ 220 "X-Gogs-Delivery": []string{"f6266f16-1bf3-46a5-9ea4-602e06ead473"}, 221 "X-Gogs-Event": []string{"release"}, 222 "X-Gogs-Signature": []string{"93bfcfb879642dbc28136266b1f7d56d053fa08332aa1f4d884a66ced2b5f10a"}, 223 }, 224 }, 225 } 226 227 for _, tt := range tests { 228 tc := tt 229 client := &http.Client{} 230 t.Run(tt.name, func(t *testing.T) { 231 t.Parallel() 232 payload, err := os.Open(tc.filename) 233 assert.NoError(err) 234 defer func() { 235 _ = payload.Close() 236 }() 237 238 var parseError error 239 var results interface{} 240 server := newServer(func(w http.ResponseWriter, r *http.Request) { 241 results, parseError = hook.Parse(r, tc.event) 242 }) 243 defer server.Close() 244 req, err := http.NewRequest(http.MethodPost, server.URL+path, payload) 245 assert.NoError(err) 246 req.Header = tc.headers 247 req.Header.Set("Content-Type", "application/json") 248 249 resp, err := client.Do(req) 250 assert.NoError(err) 251 assert.Equal(http.StatusOK, resp.StatusCode) 252 assert.NoError(parseError) 253 assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results)) 254 }) 255 } 256 }