pager_test.gno

4.74 Kb · 204 lines
  1package pager
  2
  3import (
  4	"testing"
  5
  6	"gno.land/p/demo/uassert"
  7	"gno.land/p/demo/urequire"
  8)
  9
 10func TestPager(t *testing.T) {
 11	cases := []struct {
 12		name, uri, prevPath, nextPath, param string
 13		offset, pageSize, page, pageCount    int
 14		hasPages                             bool
 15		items                                []int
 16		err                                  error
 17	}{
 18		{
 19			name:      "page 1",
 20			uri:       "gno.land/r/demo/test:foo/bar?page=1&foo=bar",
 21			items:     []int{1, 2, 3, 4, 5, 6},
 22			hasPages:  true,
 23			nextPath:  "?foo=bar&page=2",
 24			pageSize:  5,
 25			page:      1,
 26			pageCount: 2,
 27		},
 28		{
 29			name:      "page 2",
 30			uri:       "gno.land/r/demo/test:foo/bar?page=2&foo=bar",
 31			items:     []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
 32			hasPages:  true,
 33			prevPath:  "?foo=bar&page=1",
 34			nextPath:  "",
 35			offset:    5,
 36			pageSize:  5,
 37			page:      2,
 38			pageCount: 2,
 39		},
 40		{
 41			name:      "custom query param",
 42			uri:       "gno.land/r/demo/test:foo/bar?current=2&foo=bar",
 43			items:     []int{1, 2, 3},
 44			param:     "current",
 45			hasPages:  true,
 46			prevPath:  "?current=1&foo=bar",
 47			nextPath:  "",
 48			offset:    2,
 49			pageSize:  2,
 50			page:      2,
 51			pageCount: 2,
 52		},
 53		{
 54			name: "missing page",
 55			uri:  "gno.land/r/demo/test:foo/bar?page=3&foo=bar",
 56			err:  ErrInvalidPageNumber,
 57		},
 58		{
 59			name: "invalid page zero",
 60			uri:  "gno.land/r/demo/test:foo/bar?page=0",
 61			err:  ErrInvalidPageNumber,
 62		},
 63		{
 64			name: "invalid page number",
 65			uri:  "gno.land/r/demo/test:foo/bar?page=foo",
 66			err:  ErrInvalidPageNumber,
 67		},
 68	}
 69
 70	for _, tc := range cases {
 71		t.Run(tc.name, func(t *testing.T) {
 72			// Act
 73			p, err := New(tc.uri, len(tc.items), WithPageSize(tc.pageSize), WithPageQueryParam(tc.param))
 74
 75			// Assert
 76			if tc.err != nil {
 77				urequire.ErrorIs(t, err, tc.err, "expected an error")
 78				return
 79			}
 80
 81			urequire.NoError(t, err, "expect no error")
 82			uassert.Equal(t, len(tc.items), p.TotalItems(), "total items")
 83			uassert.Equal(t, tc.page, p.Page(), "page number")
 84			uassert.Equal(t, tc.pageCount, p.PageCount(), "number of pages")
 85			uassert.Equal(t, tc.pageSize, p.PageSize(), "page size")
 86			uassert.Equal(t, tc.prevPath, p.PrevPageURI(), "prev URL page")
 87			uassert.Equal(t, tc.nextPath, p.NextPageURI(), "next URL page")
 88			uassert.Equal(t, tc.hasPages, p.HasPages(), "has pages")
 89			uassert.Equal(t, tc.offset, p.Offset(), "item offset")
 90		})
 91	}
 92}
 93
 94func TestPagerIterate(t *testing.T) {
 95	cases := []struct {
 96		name, uri   string
 97		items, page []int
 98		stop        bool
 99	}{
100		{
101			name:  "page 1",
102			uri:   "gno.land/r/demo/test:foo/bar?page=1",
103			items: []int{1, 2, 3, 4, 5, 6, 7},
104			page:  []int{1, 2, 3},
105		},
106		{
107			name:  "page 2",
108			uri:   "gno.land/r/demo/test:foo/bar?page=2",
109			items: []int{1, 2, 3, 4, 5, 6, 7},
110			page:  []int{4, 5, 6},
111		},
112		{
113			name:  "page 3",
114			uri:   "gno.land/r/demo/test:foo/bar?page=3",
115			items: []int{1, 2, 3, 4, 5, 6, 7},
116			page:  []int{7},
117		},
118		{
119			name:  "stop iteration",
120			uri:   "gno.land/r/demo/test:foo/bar?page=1",
121			items: []int{1, 2, 3},
122			stop:  true,
123		},
124	}
125
126	for _, tc := range cases {
127		t.Run(tc.name, func(t *testing.T) {
128			// Arrange
129			var (
130				items []int
131				p     = MustNew(tc.uri, len(tc.items), WithPageSize(3))
132			)
133
134			// Act
135			stopped := p.Iterate(func(i int) bool {
136				if tc.stop {
137					return true
138				}
139
140				items = append(items, tc.items[i])
141				return false
142			})
143
144			// Assert
145			uassert.Equal(t, tc.stop, stopped)
146			urequire.Equal(t, len(tc.page), len(items), "expect iteration of the right number of items")
147
148			for i, v := range items {
149				urequire.Equal(t, tc.page[i], v, "expect iterated items to match")
150			}
151		})
152	}
153}
154
155func TestPicker(t *testing.T) {
156	pageSize := 3
157	cases := []struct {
158		name, uri, output string
159		totalItems        int
160	}{
161		{
162			name:       "one page",
163			uri:        "gno.land/r/demo/test:foo/bar?page=1",
164			totalItems: 3,
165			output:     "",
166		},
167		{
168			name:       "two pages",
169			uri:        "gno.land/r/demo/test:foo/bar?page=1",
170			totalItems: 4,
171			output:     "\\- | page 1 of 2 | [»](?page=2)",
172		},
173		{
174			name:       "three pages",
175			uri:        "gno.land/r/demo/test:foo/bar?page=1",
176			totalItems: 7,
177			output:     "\\- | page 1 of 3 | [»](?page=2)",
178		},
179		{
180			name:       "three pages second page",
181			uri:        "gno.land/r/demo/test:foo/bar?page=2",
182			totalItems: 7,
183			output:     "[«](?page=1) | page 2 of 3 | [»](?page=3)",
184		},
185		{
186			name:       "three pages third page",
187			uri:        "gno.land/r/demo/test:foo/bar?page=3",
188			totalItems: 7,
189			output:     "[«](?page=2) | page 3 of 3 | \\-",
190		},
191	}
192	for _, tc := range cases {
193		t.Run(tc.name, func(t *testing.T) {
194			// Arrange
195			p := MustNew(tc.uri, tc.totalItems, WithPageSize(pageSize))
196
197			// Act
198			output := Picker(p)
199
200			// Assert
201			uassert.Equal(t, tc.output, output)
202		})
203	}
204}