package webhook import ( "context" "net/http" "net/http/httptest" "testing" "tangled.org/core/spindle/db" "tangled.org/core/spindle/models" ) func TestDeliveriesSurviveTheCallersContext(t *testing.T) { const repoDid = "did:plc:detach" fires := map[string]func(*Service, context.Context, *db.Repo){ "push": func(s *Service, ctx context.Context, repo *db.Repo) { s.FirePush(ctx, repo, "did:plc:pusher", "refs/heads/main", "a", "b") }, "repository:renamed": func(s *Service, ctx context.Context, repo *db.Repo) { s.FireRename(ctx, repo.Owner, repo, "old", "new") }, "pull_request:created": func(s *Service, ctx context.Context, repo *db.Repo) { s.FirePullRequest(ctx, models.WebhookEventPullRequestCreated, repo, models.WebhookPullRequest{}, repo.Owner) }, } for event, fire := range fires { t.Run(event, func(t *testing.T) { arrived, release := make(chan struct{}, 1), make(chan struct{}) receiver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { arrived <- struct{}{} <-release })) defer receiver.Close() database := newTestDB(t) repo := &db.Repo{Knot: "knot.test", Owner: "did:plc:owner", Rkey: "repo", RepoDid: repoDid, Name: "repo"} if err := database.AddRepo(*repo); err != nil { t.Fatal(err) } hook := &models.Webhook{RepoDid: repoDid, Url: receiver.URL, Active: true, Events: []string{event}} if ok, err := database.AddWebhook(context.Background(), hook, 0, 0); err != nil || !ok { t.Fatalf("AddWebhook = %v, %v", ok, err) } s := New(database, true) ctx, cancel := context.WithCancel(context.Background()) fire(s, ctx, repo) <-arrived cancel() close(release) s.Close(context.Background()) got, err := database.GetWebhookDeliveriesForWebhooks(repoDid, []int64{hook.Id}, 10) if err != nil { t.Fatal(err) } if len(got) != 1 || !got[0].Success { t.Fatalf("deliveries = %+v, want one success", got) } }) } }