hugo

Fork of github.com/gohugoio/hugo with reverse pagination support

git clone git://git.shimmy1996.com/hugo.git

hugo_test.go (4932B)

    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 commands
   15 
   16 import (
   17 	"bytes"
   18 	"fmt"
   19 	"math/rand"
   20 	"path/filepath"
   21 	"strings"
   22 	"testing"
   23 
   24 	"github.com/bep/clock"
   25 	qt "github.com/frankban/quicktest"
   26 	"github.com/gohugoio/hugo/common/htime"
   27 	"github.com/gohugoio/hugo/hugofs"
   28 	"github.com/spf13/afero"
   29 	"golang.org/x/tools/txtar"
   30 )
   31 
   32 // Issue #5662
   33 func TestHugoWithContentDirOverride(t *testing.T) {
   34 	t.Parallel()
   35 	c := qt.New(t)
   36 
   37 	files := `
   38 -- config.toml --
   39 baseURL = "https://example.org"
   40 title = "Hugo Commands"
   41 -- mycontent/p1.md --
   42 ---
   43 title: "P1"
   44 ---
   45 -- layouts/_default/single.html --
   46 Page: {{ .Title }}|
   47 
   48 `
   49 	s := newTestHugoCmdBuilder(c, files, []string{"-c", "mycontent"}).Build()
   50 	s.AssertFileContent("public/p1/index.html", `Page: P1|`)
   51 
   52 }
   53 
   54 // Issue #9794
   55 func TestHugoStaticFilesMultipleStaticAndManyFolders(t *testing.T) {
   56 	t.Parallel()
   57 	c := qt.New(t)
   58 
   59 	files := `
   60 -- config.toml --
   61 baseURL = "https://example.org"
   62 theme = "mytheme"
   63 -- layouts/index.html --
   64 Home.
   65 
   66 `
   67 	const (
   68 		numDirs     = 33
   69 		numFilesMax = 12
   70 	)
   71 
   72 	r := rand.New(rand.NewSource(32))
   73 
   74 	for i := 0; i < numDirs; i++ {
   75 		for j := 0; j < r.Intn(numFilesMax); j++ {
   76 			if j%3 == 0 {
   77 				files += fmt.Sprintf("-- themes/mytheme/static/d%d/f%d.txt --\nHellot%d-%d\n", i, j, i, j)
   78 				files += fmt.Sprintf("-- themes/mytheme/static/d%d/ft%d.txt --\nHellot%d-%d\n", i, j, i, j)
   79 			}
   80 			files += fmt.Sprintf("-- static/d%d/f%d.txt --\nHello%d-%d\n", i, j, i, j)
   81 		}
   82 	}
   83 
   84 	r = rand.New(rand.NewSource(32))
   85 
   86 	s := newTestHugoCmdBuilder(c, files, []string{"-c", "mycontent"}).Build()
   87 	for i := 0; i < numDirs; i++ {
   88 		for j := 0; j < r.Intn(numFilesMax); j++ {
   89 			if j%3 == 0 {
   90 				if j%3 == 0 {
   91 					s.AssertFileContent(fmt.Sprintf("public/d%d/ft%d.txt", i, j), fmt.Sprintf("Hellot%d-%d", i, j))
   92 				}
   93 				s.AssertFileContent(fmt.Sprintf("public/d%d/f%d.txt", i, j), fmt.Sprintf("Hello%d-%d", i, j))
   94 			}
   95 		}
   96 	}
   97 
   98 }
   99 
  100 // Issue #8787
  101 func TestHugoListCommandsWithClockFlag(t *testing.T) {
  102 	t.Cleanup(func() { htime.Clock = clock.System() })
  103 
  104 	c := qt.New(t)
  105 
  106 	files := `
  107 -- config.toml --
  108 baseURL = "https://example.org"
  109 title = "Hugo Commands"
  110 timeZone = "UTC"
  111 -- content/past.md --
  112 ---
  113 title: "Past"
  114 date: 2000-11-06
  115 ---
  116 -- content/future.md --
  117 ---
  118 title: "Future"
  119 date: 2200-11-06
  120 ---
  121 -- layouts/_default/single.html --
  122 Page: {{ .Title }}|
  123 
  124 `
  125 	s := newTestHugoCmdBuilder(c, files, []string{"list", "future"})
  126 	s.captureOut = true
  127 	s.Build()
  128 	p := filepath.Join("content", "future.md")
  129 	s.AssertStdout(p + ",2200-11-06T00:00:00Z")
  130 
  131 	s = newTestHugoCmdBuilder(c, files, []string{"list", "future", "--clock", "2300-11-06"}).Build()
  132 	s.AssertStdout("")
  133 }
  134 
  135 type testHugoCmdBuilder struct {
  136 	*qt.C
  137 
  138 	fs    afero.Fs
  139 	dir   string
  140 	files string
  141 	args  []string
  142 
  143 	captureOut bool
  144 	out        string
  145 }
  146 
  147 func newTestHugoCmdBuilder(c *qt.C, files string, args []string) *testHugoCmdBuilder {
  148 	s := &testHugoCmdBuilder{C: c, files: files, args: args}
  149 	s.dir = s.TempDir()
  150 	s.fs = afero.NewBasePathFs(hugofs.Os, s.dir)
  151 
  152 	return s
  153 }
  154 
  155 func (s *testHugoCmdBuilder) Build() *testHugoCmdBuilder {
  156 	data := txtar.Parse([]byte(s.files))
  157 
  158 	for _, f := range data.Files {
  159 		filename := filepath.Clean(f.Name)
  160 		data := bytes.TrimSuffix(f.Data, []byte("\n"))
  161 		s.Assert(s.fs.MkdirAll(filepath.Dir(filename), 0777), qt.IsNil)
  162 		s.Assert(afero.WriteFile(s.fs, filename, data, 0666), qt.IsNil)
  163 	}
  164 
  165 	hugoCmd := newCommandsBuilder().addAll().build()
  166 	cmd := hugoCmd.getCommand()
  167 	args := append(s.args, "-s="+s.dir, "--quiet")
  168 	cmd.SetArgs(args)
  169 
  170 	if s.captureOut {
  171 		out, err := captureStdout(func() error {
  172 			_, err := cmd.ExecuteC()
  173 			return err
  174 		})
  175 		s.Assert(err, qt.IsNil)
  176 		s.out = out
  177 	} else {
  178 		_, err := cmd.ExecuteC()
  179 		s.Assert(err, qt.IsNil)
  180 	}
  181 
  182 	return s
  183 }
  184 
  185 func (s *testHugoCmdBuilder) AssertFileContent(filename string, matches ...string) {
  186 	s.Helper()
  187 	data, err := afero.ReadFile(s.fs, filename)
  188 	s.Assert(err, qt.IsNil)
  189 	content := strings.TrimSpace(string(data))
  190 	for _, m := range matches {
  191 		lines := strings.Split(m, "\n")
  192 		for _, match := range lines {
  193 			match = strings.TrimSpace(match)
  194 			if match == "" || strings.HasPrefix(match, "#") {
  195 				continue
  196 			}
  197 			s.Assert(content, qt.Contains, match, qt.Commentf(m))
  198 		}
  199 	}
  200 }
  201 
  202 func (s *testHugoCmdBuilder) AssertStdout(match string) {
  203 	s.Helper()
  204 	content := strings.TrimSpace(s.out)
  205 	s.Assert(content, qt.Contains, strings.TrimSpace(match))
  206 }