github.com/mattermost/mattermost-server/v5@v5.39.3/shared/templates/templates_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package templates 5 6 import ( 7 "bytes" 8 "html/template" 9 "io/ioutil" 10 "os" 11 "path/filepath" 12 "testing" 13 "time" 14 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestHTMLTemplateWatcher(t *testing.T) { 20 dir, err := ioutil.TempDir("", "") 21 require.NoError(t, err) 22 defer os.RemoveAll(dir) 23 24 require.NoError(t, os.Mkdir(filepath.Join(dir, "templates"), 0700)) 25 require.NoError(t, ioutil.WriteFile(filepath.Join(dir, "templates", "foo.html"), []byte(`{{ define "foo" }}foo{{ end }}`), 0600)) 26 27 prevDir, err := os.Getwd() 28 require.NoError(t, err) 29 defer os.Chdir(prevDir) 30 os.Chdir(dir) 31 32 watcher, errChan, err := NewWithWatcher("templates") 33 require.NoError(t, err) 34 require.NotNil(t, watcher) 35 select { 36 case msg := <-errChan: 37 err = msg 38 default: 39 err = nil 40 } 41 require.NoError(t, err) 42 defer watcher.Close() 43 44 text, err := watcher.RenderToString("foo", Data{}) 45 require.NoError(t, err) 46 assert.Equal(t, "foo", text) 47 48 require.NoError(t, ioutil.WriteFile(filepath.Join(dir, "templates", "foo.html"), []byte(`{{ define "foo" }}bar{{ end }}`), 0600)) 49 50 require.Eventually(t, func() bool { 51 text, err := watcher.RenderToString("foo", Data{}) 52 return text == "bar" && err == nil 53 }, time.Millisecond*1000, time.Millisecond*50) 54 } 55 56 func TestNewWithWatcher_BadDirectory(t *testing.T) { 57 watcher, errChan, err := NewWithWatcher("notarealdirectory") 58 require.Error(t, err) 59 assert.Nil(t, watcher) 60 assert.Nil(t, errChan) 61 } 62 63 func TestNew_BadDirectory(t *testing.T) { 64 watcher, err := New("notarealdirectory") 65 assert.Nil(t, watcher) 66 assert.Error(t, err) 67 } 68 69 func TestRender(t *testing.T) { 70 tpl := template.New("test") 71 _, err := tpl.Parse(`{{ define "foo" }}foo{{ .Props.Bar }}{{ end }}`) 72 require.NoError(t, err) 73 mt := NewFromTemplate(tpl) 74 75 data := Data{ 76 Props: map[string]interface{}{ 77 "Bar": "bar", 78 }, 79 } 80 text, err := mt.RenderToString("foo", data) 81 require.NoError(t, err) 82 assert.Equal(t, "foobar", text) 83 84 buf := &bytes.Buffer{} 85 require.NoError(t, mt.Render(buf, "foo", data)) 86 assert.Equal(t, "foobar", buf.String()) 87 } 88 89 func TestRenderError(t *testing.T) { 90 tpl := template.New("test") 91 _, err := tpl.Parse(`{{ define "foo" }}foo{{ .Foo.Bar }}bar{{ end }}`) 92 require.NoError(t, err) 93 mt := NewFromTemplate(tpl) 94 95 text, err := mt.RenderToString("foo", Data{}) 96 require.Error(t, err) 97 assert.Equal(t, "", text) 98 99 buf := &bytes.Buffer{} 100 assert.Error(t, mt.Render(buf, "foo", Data{})) 101 assert.Equal(t, "foo", buf.String()) 102 } 103 104 func TestRenderUnknownTemplate(t *testing.T) { 105 tpl := template.New("") 106 mt := NewFromTemplate(tpl) 107 108 text, err := mt.RenderToString("foo", Data{}) 109 require.Error(t, err) 110 assert.Equal(t, "", text) 111 112 buf := &bytes.Buffer{} 113 assert.Error(t, mt.Render(buf, "foo", Data{})) 114 assert.Equal(t, "", buf.String()) 115 }