hugolib: Fall back to title in ByLinkTitle sort
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 28 Nov 2018 11:28:24 +0000 (12:28 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 28 Nov 2018 12:52:26 +0000 (13:52 +0100)
Fixes #4953

hugolib/page.go
hugolib/pageSort.go
hugolib/pageSort_test.go

index c726394a2a52a3426f4b8584ed51a61da8da2090..f3e87be7de770cc36f446797ead6ff7a4548bfcd 100644 (file)
@@ -18,6 +18,7 @@ import (
        "context"
        "errors"
        "fmt"
+       "math/rand"
        "reflect"
 
        "github.com/gohugoio/hugo/common/maps"
@@ -517,6 +518,14 @@ func (ps Pages) String() string {
        return fmt.Sprintf("Pages(%d)", len(ps))
 }
 
+// Used in tests.
+func (ps Pages) shuffle() {
+       for i := range ps {
+               j := rand.Intn(i + 1)
+               ps[i], ps[j] = ps[j], ps[i]
+       }
+}
+
 func (ps Pages) findPagePosByFilename(filename string) int {
        for i, x := range ps {
                if x.Filename() == filename {
index 055519b044fdf9d0c8646910a532337dff5d8804..c7766e2a69cc5673702d5aa83b6611003b573e23 100644 (file)
@@ -155,7 +155,7 @@ func (p Pages) ByLinkTitle() Pages {
        const key = "pageSort.ByLinkTitle"
 
        linkTitle := func(p1, p2 *Page) bool {
-               return p1.linkTitle < p2.linkTitle
+               return p1.LinkTitle() < p2.LinkTitle()
        }
 
        pages, _ := spc.get(key, pageBy(linkTitle).Sort, p)
index bc4be1cb0f08c71d62992e8033941f601b646f5b..695045ff125e93ade73a8a829400e1a8c3f329f7 100644 (file)
@@ -20,6 +20,7 @@ import (
        "time"
 
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func TestDefaultSort(t *testing.T) {
@@ -58,6 +59,37 @@ func TestDefaultSort(t *testing.T) {
        assert.Equal(t, "cl", p[2].LinkTitle())
 }
 
+// https://github.com/gohugoio/hugo/issues/4953
+func TestSortByLinkTitle(t *testing.T) {
+       t.Parallel()
+       assert := require.New(t)
+       s := newTestSite(t)
+       pages := createSortTestPages(s, 6)
+
+       for i, p := range pages {
+               if i < 5 {
+                       p.title = fmt.Sprintf("title%d", i)
+               }
+
+               if i > 2 {
+                       p.linkTitle = fmt.Sprintf("linkTitle%d", i)
+               }
+       }
+
+       pages.shuffle()
+
+       bylt := pages.ByLinkTitle()
+
+       for i, p := range bylt {
+               msg := fmt.Sprintf("test: %d", i)
+               if i < 3 {
+                       assert.Equal(fmt.Sprintf("linkTitle%d", i+3), p.LinkTitle(), msg)
+               } else {
+                       assert.Equal(fmt.Sprintf("title%d", i-3), p.LinkTitle(), msg)
+               }
+       }
+}
+
 func TestSortByN(t *testing.T) {
        t.Parallel()
        s := newTestSite(t)