github.com/lyeb/hugo@v0.47.1/commands/commands_test.go (about)

     1  // Copyright 2018 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  	"fmt"
    18  	"io/ioutil"
    19  	"os"
    20  	"path/filepath"
    21  	"testing"
    22  
    23  	"github.com/spf13/cobra"
    24  	"github.com/spf13/viper"
    25  
    26  	"github.com/stretchr/testify/require"
    27  )
    28  
    29  func TestExecute(t *testing.T) {
    30  
    31  	assert := require.New(t)
    32  
    33  	dir, err := createSimpleTestSite(t)
    34  	assert.NoError(err)
    35  
    36  	defer func() {
    37  		os.RemoveAll(dir)
    38  	}()
    39  
    40  	resp := Execute([]string{"-s=" + dir})
    41  	assert.NoError(resp.Err)
    42  	result := resp.Result
    43  	assert.True(len(result.Sites) == 1)
    44  	assert.True(len(result.Sites[0].RegularPages) == 1)
    45  }
    46  
    47  func TestCommandsPersistentFlags(t *testing.T) {
    48  	assert := require.New(t)
    49  
    50  	noOpRunE := func(cmd *cobra.Command, args []string) error {
    51  		return nil
    52  	}
    53  
    54  	tests := []struct {
    55  		args  []string
    56  		check func(command []cmder)
    57  	}{{[]string{"server",
    58  		"--config=myconfig.toml",
    59  		"--contentDir=mycontent",
    60  		"--disableKinds=page,home",
    61  		"--layoutDir=mylayouts",
    62  		"--theme=mytheme",
    63  		"--gc",
    64  		"--themesDir=mythemes",
    65  		"--cleanDestinationDir",
    66  		"--navigateToChanged",
    67  		"--disableLiveReload",
    68  		"--noHTTPCache",
    69  		"--i18n-warnings",
    70  		"--destination=/tmp/mydestination",
    71  		"-b=https://example.com/b/",
    72  		"--port=1366",
    73  		"--renderToDisk",
    74  		"--source=mysource",
    75  		"--uglyURLs"}, func(commands []cmder) {
    76  		var sc *serverCmd
    77  		for _, command := range commands {
    78  			if b, ok := command.(commandsBuilderGetter); ok {
    79  				v := b.getCmmandsBuilder().hugoBuilderCommon
    80  				assert.Equal("myconfig.toml", v.cfgFile)
    81  				assert.Equal("mysource", v.source)
    82  				assert.Equal("https://example.com/b/", v.baseURL)
    83  			}
    84  
    85  			if srvCmd, ok := command.(*serverCmd); ok {
    86  				sc = srvCmd
    87  			}
    88  		}
    89  
    90  		assert.NotNil(sc)
    91  		assert.True(sc.navigateToChanged)
    92  		assert.True(sc.disableLiveReload)
    93  		assert.True(sc.noHTTPCache)
    94  		assert.True(sc.renderToDisk)
    95  		assert.Equal(1366, sc.serverPort)
    96  
    97  		cfg := viper.New()
    98  		sc.flagsToConfig(cfg)
    99  		assert.Equal("/tmp/mydestination", cfg.GetString("publishDir"))
   100  		assert.Equal("mycontent", cfg.GetString("contentDir"))
   101  		assert.Equal("mylayouts", cfg.GetString("layoutDir"))
   102  		assert.Equal("mytheme", cfg.GetString("theme"))
   103  		assert.Equal("mythemes", cfg.GetString("themesDir"))
   104  		assert.Equal("https://example.com/b/", cfg.GetString("baseURL"))
   105  
   106  		assert.Equal([]string{"page", "home"}, cfg.Get("disableKinds"))
   107  
   108  		assert.True(cfg.GetBool("uglyURLs"))
   109  		assert.True(cfg.GetBool("gc"))
   110  
   111  		// The flag is named i18n-warnings
   112  		assert.True(cfg.GetBool("logI18nWarnings"))
   113  
   114  	}}}
   115  
   116  	for _, test := range tests {
   117  		b := newCommandsBuilder()
   118  		root := b.addAll().build()
   119  
   120  		for _, c := range b.commands {
   121  			if c.getCommand() == nil {
   122  				continue
   123  			}
   124  			// We are only intereseted in the flag handling here.
   125  			c.getCommand().RunE = noOpRunE
   126  		}
   127  		rootCmd := root.getCommand()
   128  		rootCmd.SetArgs(test.args)
   129  		assert.NoError(rootCmd.Execute())
   130  		test.check(b.commands)
   131  	}
   132  
   133  }
   134  
   135  func TestCommandsExecute(t *testing.T) {
   136  
   137  	assert := require.New(t)
   138  
   139  	dir, err := createSimpleTestSite(t)
   140  	assert.NoError(err)
   141  
   142  	dirOut, err := ioutil.TempDir("", "hugo-cli-out")
   143  	assert.NoError(err)
   144  
   145  	defer func() {
   146  		os.RemoveAll(dir)
   147  		os.RemoveAll(dirOut)
   148  	}()
   149  
   150  	sourceFlag := fmt.Sprintf("-s=%s", dir)
   151  
   152  	tests := []struct {
   153  		commands           []string
   154  		flags              []string
   155  		expectErrToContain string
   156  	}{
   157  		// TODO(bep) permission issue on my OSX? "operation not permitted" {[]string{"check", "ulimit"}, nil, false},
   158  		{[]string{"env"}, nil, ""},
   159  		{[]string{"version"}, nil, ""},
   160  		// no args = hugo build
   161  		{nil, []string{sourceFlag}, ""},
   162  		{nil, []string{sourceFlag, "--renderToMemory"}, ""},
   163  		{[]string{"config"}, []string{sourceFlag}, ""},
   164  		{[]string{"benchmark"}, []string{sourceFlag, "-n=1"}, ""},
   165  		{[]string{"convert", "toTOML"}, []string{sourceFlag, "-o=" + filepath.Join(dirOut, "toml")}, ""},
   166  		{[]string{"convert", "toYAML"}, []string{sourceFlag, "-o=" + filepath.Join(dirOut, "yaml")}, ""},
   167  		{[]string{"convert", "toJSON"}, []string{sourceFlag, "-o=" + filepath.Join(dirOut, "json")}, ""},
   168  		{[]string{"gen", "autocomplete"}, []string{"--completionfile=" + filepath.Join(dirOut, "autocomplete.txt")}, ""},
   169  		{[]string{"gen", "chromastyles"}, []string{"--style=manni"}, ""},
   170  		{[]string{"gen", "doc"}, []string{"--dir=" + filepath.Join(dirOut, "doc")}, ""},
   171  		{[]string{"gen", "man"}, []string{"--dir=" + filepath.Join(dirOut, "man")}, ""},
   172  		{[]string{"list", "drafts"}, []string{sourceFlag}, ""},
   173  		{[]string{"list", "expired"}, []string{sourceFlag}, ""},
   174  		{[]string{"list", "future"}, []string{sourceFlag}, ""},
   175  		{[]string{"new", "new-page.md"}, []string{sourceFlag}, ""},
   176  		{[]string{"new", "site", filepath.Join(dirOut, "new-site")}, nil, ""},
   177  		{[]string{"unknowncommand"}, nil, "unknown command"},
   178  		// TODO(bep) cli refactor fix https://github.com/gohugoio/hugo/issues/4450
   179  		//{[]string{"new", "theme", filepath.Join(dirOut, "new-theme")}, nil,false},
   180  	}
   181  
   182  	for _, test := range tests {
   183  
   184  		hugoCmd := newCommandsBuilder().addAll().build().getCommand()
   185  		test.flags = append(test.flags, "--quiet")
   186  		hugoCmd.SetArgs(append(test.commands, test.flags...))
   187  
   188  		// TODO(bep) capture output and add some simple asserts
   189  		// TODO(bep) misspelled subcommands does not return an error. We should investigate this
   190  		// but before that, check for "Error: unknown command".
   191  
   192  		_, err := hugoCmd.ExecuteC()
   193  		if test.expectErrToContain != "" {
   194  			assert.Error(err, fmt.Sprintf("%v", test.commands))
   195  			assert.Contains(err.Error(), test.expectErrToContain)
   196  		} else {
   197  			assert.NoError(err, fmt.Sprintf("%v", test.commands))
   198  		}
   199  
   200  	}
   201  
   202  }
   203  
   204  func createSimpleTestSite(t *testing.T) (string, error) {
   205  	d, e := ioutil.TempDir("", "hugo-cli")
   206  	if e != nil {
   207  		return "", e
   208  	}
   209  
   210  	// Just the basic. These are for CLI tests, not site testing.
   211  	writeFile(t, filepath.Join(d, "config.toml"), `
   212  
   213  baseURL = "https://example.org"
   214  title = "Hugo Commands"
   215  
   216  `)
   217  
   218  	writeFile(t, filepath.Join(d, "content", "p1.md"), `
   219  ---
   220  title: "P1"
   221  weight: 1
   222  ---
   223  
   224  Content
   225  
   226  `)
   227  
   228  	writeFile(t, filepath.Join(d, "layouts", "_default", "single.html"), `
   229  
   230  Single: {{ .Title }}
   231  
   232  `)
   233  
   234  	writeFile(t, filepath.Join(d, "layouts", "_default", "list.html"), `
   235  
   236  List: {{ .Title }}
   237  
   238  `)
   239  
   240  	return d, nil
   241  
   242  }
   243  
   244  func writeFile(t *testing.T, filename, content string) {
   245  	must(t, os.MkdirAll(filepath.Dir(filename), os.FileMode(0755)))
   246  	must(t, ioutil.WriteFile(filename, []byte(content), os.FileMode(0755)))
   247  }
   248  
   249  func must(t *testing.T, err error) {
   250  	if err != nil {
   251  		t.Fatal(err)
   252  	}
   253  }