issue_test.gno
3.21 Kb · 100 lines
1package forge
2
3import (
4 "testing"
5
6 "gno.land/p/nt/uassert/v0"
7 "gno.land/p/nt/urequire/v0"
8)
9
10func TestIssueLifecycle(t *testing.T) {
11 _, r := newRepo(t)
12
13 // Filing an issue needs no role: the gate is that the author pays for the
14 // bytes they write.
15 i, err := r.OpenIssue(eve, 200, "Render eats the last newline", "Steps:\n1. …", []string{"bug"})
16 urequire.NoError(t, err)
17 uassert.Equal(t, int64(0), i.ID)
18 uassert.True(t, i.Open)
19 uassert.Equal(t, eve.String(), i.Author.String())
20 uassert.Equal(t, 1, r.IssueCount())
21 uassert.Equal(t, 1, r.OpenIssueCount())
22
23 c, err := r.CommentIssue(bob, 201, 0, "reproduced")
24 urequire.NoError(t, err)
25 uassert.Equal(t, int64(0), c.ID)
26 uassert.Equal(t, 1, i.CommentCount())
27 uassert.Equal(t, int64(201), i.UpdatedAt)
28
29 // The author may close their own; a stranger may not close someone else's.
30 uassert.ErrorIs(t, r.SetIssueOpen(carol, 202, 0, false), ErrUnauthorized)
31 urequire.NoError(t, r.SetIssueOpen(eve, 202, 0, false))
32 uassert.False(t, i.Open)
33 uassert.Equal(t, 0, r.OpenIssueCount())
34
35 // Closed is a triage state, not a gag.
36 _, err = r.CommentIssue(eve, 203, 0, "still happening on pearl")
37 urequire.NoError(t, err)
38
39 // Maintainers can reopen and label.
40 urequire.NoError(t, r.SetIssueOpen(bob, 204, 0, true))
41 uassert.ErrorIs(t, r.SetIssueLabels(eve, 205, 0, []string{"p1"}), ErrUnauthorized)
42 urequire.NoError(t, r.SetIssueLabels(bob, 205, 0, []string{"bug", "p1"}))
43 uassert.Equal(t, 2, len(i.Labels))
44}
45
46func TestIssueValidation(t *testing.T) {
47 _, r := newRepo(t)
48
49 _, err := r.OpenIssue(eve, 200, "", "body", nil)
50 uassert.ErrorIs(t, err, ErrInvalidText, "a title is required")
51 _, err = r.OpenIssue(eve, 200, "two\nlines", "", nil)
52 uassert.ErrorIs(t, err, ErrInvalidText, "a title is one line")
53 _, err = r.OpenIssue(eve, 200, "ok", "", []string{"a,b"})
54 uassert.ErrorIs(t, err, ErrInvalidText, "labels are comma-free")
55 _, err = r.OpenIssue(eve, 200, "ok", "", []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"})
56 uassert.ErrorIs(t, err, ErrTooMany)
57
58 _, err = r.CommentIssue(eve, 200, 7, "no such issue")
59 uassert.ErrorIs(t, err, ErrIssueNotFound)
60 uassert.ErrorIs(t, r.SetIssueOpen(bob, 200, 7, false), ErrIssueNotFound)
61
62 urequire.NoError(t, func() error { _, err := r.OpenIssue(eve, 200, "ok", "", nil); return err }())
63 _, err = r.CommentIssue(eve, 201, 0, "")
64 uassert.ErrorIs(t, err, ErrInvalidText, "an empty comment is not a comment")
65}
66
67func TestIssueIterationIsNewestFirst(t *testing.T) {
68 _, r := newRepo(t)
69 for _, title := range []string{"first", "second", "third"} {
70 _, err := r.OpenIssue(eve, 200, title, "", nil)
71 urequire.NoError(t, err)
72 }
73
74 var got []string
75 r.IterateIssues(0, 0, func(i *Issue) bool {
76 got = append(got, i.Title)
77 return false
78 })
79 uassert.Equal(t, "third,second,first", join(got))
80
81 var page []string
82 r.IterateIssues(1, 1, func(i *Issue) bool {
83 page = append(page, i.Title)
84 return false
85 })
86 uassert.Equal(t, "second", join(page))
87
88 i := r.Issue(0)
89 urequire.NotEqual(t, nil, i)
90 for n := 0; n < 3; n++ {
91 _, err := r.CommentIssue(eve, 201, 0, "ping")
92 urequire.NoError(t, err)
93 }
94 var bodies []string
95 i.IterateComments(0, 2, func(c *Comment) bool {
96 bodies = append(bodies, c.Body)
97 return false
98 })
99 uassert.Equal(t, "ping,ping", join(bodies))
100}