File view with blame information shown in the left gutter beside each line.

barerepo / server / e2e/proposal_cap_test.go
63 lines · 2.2kb · 133728eaa05486504991b230f9d4c7e986b7defc
log files threads runs releases config jump to file t
133728e barerepo 1mo
1
package e2e
133728e barerepo 1mo
2
133728e barerepo 1mo
3
import (
133728e barerepo 1mo
4
"fmt"
133728e barerepo 1mo
5
"os"
133728e barerepo 1mo
6
"os/exec"
133728e barerepo 1mo
7
"strings"
133728e barerepo 1mo
8
"testing"
133728e barerepo 1mo
9
)
133728e barerepo 1mo
10
133728e barerepo 1mo
11
// setLimits appends a limits block to an instance's config, which the hooks read at push time.
133728e barerepo 1mo
12
func setLimits(t *testing.T, in *instance, block string) {
133728e barerepo 1mo
13
t.Helper()
133728e barerepo 1mo
14
body, err := os.ReadFile(in.cfg.Path)
133728e barerepo 1mo
15
if err != nil {
133728e barerepo 1mo
16
t.Fatal(err)
133728e barerepo 1mo
17
}
133728e barerepo 1mo
18
if err := os.WriteFile(in.cfg.Path, append(body, []byte(block)...), 0o600); err != nil {
133728e barerepo 1mo
19
t.Fatal(err)
133728e barerepo 1mo
20
}
133728e barerepo 1mo
21
}
133728e barerepo 1mo
22
133728e barerepo 1mo
23
// Chapter 27: rule 5 is an open door, and a cap on open proposals is how it is defended.
133728e barerepo 1mo
24
func TestOpenProposalsAreCappedPerAccountPerRepository(t *testing.T) {
133728e barerepo 1mo
25
if _, err := exec.LookPath("git"); err != nil {
133728e barerepo 1mo
26
t.Skip("git is not installed")
133728e barerepo 1mo
27
}
133728e barerepo 1mo
28
in := newInstance(t)
133728e barerepo 1mo
29
john := in.account("john")
133728e barerepo 1mo
30
mark := in.account("mark")
133728e barerepo 1mo
31
seed(t, in, john, "john", "johnbot")
133728e barerepo 1mo
32
setLimits(t, in, "\n[limits]\nmax_open_proposals = 2\n")
133728e barerepo 1mo
33
133728e barerepo 1mo
34
mine := clone(t, in, mark, "/john/johnbot")
133728e barerepo 1mo
35
for i := 0; i < 2; i++ {
133728e barerepo 1mo
36
commit(t, mine, fmt.Sprintf("package main\n\nvar v = %d\n", i), fmt.Sprintf("proposal %d", i))
133728e barerepo 1mo
37
run(t, mine, "git", "push", "-q", in.url(mark, "/john/johnbot"), "HEAD:refs/proposals/new")
133728e barerepo 1mo
38
}
133728e barerepo 1mo
39
133728e barerepo 1mo
40
commit(t, mine, "package main\n\nvar v = 99\n", "one too many")
133728e barerepo 1mo
41
out, err := try(t, mine, "git", "push", in.url(mark, "/john/johnbot"), "HEAD:refs/proposals/new")
133728e barerepo 1mo
42
if err == nil {
133728e barerepo 1mo
43
t.Fatalf("a third proposal opened against a cap of two:\n%s", out)
133728e barerepo 1mo
44
}
133728e barerepo 1mo
45
if !strings.Contains(out, "you have 2 proposals open") {
133728e barerepo 1mo
46
t.Errorf("the rejection does not say how many are open:\n%s", out)
133728e barerepo 1mo
47
}
133728e barerepo 1mo
48
if !strings.Contains(out, "the limit is 2") {
133728e barerepo 1mo
49
t.Errorf("the rejection does not say what the limit is:\n%s", out)
133728e barerepo 1mo
50
}
133728e barerepo 1mo
51
if !strings.Contains(out, "land or close one") {
133728e barerepo 1mo
52
t.Errorf("the rejection does not say what to do about it:\n%s", out)
133728e barerepo 1mo
53
}
133728e barerepo 1mo
54
133728e barerepo 1mo
55
// The cap is per account, so somebody else is not held back by mark's two.
133728e barerepo 1mo
56
theirs := clone(t, in, john, "/john/johnbot")
133728e barerepo 1mo
57
commit(t, theirs, "package main\n\nvar w = 1\n", "john proposes")
133728e barerepo 1mo
58
run(t, theirs, "git", "push", "-q", in.url(john, "/john/johnbot"), "HEAD:refs/proposals/new")
133728e barerepo 1mo
59
133728e barerepo 1mo
60
// Updating a proposal already open is not opening a new one.
133728e barerepo 1mo
61
commit(t, mine, "package main\n\nvar v = 100\n", "revise the second")
133728e barerepo 1mo
62
run(t, mine, "git", "push", "-q", "-f", in.url(mark, "/john/johnbot"), "HEAD:refs/proposals/2")
133728e barerepo 1mo
63
}
history · rawbarerepo 0.1.0