Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}