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