repo_visibility_webhook_test.go
1773 bytes
1package backend
2
3import (
4 "context"
5 "testing"
6
7 "github.com/charmbracelet/soft-serve/pkg/config"
8 "github.com/charmbracelet/soft-serve/pkg/db"
9 "github.com/charmbracelet/soft-serve/pkg/proto"
10 "github.com/charmbracelet/soft-serve/pkg/store"
11 "github.com/charmbracelet/soft-serve/pkg/webhook"
12 "github.com/matryer/is"
13)
14
15// TestSetPrivateWebhookOnlyOnChange verifies that the visibility change
16// webhook fires when visibility changes and not when it is set to the
17// value it already has.
18func TestSetPrivateWebhookOnlyOnChange(t *testing.T) {
19 is := is.New(t)
20 be, cfg := newTestBackend(t)
21
22 ctx := context.Background()
23 ctx = config.WithContext(ctx, cfg)
24 ctx = db.WithContext(ctx, be.db)
25 ctx = store.WithContext(ctx, be.store)
26 admin, err := be.User(ctx, "admin")
27 is.NoErr(err)
28 ctx = proto.WithUserContext(ctx, admin)
29
30 repo, err := be.CreateRepository(ctx, "repo", nil, proto.RepositoryOptions{})
31 is.NoErr(err)
32
33 // Deliveries to this address fail fast, but are still recorded.
34 var hookID int64
35 is.NoErr(be.db.TransactionContext(ctx, func(tx *db.Tx) error {
36 hookID, err = be.store.CreateWebhook(ctx, tx, repo.ID(), "http://127.0.0.1:1/", "", int(webhook.ContentTypeJSON), true)
37 if err != nil {
38 return err
39 }
40 return be.store.CreateWebhookEvents(ctx, tx, hookID, []int{int(webhook.EventRepositoryVisibilityChange)})
41 }))
42
43 deliveries := func() int {
44 ds, err := be.store.ListWebhookDeliveriesByWebhookID(ctx, be.db, hookID)
45 is.NoErr(err)
46 return len(ds)
47 }
48
49 is.NoErr(be.SetPrivate(ctx, "repo", false))
50 is.Equal(deliveries(), 0)
51
52 is.NoErr(be.SetPrivate(ctx, "repo", true))
53 is.Equal(deliveries(), 1)
54
55 is.NoErr(be.SetPrivate(ctx, "repo", true))
56 is.Equal(deliveries(), 1)
57
58 is.NoErr(be.SetPrivate(ctx, "repo", false))
59 is.Equal(deliveries(), 2)
60}