PathrockNetwork Gno Explorer
HomeBlocksTransactionsRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/p/jeronimoalbi/pager/v0

Package
Open in gnoweb ↗

Overview

Kind
Pure package
Name
v0
Namespace
jeronimoalbi / pager
Files
4 (gnomod.toml)
Exported functions
n/a — not supported for pure packages by the node (vm/qfuncs)
Module
gno.land/p/jeronimoalbi/pager/v0
gno
0.9

Files (4)

  • gnomod.tomltoml
  • pager_options.gnogno
  • pager.gnogno
  • pager_test.gnogno
pager_test.gnogno
1package pager23import (4	"testing"56	"gno.land/p/nt/uassert/v0"7	"gno.land/p/nt/urequire/v0"8)910func TestPager(t *testing.T) {11	cases := []struct {12		name, uri, prevPath, nextPath, param string13		offset, pageSize, page, pageCount    int14		hasPages                             bool15		items                                []int16		err                                  error17	}{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	}6970	for _, tc := range cases {71		t.Run(tc.name, func(t *testing.T) {72			// Act73			p, err := New(tc.uri, len(tc.items), WithPageSize(tc.pageSize), WithPageQueryParam(tc.param))7475			// Assert76			if tc.err != nil {77				urequire.ErrorIs(t, err, tc.err, "expected an error")78				return79			}8081			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}9394func TestPagerIterate(t *testing.T) {95	cases := []struct {96		name, uri   string97		items, page []int98		stop        bool99	}{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	}125126	for _, tc := range cases {127		t.Run(tc.name, func(t *testing.T) {128			// Arrange129			var (130				items []int131				p     = MustNew(tc.uri, len(tc.items), WithPageSize(3))132			)133134			// Act135			stopped := p.Iterate(func(i int) bool {136				if tc.stop {137					return true138				}139140				items = append(items, tc.items[i])141				return false142			})143144			// Assert145			uassert.Equal(t, tc.stop, stopped)146			urequire.Equal(t, len(tc.page), len(items), "expect iteration of the right number of items")147148			for i, v := range items {149				urequire.Equal(t, tc.page[i], v, "expect iterated items to match")150			}151		})152	}153}154155func TestPicker(t *testing.T) {156	pageSize := 3157	cases := []struct {158		name, uri, output string159		totalItems        int160	}{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			// Arrange195			p := MustNew(tc.uri, tc.totalItems, WithPageSize(pageSize))196197			// Act198			output := Picker(p)199200			// Assert201			uassert.Equal(t, tc.output, output)202		})203	}204}205

Functions

not supported for pure packages by the node (vm/qfuncs)

Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.