package spindle
import (
"context"
"strings"
"testing"
"tangled.org/core/api/org_tangled"
"tangled.org/core/spindle/config"
"tangled.org/core/spindle/db"
"tangled.org/core/spindle/models"
)
func setAllowed(t *testing.T, d *db.DB, allowed bool) {
t.Helper()
change := db.RemoveFromAllowlist
if allowed {
change = db.AddToAllowlist
}
if err := change(d, testOwner); err != nil {
t.Fatal(err)
}
}
func newPausedHookEnv(t *testing.T) *hookEnv {
t.Helper()
h := newHookEnv(t)
// the server isn't started yet, nothing reads the config while it's set
h.s.cfg.Server.Admission = config.AdmissionClosed
h.s.cfg.Server.Owner = pausedOwner.String()
return h
}
func TestPausedOwnersPushFiresNoWebhookUntilReAdded(t *testing.T) {
h := newPausedHookEnv(t)
pushOf := func(sha string) *org_tangled.EventNotifyEvent_Input_Event {
event := pushEvent("refs/heads/main", "skip-ci")
event.EventPush.NewSha = strings.Repeat(sha, 40)
return event
}
setAllowed(t, h.s.db, true)
h.notify(t, pushOf("3"))
h.expectPush(t)
setAllowed(t, h.s.db, false)
if pipeline := h.notify(t, pushOf("4")); pipeline != "" {
t.Fatalf("a paused owner's push made pipeline %q", pipeline)
}
h.expectNoPush(t, "a paused owner's push fired a webhook")
setAllowed(t, h.s.db, true)
h.notify(t, pushOf("5"))
h.expectPush(t)
}
func newClosedPullEnv(t *testing.T, enroll func(*db.DB) error) *pullEnv {
t.Helper()
w := newWorld(t)
w.admission = config.AdmissionClosed
w.owner = pausedOwner
n := w.boot()
if err := enroll(n.s.db); err != nil {
t.Fatal(err)
}
// boot tracks the allowed owners, the test has to too
n.s.backfill.Track(testOwner)
w.seed(n, testBob)
e := &pullEnv{world: w, n: n, sink: newSink(t)}
w.subscribe(n, e.sink, pullEvents...)
return e
}
func TestPausedOwnersPullEventsFireNoWebhookUntilReAdded(t *testing.T) {
e := newClosedPullEnv(t, listOwner)
e.ticket("open", testBob, opCreate)
e.patch(patchOne, patchSha1, testBob)
e.sink.expect(t, 1)
setAllowed(t, e.n.s.db, false)
e.ticket("closed", testCarol, "update")
e.sink.expect(t, 1)
setAllowed(t, e.n.s.db, true)
e.ticket("open", testBob, "update")
e.sink.expect(t, 2)
}
func TestPausedOwnersRenameFiresNoWebhookUntilReAdded(t *testing.T) {
h := newPausedHookEnv(t)
hooks, err := h.s.db.GetWebhooksForRepo(testRepoDid)
if err != nil || len(hooks) != 1 {
t.Fatalf("hooks = %+v, %v, want the fixture's one", hooks, err)
}
hook := hooks[0]
hook.Events = append(hook.Events, string(models.WebhookEventRepoRenamed))
if err := h.s.db.UpdateWebhook(&hook); err != nil {
t.Fatal(err)
}
repo, err := h.s.db.GetRepoByDid(testRepoDid)
if err != nil {
t.Fatal(err)
}
rename := func() { h.s.wh.FireRename(context.Background(), testBob, repo, "old", "new") }
setAllowed(t, h.s.db, true)
rename()
h.expectPush(t)
setAllowed(t, h.s.db, false)
rename()
h.expectNoPush(t, "a paused owner's rename fired a webhook")
setAllowed(t, h.s.db, true)
rename()
h.expectPush(t)
}