From 0168a627a4fa9697af6edc483ec7197fd0a74ab9 Mon Sep 17 00:00:00 2001
From: Maxime <maxlasserre@free.fr>
Date: Wed, 29 Jul 2015 16:21:35 +0200
Subject: [PATCH] Added test on markdown static files generation

---
 config/setup/markdown_test.go                 | 100 +++++++++++++++++-
 config/setup/testdata/blog/first_post.md      |   1 +
 config/setup/testdata/header.html             |   1 +
 config/setup/testdata/tpl_with_include.html   |  10 ++
 middleware/markdown/markdown_test.go          |  39 +++++++
 middleware/markdown/testdata/og/first.md      |   1 +
 .../testdata/og_static/og/first.md/index.html |  12 +++
 7 files changed, 161 insertions(+), 3 deletions(-)
 create mode 100644 config/setup/testdata/blog/first_post.md
 create mode 100644 config/setup/testdata/header.html
 create mode 100644 config/setup/testdata/tpl_with_include.html
 create mode 100644 middleware/markdown/testdata/og/first.md
 create mode 100644 middleware/markdown/testdata/og_static/og/first.md/index.html

diff --git a/config/setup/markdown_test.go b/config/setup/markdown_test.go
index c84a118dd..c8b2f3154 100644
--- a/config/setup/markdown_test.go
+++ b/config/setup/markdown_test.go
@@ -2,8 +2,14 @@ package setup
 
 import (
 	"fmt"
-	"github.com/mholt/caddy/middleware/markdown"
+	"io/ioutil"
+	"net/http"
+	"os"
+	"path/filepath"
 	"testing"
+
+	"github.com/mholt/caddy/middleware"
+	"github.com/mholt/caddy/middleware/markdown"
 )
 
 func TestMarkdown(t *testing.T) {
@@ -33,8 +39,82 @@ func TestMarkdown(t *testing.T) {
 	if fmt.Sprint(myHandler.Configs[0].Extensions) != fmt.Sprint([]string{".md"}) {
 		t.Errorf("Expected .md  as the Default Extension")
 	}
-
 }
+
+func TestMarkdownStaticGen(t *testing.T) {
+	c := NewTestController(`markdown /blog {
+	ext .md
+	template tpl_with_include.html
+	sitegen
+}`)
+
+	c.Root = "./testdata"
+	mid, err := Markdown(c)
+
+	if err != nil {
+		t.Errorf("Expected no errors, got: %v", err)
+	}
+
+	if mid == nil {
+		t.Fatal("Expected middleware, was nil instead")
+	}
+
+	for _, start := range c.Startup {
+		err := start()
+		if err != nil {
+			t.Errorf("Startup error: %v", err)
+		}
+	}
+
+	next := middleware.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) {
+		t.Fatalf("Next shouldn't be called")
+		return 0, nil
+	})
+	hndlr := mid(next)
+	mkdwn, ok := hndlr.(markdown.Markdown)
+	if !ok {
+		t.Fatalf("Was expecting a markdown.Markdown but got %T", hndlr)
+	}
+
+	expectedStaticFiles := map[string]string{"/blog/first_post.md": "testdata/generated_site/blog/first_post.md/index.html"}
+	if fmt.Sprint(expectedStaticFiles) != fmt.Sprint(mkdwn.Configs[0].StaticFiles) {
+		t.Fatalf("Test expected StaticFiles to be  %s, but got %s",
+			fmt.Sprint(expectedStaticFiles), fmt.Sprint(mkdwn.Configs[0].StaticFiles))
+	}
+
+	filePath := "testdata/generated_site/blog/first_post.md/index.html"
+	if _, err := os.Stat(filePath); err != nil {
+		t.Fatalf("An error occured when getting the file information: %v", err)
+	}
+
+	html, err := ioutil.ReadFile(filePath)
+	if err != nil {
+		t.Fatalf("An error occured when getting the file content: %v", err)
+	}
+
+	expectedBody := `<!DOCTYPE html>
+<html>
+<head>
+<title>first_post</title>
+</head>
+<body>
+<h1>Header title</h1>
+
+<h1>Test h1</h1>
+
+</body>
+</html>
+`
+	if string(html) != expectedBody {
+		t.Fatalf("Expected file content: %v got: %v", expectedBody, html)
+	}
+
+	fp := filepath.Join(c.Root, markdown.DefaultStaticDir)
+	if err = os.RemoveAll(fp); err != nil {
+		t.Errorf("Error while removing the generated static files: ", err)
+	}
+}
+
 func TestMarkdownParse(t *testing.T) {
 	tests := []struct {
 		inputMarkdownConfig    string
@@ -52,9 +132,20 @@ func TestMarkdownParse(t *testing.T) {
 			Styles:     []string{"/resources/css/blog.css"},
 			Scripts:    []string{"/resources/js/blog.js"},
 		}}},
+		{`markdown /blog {
+	ext .md
+	template tpl_with_include.html
+	sitegen
+}`, false, []markdown.Config{{
+			PathScope:  "/blog",
+			Extensions: []string{".md"},
+			Templates:  map[string]string{markdown.DefaultTemplate: "testdata/tpl_with_include.html"},
+			StaticDir:  markdown.DefaultStaticDir,
+		}}},
 	}
 	for i, test := range tests {
 		c := NewTestController(test.inputMarkdownConfig)
+		c.Root = "./testdata"
 		actualMarkdownConfigs, err := markdownParse(c)
 
 		if err == nil && test.shouldErr {
@@ -81,7 +172,10 @@ func TestMarkdownParse(t *testing.T) {
 				t.Errorf("Test %d expected %dth Markdown Config Scripts to be  %s  , but got %s",
 					i, j, fmt.Sprint(test.expectedMarkdownConfig[j].Scripts), fmt.Sprint(actualMarkdownConfig.Scripts))
 			}
-
+			if fmt.Sprint(actualMarkdownConfig.Templates) != fmt.Sprint(test.expectedMarkdownConfig[j].Templates) {
+				t.Errorf("Test %d expected %dth Markdown Config Templates to be  %s  , but got %s",
+					i, j, fmt.Sprint(test.expectedMarkdownConfig[j].Templates), fmt.Sprint(actualMarkdownConfig.Templates))
+			}
 		}
 	}
 
diff --git a/config/setup/testdata/blog/first_post.md b/config/setup/testdata/blog/first_post.md
new file mode 100644
index 000000000..f26583b75
--- /dev/null
+++ b/config/setup/testdata/blog/first_post.md
@@ -0,0 +1 @@
+# Test h1
diff --git a/config/setup/testdata/header.html b/config/setup/testdata/header.html
new file mode 100644
index 000000000..9c96e0e37
--- /dev/null
+++ b/config/setup/testdata/header.html
@@ -0,0 +1 @@
+<h1>Header title</h1>
diff --git a/config/setup/testdata/tpl_with_include.html b/config/setup/testdata/tpl_with_include.html
new file mode 100644
index 000000000..95eeae0c8
--- /dev/null
+++ b/config/setup/testdata/tpl_with_include.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>{{.Doc.title}}</title>
+</head>
+<body>
+{{.Include "header.html"}}
+{{.Doc.body}}
+</body>
+</html>
diff --git a/middleware/markdown/markdown_test.go b/middleware/markdown/markdown_test.go
index e01d88e8e..a58b772f7 100644
--- a/middleware/markdown/markdown_test.go
+++ b/middleware/markdown/markdown_test.go
@@ -33,6 +33,16 @@ func TestMarkdown(t *testing.T) {
 				Scripts:    []string{"/resources/js/log.js", "/resources/js/default.js"},
 				Templates:  make(map[string]string),
 			},
+			Config{
+				Renderer:    blackfriday.HtmlRenderer(0, "", ""),
+				PathScope:   "/og",
+				Extensions:  []string{".md"},
+				Styles:      []string{},
+				Scripts:     []string{},
+				Templates:   templates,
+				StaticDir:   "/og_static",
+				StaticFiles: map[string]string{"/og/first.md": "testdata/og_static/og/first.md/index.html"},
+			},
 		},
 		IndexFiles: []string{"index.html"},
 		Next: middleware.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) {
@@ -123,4 +133,33 @@ func getTrue() bool {
 	if respBody != expectedBody {
 		t.Fatalf("Expected body: %v got: %v", expectedBody, respBody)
 	}
+
+	req, err = http.NewRequest("GET", "/og/first.md", nil)
+	if err != nil {
+		t.Fatalf("Could not create HTTP request: %v", err)
+	}
+	rec = httptest.NewRecorder()
+
+	md.ServeHTTP(rec, req)
+	if rec.Code != http.StatusOK {
+		t.Fatalf("Wrong status, expected: %d and got %d", http.StatusOK, rec.Code)
+	}
+	respBody = rec.Body.String()
+	expectedBody = `<!DOCTYPE html>
+<html>
+<head>
+<title>first_post</title>
+</head>
+<body>
+<h1>Header title</h1>
+
+<h1>Test h1</h1>
+
+</body>
+</html>`
+	respBody = replacer.Replace(respBody)
+	expectedBody = replacer.Replace(expectedBody)
+	if respBody != expectedBody {
+		t.Fatalf("Expected body: %v got: %v", expectedBody, respBody)
+	}
 }
diff --git a/middleware/markdown/testdata/og/first.md b/middleware/markdown/testdata/og/first.md
new file mode 100644
index 000000000..f26583b75
--- /dev/null
+++ b/middleware/markdown/testdata/og/first.md
@@ -0,0 +1 @@
+# Test h1
diff --git a/middleware/markdown/testdata/og_static/og/first.md/index.html b/middleware/markdown/testdata/og_static/og/first.md/index.html
new file mode 100644
index 000000000..4dd4a5a24
--- /dev/null
+++ b/middleware/markdown/testdata/og_static/og/first.md/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>first_post</title>
+</head>
+<body>
+<h1>Header title</h1>
+
+<h1>Test h1</h1>
+
+</body>
+</html>