~james/core

core/spindle/pause_webhook_test.go -rw-r--r-- 2.9 KiB
452f17b7 — james chore(import): snapshot james.dad.town/core at f70c71c7696a 14 hours ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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)
}