github.com/anakojm/hugo-katex@v0.0.0-20231023141351-42d6f5de9c0b/resources/page/pagination_test.go (about)

     1  // Copyright 2019 The Hugo Authors. All rights reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package page
    15  
    16  import (
    17  	"context"
    18  	"fmt"
    19  	"html/template"
    20  	"testing"
    21  
    22  	qt "github.com/frankban/quicktest"
    23  )
    24  
    25  func TestSplitPages(t *testing.T) {
    26  	t.Parallel()
    27  	c := qt.New(t)
    28  	pages := createTestPages(21)
    29  	chunks := splitPages(pages, 5)
    30  	c.Assert(len(chunks), qt.Equals, 5)
    31  
    32  	for i := 0; i < 4; i++ {
    33  		c.Assert(chunks[i].Len(), qt.Equals, 5)
    34  	}
    35  
    36  	lastChunk := chunks[4]
    37  	c.Assert(lastChunk.Len(), qt.Equals, 1)
    38  }
    39  
    40  func TestSplitPageGroups(t *testing.T) {
    41  	t.Parallel()
    42  	c := qt.New(t)
    43  	pages := createTestPages(21)
    44  	groups, _ := pages.GroupBy(context.Background(), "Weight", "desc")
    45  	chunks := splitPageGroups(groups, 5)
    46  	c.Assert(len(chunks), qt.Equals, 5)
    47  
    48  	firstChunk := chunks[0]
    49  
    50  	// alternate weight 5 and 10
    51  	if groups, ok := firstChunk.(PagesGroup); ok {
    52  		c.Assert(groups.Len(), qt.Equals, 5)
    53  		for _, pg := range groups {
    54  			// first group 10 in weight
    55  			c.Assert(pg.Key, qt.Equals, 10)
    56  			for _, p := range pg.Pages {
    57  				c.Assert(p.FuzzyWordCount(context.Background())%2 == 0, qt.Equals, true) // magic test
    58  			}
    59  		}
    60  	} else {
    61  		t.Fatal("Excepted PageGroup")
    62  	}
    63  
    64  	lastChunk := chunks[4]
    65  
    66  	if groups, ok := lastChunk.(PagesGroup); ok {
    67  		c.Assert(groups.Len(), qt.Equals, 1)
    68  		for _, pg := range groups {
    69  			// last should have 5 in weight
    70  			c.Assert(pg.Key, qt.Equals, 5)
    71  			for _, p := range pg.Pages {
    72  				c.Assert(p.FuzzyWordCount(context.Background())%2 != 0, qt.Equals, true) // magic test
    73  			}
    74  		}
    75  	} else {
    76  		t.Fatal("Excepted PageGroup")
    77  	}
    78  }
    79  
    80  func TestPager(t *testing.T) {
    81  	t.Parallel()
    82  	c := qt.New(t)
    83  	pages := createTestPages(21)
    84  	groups, _ := pages.GroupBy(context.Background(), "Weight", "desc")
    85  
    86  	urlFactory := func(page int) string {
    87  		return fmt.Sprintf("page/%d/", page)
    88  	}
    89  
    90  	_, err := newPaginatorFromPages(pages, -1, urlFactory)
    91  	c.Assert(err, qt.Not(qt.IsNil))
    92  
    93  	_, err = newPaginatorFromPageGroups(groups, -1, urlFactory)
    94  	c.Assert(err, qt.Not(qt.IsNil))
    95  
    96  	pag, err := newPaginatorFromPages(pages, 5, urlFactory)
    97  	c.Assert(err, qt.IsNil)
    98  	doTestPages(t, pag)
    99  	first := pag.Pagers()[0].First()
   100  	c.Assert(first.String(), qt.Equals, "Pager 1")
   101  	c.Assert(first.Pages(), qt.Not(qt.HasLen), 0)
   102  	c.Assert(first.PageGroups(), qt.HasLen, 0)
   103  
   104  	pag, err = newPaginatorFromPageGroups(groups, 5, urlFactory)
   105  	c.Assert(err, qt.IsNil)
   106  	doTestPages(t, pag)
   107  	first = pag.Pagers()[0].First()
   108  	c.Assert(first.PageGroups(), qt.Not(qt.HasLen), 0)
   109  	c.Assert(first.Pages(), qt.HasLen, 0)
   110  }
   111  
   112  func doTestPages(t *testing.T, paginator *Paginator) {
   113  	c := qt.New(t)
   114  	paginatorPages := paginator.Pagers()
   115  
   116  	c.Assert(len(paginatorPages), qt.Equals, 5)
   117  	c.Assert(paginator.TotalNumberOfElements(), qt.Equals, 21)
   118  	c.Assert(paginator.PageSize(), qt.Equals, 5)
   119  	c.Assert(paginator.TotalPages(), qt.Equals, 5)
   120  
   121  	first := paginatorPages[0]
   122  	c.Assert(first.URL(), qt.Equals, template.HTML("page/1/"))
   123  	c.Assert(first.First(), qt.Equals, first)
   124  	c.Assert(first.HasNext(), qt.Equals, true)
   125  	c.Assert(first.Next(), qt.Equals, paginatorPages[1])
   126  	c.Assert(first.HasPrev(), qt.Equals, false)
   127  	c.Assert(first.Prev(), qt.IsNil)
   128  	c.Assert(first.NumberOfElements(), qt.Equals, 5)
   129  	c.Assert(first.PageNumber(), qt.Equals, 1)
   130  
   131  	third := paginatorPages[2]
   132  	c.Assert(third.HasNext(), qt.Equals, true)
   133  	c.Assert(third.HasPrev(), qt.Equals, true)
   134  	c.Assert(third.Prev(), qt.Equals, paginatorPages[1])
   135  
   136  	last := paginatorPages[4]
   137  	c.Assert(last.URL(), qt.Equals, template.HTML("page/5/"))
   138  	c.Assert(last.Last(), qt.Equals, last)
   139  	c.Assert(last.HasNext(), qt.Equals, false)
   140  	c.Assert(last.Next(), qt.IsNil)
   141  	c.Assert(last.HasPrev(), qt.Equals, true)
   142  	c.Assert(last.NumberOfElements(), qt.Equals, 1)
   143  	c.Assert(last.PageNumber(), qt.Equals, 5)
   144  }
   145  
   146  func TestPagerNoPages(t *testing.T) {
   147  	t.Parallel()
   148  	c := qt.New(t)
   149  	pages := createTestPages(0)
   150  	groups, _ := pages.GroupBy(context.Background(), "Weight", "desc")
   151  
   152  	urlFactory := func(page int) string {
   153  		return fmt.Sprintf("page/%d/", page)
   154  	}
   155  
   156  	paginator, _ := newPaginatorFromPages(pages, 5, urlFactory)
   157  	doTestPagerNoPages(t, paginator)
   158  
   159  	first := paginator.Pagers()[0].First()
   160  	c.Assert(first.PageGroups(), qt.HasLen, 0)
   161  	c.Assert(first.Pages(), qt.HasLen, 0)
   162  
   163  	paginator, _ = newPaginatorFromPageGroups(groups, 5, urlFactory)
   164  	doTestPagerNoPages(t, paginator)
   165  
   166  	first = paginator.Pagers()[0].First()
   167  	c.Assert(first.PageGroups(), qt.HasLen, 0)
   168  	c.Assert(first.Pages(), qt.HasLen, 0)
   169  }
   170  
   171  func doTestPagerNoPages(t *testing.T, paginator *Paginator) {
   172  	paginatorPages := paginator.Pagers()
   173  	c := qt.New(t)
   174  	c.Assert(len(paginatorPages), qt.Equals, 1)
   175  	c.Assert(paginator.TotalNumberOfElements(), qt.Equals, 0)
   176  	c.Assert(paginator.PageSize(), qt.Equals, 5)
   177  	c.Assert(paginator.TotalPages(), qt.Equals, 0)
   178  
   179  	// pageOne should be nothing but the first
   180  	pageOne := paginatorPages[0]
   181  	c.Assert(pageOne.First(), qt.Not(qt.IsNil))
   182  	c.Assert(pageOne.HasNext(), qt.Equals, false)
   183  	c.Assert(pageOne.HasPrev(), qt.Equals, false)
   184  	c.Assert(pageOne.Next(), qt.IsNil)
   185  	c.Assert(len(pageOne.Pagers()), qt.Equals, 1)
   186  	c.Assert(pageOne.Pages().Len(), qt.Equals, 0)
   187  	c.Assert(pageOne.NumberOfElements(), qt.Equals, 0)
   188  	c.Assert(pageOne.TotalNumberOfElements(), qt.Equals, 0)
   189  	c.Assert(pageOne.TotalPages(), qt.Equals, 0)
   190  	c.Assert(pageOne.PageNumber(), qt.Equals, 1)
   191  	c.Assert(pageOne.PageSize(), qt.Equals, 5)
   192  }
   193  
   194  func TestProbablyEqualPageLists(t *testing.T) {
   195  	t.Parallel()
   196  	fivePages := createTestPages(5)
   197  	zeroPages := createTestPages(0)
   198  	zeroPagesByWeight, _ := createTestPages(0).GroupBy(context.Background(), "Weight", "asc")
   199  	fivePagesByWeight, _ := createTestPages(5).GroupBy(context.Background(), "Weight", "asc")
   200  	ninePagesByWeight, _ := createTestPages(9).GroupBy(context.Background(), "Weight", "asc")
   201  
   202  	for i, this := range []struct {
   203  		v1     any
   204  		v2     any
   205  		expect bool
   206  	}{
   207  		{nil, nil, true},
   208  		{"a", "b", true},
   209  		{"a", fivePages, false},
   210  		{fivePages, "a", false},
   211  		{fivePages, createTestPages(2), false},
   212  		{fivePages, fivePages, true},
   213  		{zeroPages, zeroPages, true},
   214  		{fivePagesByWeight, fivePagesByWeight, true},
   215  		{zeroPagesByWeight, fivePagesByWeight, false},
   216  		{zeroPagesByWeight, zeroPagesByWeight, true},
   217  		{fivePagesByWeight, fivePages, false},
   218  		{fivePagesByWeight, ninePagesByWeight, false},
   219  	} {
   220  		result := probablyEqualPageLists(this.v1, this.v2)
   221  
   222  		if result != this.expect {
   223  			t.Errorf("[%d] got %t but expected %t", i, result, this.expect)
   224  		}
   225  	}
   226  }
   227  
   228  func TestPaginationPage(t *testing.T) {
   229  	t.Parallel()
   230  	c := qt.New(t)
   231  	urlFactory := func(page int) string {
   232  		return fmt.Sprintf("page/%d/", page)
   233  	}
   234  
   235  	fivePages := createTestPages(7)
   236  	fivePagesFuzzyWordCount, _ := createTestPages(7).GroupBy(context.Background(), "FuzzyWordCount", "asc")
   237  
   238  	p1, _ := newPaginatorFromPages(fivePages, 2, urlFactory)
   239  	p2, _ := newPaginatorFromPageGroups(fivePagesFuzzyWordCount, 2, urlFactory)
   240  
   241  	f1 := p1.pagers[0].First()
   242  	f2 := p2.pagers[0].First()
   243  
   244  	page11, _ := f1.page(1)
   245  	page1Nil, _ := f1.page(3)
   246  
   247  	page21, _ := f2.page(1)
   248  	page2Nil, _ := f2.page(3)
   249  
   250  	c.Assert(page11.FuzzyWordCount(context.Background()), qt.Equals, 3)
   251  	c.Assert(page1Nil, qt.IsNil)
   252  
   253  	c.Assert(page21, qt.Not(qt.IsNil))
   254  	c.Assert(page21.FuzzyWordCount(context.Background()), qt.Equals, 3)
   255  	c.Assert(page2Nil, qt.IsNil)
   256  }