// Copyright 2014 beego Author. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package beego import ( "bytes" "net/http" "os" "path/filepath" "testing" "github.com/elazarl/go-bindata-assetfs" "github.com/stretchr/testify/assert" "github.com/astaxie/beego/pkg/testdata" ) var header = `{{define "header"}}

Hello, astaxie!

{{end}}` var index = ` beego welcome template {{template "block"}} {{template "header"}} {{template "blocks/block.tpl"}} ` var block = `{{define "block"}}

Hello, blocks!

{{end}}` func TestTemplate(t *testing.T) { wkdir, err := os.Getwd() assert.Nil(t, err) dir := filepath.Join(wkdir, "_beeTmp", "TestTemplate") files := []string{ "header.tpl", "index.tpl", "blocks/block.tpl", } if err := os.MkdirAll(dir, 0777); err != nil { t.Fatal(err) } for k, name := range files { dirErr := os.MkdirAll(filepath.Dir(filepath.Join(dir, name)), 0777) assert.Nil(t, dirErr) if f, err := os.Create(filepath.Join(dir, name)); err != nil { t.Fatal(err) } else { if k == 0 { f.WriteString(header) } else if k == 1 { f.WriteString(index) } else if k == 2 { f.WriteString(block) } f.Close() } } if err := AddViewPath(dir); err != nil { t.Fatal(err) } beeTemplates := beeViewPathTemplates[dir] if len(beeTemplates) != 3 { t.Fatalf("should be 3 but got %v", len(beeTemplates)) } if err := beeTemplates["index.tpl"].ExecuteTemplate(os.Stdout, "index.tpl", nil); err != nil { t.Fatal(err) } for _, name := range files { os.RemoveAll(filepath.Join(dir, name)) } os.RemoveAll(dir) } var menu = ` ` var user = ` beego welcome template {{template "../public/menu.tpl"}} ` func TestRelativeTemplate(t *testing.T) { wkdir, err := os.Getwd() assert.Nil(t, err) dir := filepath.Join(wkdir, "_beeTmp") //Just add dir to known viewPaths if err := AddViewPath(dir); err != nil { t.Fatal(err) } files := []string{ "easyui/public/menu.tpl", "easyui/rbac/user.tpl", } if err := os.MkdirAll(dir, 0777); err != nil { t.Fatal(err) } for k, name := range files { os.MkdirAll(filepath.Dir(filepath.Join(dir, name)), 0777) if f, err := os.Create(filepath.Join(dir, name)); err != nil { t.Fatal(err) } else { if k == 0 { f.WriteString(menu) } else if k == 1 { f.WriteString(user) } f.Close() } } if err := BuildTemplate(dir, files[1]); err != nil { t.Fatal(err) } beeTemplates := beeViewPathTemplates[dir] if err := beeTemplates["easyui/rbac/user.tpl"].ExecuteTemplate(os.Stdout, "easyui/rbac/user.tpl", nil); err != nil { t.Fatal(err) } for _, name := range files { os.RemoveAll(filepath.Join(dir, name)) } os.RemoveAll(dir) } var add = `{{ template "layout_blog.tpl" . }} {{ define "css" }} {{ end}} {{ define "content" }}

{{ .Title }}

This is SomeVar: {{ .SomeVar }}

{{ end }} {{ define "js" }} {{ end}}` var layoutBlog = ` Lin Li {{ block "css" . }}{{ end }}
{{ block "content" . }}{{ end }}
{{ block "js" . }}{{ end }} ` var output = ` Lin Li

Hello

This is SomeVar: val

` func TestTemplateLayout(t *testing.T) { wkdir, err := os.Getwd() assert.Nil(t, err) dir := filepath.Join(wkdir, "_beeTmp", "TestTemplateLayout") files := []string{ "add.tpl", "layout_blog.tpl", } if err := os.MkdirAll(dir, 0777); err != nil { t.Fatal(err) } for k, name := range files { dirErr := os.MkdirAll(filepath.Dir(filepath.Join(dir, name)), 0777) assert.Nil(t, dirErr) if f, err := os.Create(filepath.Join(dir, name)); err != nil { t.Fatal(err) } else { if k == 0 { _, writeErr := f.WriteString(add) assert.Nil(t, writeErr) } else if k == 1 { _, writeErr := f.WriteString(layoutBlog) assert.Nil(t, writeErr) } clErr := f.Close() assert.Nil(t, clErr) } } if err := AddViewPath(dir); err != nil { t.Fatal(err) } beeTemplates := beeViewPathTemplates[dir] if len(beeTemplates) != 2 { t.Fatalf("should be 2 but got %v", len(beeTemplates)) } out := bytes.NewBufferString("") if err := beeTemplates["add.tpl"].ExecuteTemplate(out, "add.tpl", map[string]string{"Title": "Hello", "SomeVar": "val"}); err != nil { t.Fatal(err) } if out.String() != output { t.Log(out.String()) t.Fatal("Compare failed") } for _, name := range files { os.RemoveAll(filepath.Join(dir, name)) } os.RemoveAll(dir) } type TestingFileSystem struct { assetfs *assetfs.AssetFS } func (d TestingFileSystem) Open(name string) (http.File, error) { return d.assetfs.Open(name) } var outputBinData = ` beego welcome template

Hello, blocks!

Hello, astaxie!

Hello

This is SomeVar: val

` func TestFsBinData(t *testing.T) { SetTemplateFSFunc(func() http.FileSystem { return TestingFileSystem{&assetfs.AssetFS{Asset: testdata.Asset, AssetDir: testdata.AssetDir, AssetInfo: testdata.AssetInfo}} }) dir := "views" if err := AddViewPath("views"); err != nil { t.Fatal(err) } beeTemplates := beeViewPathTemplates[dir] if len(beeTemplates) != 3 { t.Fatalf("should be 3 but got %v", len(beeTemplates)) } if err := beeTemplates["index.tpl"].ExecuteTemplate(os.Stdout, "index.tpl", map[string]string{"Title": "Hello", "SomeVar": "val"}); err != nil { t.Fatal(err) } out := bytes.NewBufferString("") if err := beeTemplates["index.tpl"].ExecuteTemplate(out, "index.tpl", map[string]string{"Title": "Hello", "SomeVar": "val"}); err != nil { t.Fatal(err) } if out.String() != outputBinData { t.Log(out.String()) t.Fatal("Compare failed") } }