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

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

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}