(t *testing.T)
| 191 | } |
| 192 | |
| 193 | func TestWebhookDispatch(t *testing.T) { |
| 194 | t.Parallel() |
| 195 | |
| 196 | // SETUP |
| 197 | |
| 198 | ctx := dbauthz.AsNotifier(testutil.Context(t, testutil.WaitSuperLong)) |
| 199 | store, pubsub := dbtestutil.NewDB(t) |
| 200 | logger := testutil.Logger(t) |
| 201 | |
| 202 | sent := make(chan dispatch.WebhookPayload, 1) |
| 203 | // Mock server to simulate webhook endpoint. |
| 204 | server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 205 | var payload dispatch.WebhookPayload |
| 206 | err := json.NewDecoder(r.Body).Decode(&payload) |
| 207 | assert.NoError(t, err) |
| 208 | assert.Equal(t, "application/json", r.Header.Get("Content-Type")) |
| 209 | |
| 210 | w.WriteHeader(http.StatusOK) |
| 211 | _, err = w.Write([]byte("noted.")) |
| 212 | assert.NoError(t, err) |
| 213 | sent <- payload |
| 214 | })) |
| 215 | defer server.Close() |
| 216 | |
| 217 | endpoint, err := url.Parse(server.URL) |
| 218 | require.NoError(t, err) |
| 219 | |
| 220 | // GIVEN: a webhook setup referencing a mock HTTP server to receive the webhook |
| 221 | cfg := defaultNotificationsConfig(database.NotificationMethodWebhook) |
| 222 | cfg.Webhook = codersdk.NotificationsWebhookConfig{ |
| 223 | Endpoint: *serpent.URLOf(endpoint), |
| 224 | } |
| 225 | mgr, err := notifications.NewManager(cfg, store, pubsub, defaultHelpers(), createMetrics(), logger.Named("manager")) |
| 226 | require.NoError(t, err) |
| 227 | t.Cleanup(func() { |
| 228 | assert.NoError(t, mgr.Stop(ctx)) |
| 229 | }) |
| 230 | enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal()) |
| 231 | require.NoError(t, err) |
| 232 | |
| 233 | const ( |
| 234 | email = "bob@coder.com" |
| 235 | name = "Robert McBobbington" |
| 236 | username = "bob" |
| 237 | ) |
| 238 | user := dbgen.User(t, store, database.User{ |
| 239 | Email: email, |
| 240 | Username: username, |
| 241 | Name: name, |
| 242 | }) |
| 243 | |
| 244 | // WHEN: a notification is enqueued (including arbitrary labels) |
| 245 | input := map[string]string{ |
| 246 | "a": "b", |
| 247 | "c": "d", |
| 248 | } |
| 249 | msgID, err := enq.Enqueue(ctx, user.ID, notifications.TemplateWorkspaceDeleted, input, "test") |
| 250 | require.NoError(t, err) |
nothing calls this directly
no test coverage detected