Avoid panic when pagination on 0 pages
authorbep <bjorn.erik.pedersen@gmail.com>
Thu, 5 Mar 2015 23:30:51 +0000 (00:30 +0100)
committerbep <bjorn.erik.pedersen@gmail.com>
Thu, 5 Mar 2015 23:48:33 +0000 (00:48 +0100)
Fixes #948

hugolib/pagination.go
hugolib/pagination_test.go

index 67cc021675594f634c1f5f9d2fe9ed666674701c..8fb4f4e4ac7202183733db32c7fb553b1612e9e4 100644 (file)
@@ -30,6 +30,8 @@ type pager struct {
 
 type pagers []*pager
 
+var paginatorEmptyPages Pages
+
 type paginator struct {
        paginatedPages []Pages
        pagers
@@ -52,6 +54,9 @@ func (p *pager) Url() template.HTML {
 
 // Pages returns the elements on this page.
 func (p *pager) Pages() Pages {
+       if len(p.paginatedPages) == 0 {
+               return paginatorEmptyPages
+       }
        return p.paginatedPages[p.PageNumber()-1]
 }
 
@@ -233,13 +238,20 @@ func newPaginator(pages Pages, size int, urlFactory paginationUrlFactory) (*pagi
        split := splitPages(pages, size)
 
        p := &paginator{total: len(pages), paginatedPages: split, size: size, paginationUrlFactory: urlFactory}
-       pagers := make(pagers, len(split))
 
-       for i := range p.paginatedPages {
-               pagers[i] = &pager{number: (i + 1), paginator: p}
+       var ps pagers
+
+       if len(split) > 0 {
+               ps = make(pagers, len(split))
+               for i := range p.paginatedPages {
+                       ps[i] = &pager{number: (i + 1), paginator: p}
+               }
+       } else {
+               ps = make(pagers, 1)
+               ps[0] = &pager{number: 1, paginator: p}
        }
 
-       p.pagers = pagers
+       p.pagers = ps
 
        return p, nil
 }
index 7fb8fa251e86fb92a5fc6e61f71339281c84e7f8..5d46128677128b940b327b74eea7f4bb226fd6e9 100644 (file)
@@ -76,10 +76,25 @@ func TestPagerNoPages(t *testing.T) {
        paginator, _ := newPaginator(pages, 5, urlFactory)
        paginatorPages := paginator.Pagers()
 
-       assert.Equal(t, 0, len(paginatorPages))
+       assert.Equal(t, 1, len(paginatorPages))
        assert.Equal(t, 0, paginator.TotalNumberOfElements())
        assert.Equal(t, 5, paginator.PageSize())
        assert.Equal(t, 0, paginator.TotalPages())
+
+       // pageOne should be nothing but the first
+       pageOne := paginatorPages[0]
+       assert.NotNil(t, pageOne.First())
+       assert.False(t, pageOne.HasNext())
+       assert.False(t, pageOne.HasPrev())
+       assert.Nil(t, pageOne.Next())
+       assert.Equal(t, 1, len(pageOne.Pagers()))
+       assert.Equal(t, 0, len(pageOne.Pages()))
+       assert.Equal(t, 0, pageOne.NumberOfElements())
+       assert.Equal(t, 0, pageOne.TotalNumberOfElements())
+       assert.Equal(t, 0, pageOne.TotalPages())
+       assert.Equal(t, 1, pageOne.PageNumber())
+       assert.Equal(t, 5, pageOne.PageSize())
+
 }
 
 func TestPaginationUrlFactory(t *testing.T) {