internal/control/release_test.go

1ed9fb9399b21da8e6cf45be8389792aac82d5bc
gitbay/internal/control/release_test.go history · blame · raw

86 lines · 2850 bytes

 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}