e2e/emailremove_test.go
64 lines · 2519 bytes
1package e2e
2
3import (
4 "encoding/json"
5 "fmt"
6 "strings"
7 "testing"
8)
9
10// An address can be removed and the primary moved, within the rules the
11// store holds: the primary stays until another is primary, and the last
12// verified address stays (#181).
13func TestEmailRemoveAndPrimary(t *testing.T) {
14 smtp := startFakeSMTP(t)
15 inst := startInstanceWith(t, fmt.Sprintf(
16 "[mail]\nsmtp_host = %q\nfrom = \"noreply@gitbay.test\"\n", smtp.addr))
17 key := inst.newKey(t, "gus")
18 inst.admin(t, "admin", "user", "create", "gus",
19 "--key", key+".pub", "--email", "gus@primary.test", "--verified")
20 for _, a := range []string{"typo@example.test", "gus@next.test"} {
21 if _, errOut, code := inst.ssh(t, key, "", "email", "add", a); code != 0 {
22 t.Fatalf("email add %s: %s", a, errOut)
23 }
24 }
25
26 if _, errOut, code := inst.ssh(t, key, "", "email", "remove", "gus@primary.test"); code != 4 || !strings.Contains(errOut, "primary") {
27 t.Fatalf("removing the primary: exit %d %s", code, errOut)
28 }
29 if _, errOut, code := inst.ssh(t, key, "", "email", "remove", "nobody@example.test"); code != 3 {
30 t.Fatalf("removing an absent address: exit %d %s", code, errOut)
31 }
32 if _, errOut, code := inst.ssh(t, key, "", "email", "primary", "gus@next.test"); code != 4 || !strings.Contains(errOut, "not verified") {
33 t.Fatalf("unverified address as primary: exit %d %s", code, errOut)
34 }
35 if _, errOut, code := inst.ssh(t, key, "", "email", "remove", "typo@example.test"); code != 0 {
36 t.Fatalf("removing an unverified address: exit %d %s", code, errOut)
37 }
38
39 inst.admin(t, "admin", "email", "verify", "gus", "gus@next.test")
40 if _, errOut, code := inst.ssh(t, key, "", "email", "primary", "gus@next.test"); code != 0 {
41 t.Fatalf("email primary: exit %d %s", code, errOut)
42 }
43 if _, errOut, code := inst.ssh(t, key, "", "email", "remove", "gus@primary.test"); code != 0 {
44 t.Fatalf("removing the former primary: exit %d %s", code, errOut)
45 }
46
47 out, errOut, code := inst.ssh(t, key, "", "email", "list", "--json")
48 if code != 0 {
49 t.Fatalf("email list: exit %d %s", code, errOut)
50 }
51 var env struct {
52 Data []struct {
53 Address string `json:"address"`
54 Verified bool `json:"verified"`
55 Primary bool `json:"primary"`
56 } `json:"data"`
57 }
58 if err := json.Unmarshal([]byte(out), &env); err != nil {
59 t.Fatalf("email list --json: %v\n%s", err, out)
60 }
61 if len(env.Data) != 1 || env.Data[0].Address != "gus@next.test" || !env.Data[0].Verified || !env.Data[0].Primary {
62 t.Fatalf("addresses after the changes: %+v", env.Data)
63 }
64}