mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-10-28 09:12:52 -04:00 
			
		
		
		
	- Server types no longer need to store their own contexts; they are stored on the caddy.Instance, which means each context will be properly GC'ed when the instance is stopped. Server types should use type assertions to convert from caddy.Context to their concrete context type when they need to use it. - Pass the entire context into httpserver.GetConfig instead of only the Key field. - caddy.NewTestController now requires a server type string so it can create a controller with the proper concrete context associated with that server type. Tests still need more attention so that we can test the proper creation of startup functions, etc.
		
			
				
	
	
		
			154 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package markdown
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 	"net/http"
 | |
| 	"testing"
 | |
| 	"text/template"
 | |
| 
 | |
| 	"github.com/mholt/caddy"
 | |
| 	"github.com/mholt/caddy/caddyhttp/httpserver"
 | |
| )
 | |
| 
 | |
| func TestSetup(t *testing.T) {
 | |
| 	c := caddy.NewTestController("http", `markdown /blog`)
 | |
| 	err := setup(c)
 | |
| 	if err != nil {
 | |
| 		t.Errorf("Expected no errors, got: %v", err)
 | |
| 	}
 | |
| 	mids := httpserver.GetConfig(c).Middleware()
 | |
| 	if len(mids) == 0 {
 | |
| 		t.Fatal("Expected middleware, got 0 instead")
 | |
| 	}
 | |
| 
 | |
| 	handler := mids[0](httpserver.EmptyNext)
 | |
| 	myHandler, ok := handler.(Markdown)
 | |
| 
 | |
| 	if !ok {
 | |
| 		t.Fatalf("Expected handler to be type Markdown, got: %#v", handler)
 | |
| 	}
 | |
| 
 | |
| 	if myHandler.Configs[0].PathScope != "/blog" {
 | |
| 		t.Errorf("Expected /blog as the Path Scope")
 | |
| 	}
 | |
| 	if len(myHandler.Configs[0].Extensions) != 3 {
 | |
| 		t.Error("Expected 3 markdown extensions")
 | |
| 	}
 | |
| 	for _, key := range []string{".md", ".markdown", ".mdown"} {
 | |
| 		if ext, ok := myHandler.Configs[0].Extensions[key]; !ok {
 | |
| 			t.Errorf("Expected extensions to contain %v", ext)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestMarkdownParse(t *testing.T) {
 | |
| 	tests := []struct {
 | |
| 		inputMarkdownConfig    string
 | |
| 		shouldErr              bool
 | |
| 		expectedMarkdownConfig []Config
 | |
| 	}{
 | |
| 
 | |
| 		{`markdown /blog {
 | |
| 	ext .md .txt
 | |
| 	css /resources/css/blog.css
 | |
| 	js  /resources/js/blog.js
 | |
| }`, false, []Config{{
 | |
| 			PathScope: "/blog",
 | |
| 			Extensions: map[string]struct{}{
 | |
| 				".md":  {},
 | |
| 				".txt": {},
 | |
| 			},
 | |
| 			Styles:   []string{"/resources/css/blog.css"},
 | |
| 			Scripts:  []string{"/resources/js/blog.js"},
 | |
| 			Template: GetDefaultTemplate(),
 | |
| 		}}},
 | |
| 		{`markdown /blog {
 | |
| 	ext .md
 | |
| 	template tpl_with_include.html
 | |
| }`, false, []Config{{
 | |
| 			PathScope: "/blog",
 | |
| 			Extensions: map[string]struct{}{
 | |
| 				".md": {},
 | |
| 			},
 | |
| 			Template: GetDefaultTemplate(),
 | |
| 		}}},
 | |
| 	}
 | |
| 	// Setup the extra template
 | |
| 	tmpl := tests[1].expectedMarkdownConfig[0].Template
 | |
| 	SetTemplate(tmpl, "", "./testdata/tpl_with_include.html")
 | |
| 
 | |
| 	for i, test := range tests {
 | |
| 		c := caddy.NewTestController("http", test.inputMarkdownConfig)
 | |
| 		httpserver.GetConfig(c).Root = "./testdata"
 | |
| 		actualMarkdownConfigs, err := markdownParse(c)
 | |
| 
 | |
| 		if err == nil && test.shouldErr {
 | |
| 			t.Errorf("Test %d didn't error, but it should have", i)
 | |
| 		} else if err != nil && !test.shouldErr {
 | |
| 			t.Errorf("Test %d errored, but it shouldn't have; got '%v'", i, err)
 | |
| 		}
 | |
| 		if len(actualMarkdownConfigs) != len(test.expectedMarkdownConfig) {
 | |
| 			t.Fatalf("Test %d expected %d no of WebSocket configs, but got %d ",
 | |
| 				i, len(test.expectedMarkdownConfig), len(actualMarkdownConfigs))
 | |
| 		}
 | |
| 		for j, actualMarkdownConfig := range actualMarkdownConfigs {
 | |
| 
 | |
| 			if actualMarkdownConfig.PathScope != test.expectedMarkdownConfig[j].PathScope {
 | |
| 				t.Errorf("Test %d expected %dth Markdown PathScope to be  %s  , but got %s",
 | |
| 					i, j, test.expectedMarkdownConfig[j].PathScope, actualMarkdownConfig.PathScope)
 | |
| 			}
 | |
| 
 | |
| 			if fmt.Sprint(actualMarkdownConfig.Styles) != fmt.Sprint(test.expectedMarkdownConfig[j].Styles) {
 | |
| 				t.Errorf("Test %d expected %dth Markdown Config Styles to be  %s  , but got %s",
 | |
| 					i, j, fmt.Sprint(test.expectedMarkdownConfig[j].Styles), fmt.Sprint(actualMarkdownConfig.Styles))
 | |
| 			}
 | |
| 			if fmt.Sprint(actualMarkdownConfig.Scripts) != fmt.Sprint(test.expectedMarkdownConfig[j].Scripts) {
 | |
| 				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 ok, tx, ty := equalTemplates(actualMarkdownConfig.Template, test.expectedMarkdownConfig[j].Template); !ok {
 | |
| 				t.Errorf("Test %d the %dth Markdown Config Templates did not match, expected %s to be %s", i, j, tx, ty)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func equalTemplates(i, j *template.Template) (bool, string, string) {
 | |
| 	// Just in case :)
 | |
| 	if i == j {
 | |
| 		return true, "", ""
 | |
| 	}
 | |
| 
 | |
| 	// We can't do much here, templates can't really be compared.  However,
 | |
| 	// we can execute the templates and compare their outputs to be reasonably
 | |
| 	// sure that they're the same.
 | |
| 
 | |
| 	// This is exceedingly ugly.
 | |
| 	ctx := httpserver.Context{
 | |
| 		Root: http.Dir("./testdata"),
 | |
| 	}
 | |
| 
 | |
| 	md := Data{
 | |
| 		Context:  ctx,
 | |
| 		Doc:      make(map[string]string),
 | |
| 		DocFlags: make(map[string]bool),
 | |
| 		Styles:   []string{"style1"},
 | |
| 		Scripts:  []string{"js1"},
 | |
| 	}
 | |
| 	md.Doc["title"] = "some title"
 | |
| 	md.Doc["body"] = "some body"
 | |
| 
 | |
| 	bufi := new(bytes.Buffer)
 | |
| 	bufj := new(bytes.Buffer)
 | |
| 
 | |
| 	if err := i.Execute(bufi, md); err != nil {
 | |
| 		return false, fmt.Sprintf("%v", err), ""
 | |
| 	}
 | |
| 	if err := j.Execute(bufj, md); err != nil {
 | |
| 		return false, "", fmt.Sprintf("%v", err)
 | |
| 	}
 | |
| 
 | |
| 	return bytes.Equal(bufi.Bytes(), bufj.Bytes()), string(bufi.Bytes()), string(bufj.Bytes())
 | |
| }
 |