shithub: hugo

Download patch

ref: a7d00fc39e87a5cac99b3a2380f5cc8c135d2b4b
parent: 1e233b1c4598fd8cbce7da8a67bf2c4918c6047e
author: Bjørn Erik Pedersen <[email protected]>
date: Wed Apr 11 05:38:58 EDT 2018

commands: Add basic server test

See #4598

--- a/commands/gendoc.go
+++ b/commands/gendoc.go
@@ -66,7 +66,7 @@
 					return err
 				}
 			}
-			now := time.Now().Format(time.RFC3339)
+			now := time.Now().Format("2006-01-02")
 			prepender := func(filename string) string {
 				name := filepath.Base(filename)
 				base := strings.TrimSuffix(name, path.Ext(name))
--- a/commands/server.go
+++ b/commands/server.go
@@ -39,6 +39,11 @@
 )
 
 type serverCmd struct {
+	// Can be used to stop the server. Useful in tests
+	stop <-chan bool
+	// Can be used to receive notification about when the server is started. Useful in tests.
+	started chan<- bool
+
 	disableLiveReload bool
 	navigateToChanged bool
 	renderToDisk      bool
@@ -55,8 +60,12 @@
 }
 
 func newServerCmd() *serverCmd {
-	cc := &serverCmd{}
+	return newServerCmdSignaled(nil, nil)
+}
 
+func newServerCmdSignaled(stop <-chan bool, started chan<- bool) *serverCmd {
+	cc := &serverCmd{stop: stop, started: started}
+
 	cc.baseBuilderCmd = newBuilderCmd(&cobra.Command{
 		Use:     "server",
 		Aliases: []string{"serve"},
@@ -394,9 +403,20 @@
 		}()
 	}
 
+	if s.started != nil {
+		s.started <- true
+	}
+
 	jww.FEEDBACK.Println("Press Ctrl+C to stop")
 
-	<-sigs
+	if s.stop != nil {
+		select {
+		case <-sigs:
+		case <-s.stop:
+		}
+	} else {
+		<-sigs
+	}
 
 	return nil
 }
--- a/commands/server_test.go
+++ b/commands/server_test.go
@@ -14,10 +14,59 @@
 package commands
 
 import (
+	"fmt"
+	"net/http"
+	"os"
 	"testing"
+	"time"
 
+	"github.com/gohugoio/hugo/helpers"
+
 	"github.com/spf13/viper"
+	"github.com/stretchr/testify/require"
 )
+
+func TestServer(t *testing.T) {
+	assert := require.New(t)
+	dir, err := createSimpleTestSite(t)
+	assert.NoError(err)
+
+	// Let us hope that this port is available on all systems ...
+	port := 1331
+
+	defer func() {
+		os.RemoveAll(dir)
+	}()
+
+	stop, started := make(chan bool), make(chan bool)
+
+	scmd := newServerCmdSignaled(stop, started)
+
+	cmd := scmd.getCommand()
+	cmd.SetArgs([]string{"-s=" + dir, fmt.Sprintf("-p=%d", port)})
+
+	go func() {
+		_, err = cmd.ExecuteC()
+		assert.NoError(err)
+	}()
+
+	select {
+	case <-started:
+	case <-time.After(2 * time.Second):
+		t.Fatal("server start took too long")
+	}
+
+	resp, err := http.Get("http://localhost:1331/")
+	assert.NoError(err)
+	defer resp.Body.Close()
+	homeContent := helpers.ReaderToString(resp.Body)
+
+	assert.Contains(homeContent, "List: Hugo Commands")
+
+	// Stop the server.
+	stop <- true
+
+}
 
 func TestFixURL(t *testing.T) {
 	type data struct {