internal/control/release_test.go
86 lines · 2850 bytes
2 symbols in this file
1package control
2
3import (
4 "bytes"
5 "strings"
6 "testing"
7
8 "gitbay.org/gitbay/internal/protocol"
9 "gitbay.org/gitbay/internal/store"
10)
11
12func TestReleaseListPagesAndHidesTagTitle(t *testing.T) {
13 st, repo, uid := newQueueTestRepo(t)
14 for _, tag := range []string{"v1", "v2", "v3"} {
15 title := tag
16 if tag == "v2" {
17 title = "Second"
18 }
19 if _, err := st.CreateRelease(repo.ID, tag, title, "", uid, "md"); err != nil {
20 t.Fatal(err)
21 }
22 }
23 c, errOut := pruneCtx(st, t.TempDir(), store.User{ID: uid})
24 if code := Dispatch(c, []string{"release", "list", repo.Path(), "--limit", "2"}); code != protocol.ExitOK {
25 t.Fatalf("exit %d: %s", code, errOut)
26 }
27 lines := strings.Split(strings.TrimSpace(c.Stdout.(*bytes.Buffer).String()), "\n")
28 if len(lines) != 3 || lines[0] != "v3\t\t0 asset(s)" || lines[1] != "v2\tSecond\t0 asset(s)" || !strings.HasPrefix(lines[2], "next\t") {
29 t.Fatalf("page 1:\n%s", strings.Join(lines, "\n"))
30 }
31 cursor := strings.TrimPrefix(lines[2], "next\t")
32
33 c, errOut = pruneCtx(st, t.TempDir(), store.User{ID: uid})
34 if code := Dispatch(c, []string{"release", "list", repo.Path(), "--cursor", cursor}); code != protocol.ExitOK {
35 t.Fatalf("exit %d: %s", code, errOut)
36 }
37 if got := c.Stdout.(*bytes.Buffer).String(); got != "v1\t\t0 asset(s)\n" {
38 t.Fatalf("page 2: %q", got)
39 }
40}
41
42// The cursor names the pointed-to release by (created_at, id), not by a
43// live lookup of that id: deleting it between page requests must not
44// blank the next page.
45func TestReleaseListPageSurvivesTheCursorReleaseBeingDeleted(t *testing.T) {
46 st, repo, uid := newQueueTestRepo(t)
47 for _, tag := range []string{"v1", "v2", "v3"} {
48 if _, err := st.CreateRelease(repo.ID, tag, tag, "", uid, "md"); err != nil {
49 t.Fatal(err)
50 }
51 }
52 c, errOut := pruneCtx(st, t.TempDir(), store.User{ID: uid})
53 if code := Dispatch(c, []string{"release", "list", repo.Path(), "--limit", "2"}); code != protocol.ExitOK {
54 t.Fatalf("exit %d: %s", code, errOut)
55 }
56 lines := strings.Split(strings.TrimSpace(c.Stdout.(*bytes.Buffer).String()), "\n")
57 if len(lines) != 3 || !strings.HasPrefix(lines[2], "next\t") {
58 t.Fatalf("page 1:\n%s", strings.Join(lines, "\n"))
59 }
60 cursor := strings.TrimPrefix(lines[2], "next\t")
61
62 rels, err := st.ListReleases(repo.ID)
63 if err != nil {
64 t.Fatal(err)
65 }
66 var v2ID int64
67 for _, r := range rels {
68 if r.Tag == "v2" {
69 v2ID = r.ID
70 }
71 }
72 if v2ID == 0 {
73 t.Fatal("v2 not found")
74 }
75 if err := st.DeleteRelease(v2ID); err != nil {
76 t.Fatal(err)
77 }
78
79 c, errOut = pruneCtx(st, t.TempDir(), store.User{ID: uid})
80 if code := Dispatch(c, []string{"release", "list", repo.Path(), "--cursor", cursor}); code != protocol.ExitOK {
81 t.Fatalf("exit %d: %s", code, errOut)
82 }
83 if got := c.Stdout.(*bytes.Buffer).String(); got != "v1\t\t0 asset(s)\n" {
84 t.Fatalf("page 2 after deleting the cursor release: %q", got)
85 }
86}