hugolib: Fall back to title in ByLinkTitle sort

Fixes #4953
This commit is contained in:
Bjørn Erik Pedersen 2018-11-28 12:28:24 +01:00
parent b09a40333f
commit a9a93d082d
3 changed files with 42 additions and 1 deletions

View file

@ -18,6 +18,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"math/rand"
"reflect" "reflect"
"github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/common/maps"
@ -517,6 +518,14 @@ func (ps Pages) String() string {
return fmt.Sprintf("Pages(%d)", len(ps)) 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 { func (ps Pages) findPagePosByFilename(filename string) int {
for i, x := range ps { for i, x := range ps {
if x.Filename() == filename { if x.Filename() == filename {

View file

@ -155,7 +155,7 @@ func (p Pages) ByLinkTitle() Pages {
const key = "pageSort.ByLinkTitle" const key = "pageSort.ByLinkTitle"
linkTitle := func(p1, p2 *Page) bool { linkTitle := func(p1, p2 *Page) bool {
return p1.linkTitle < p2.linkTitle return p1.LinkTitle() < p2.LinkTitle()
} }
pages, _ := spc.get(key, pageBy(linkTitle).Sort, p) pages, _ := spc.get(key, pageBy(linkTitle).Sort, p)

View file

@ -20,6 +20,7 @@ import (
"time" "time"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
func TestDefaultSort(t *testing.T) { func TestDefaultSort(t *testing.T) {
@ -58,6 +59,37 @@ func TestDefaultSort(t *testing.T) {
assert.Equal(t, "cl", p[2].LinkTitle()) 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) { func TestSortByN(t *testing.T) {
t.Parallel() t.Parallel()
s := newTestSite(t) s := newTestSite(t)