* Extracting html templates into a library * Moving tests to the right place * Fixing tests * Addressing PR review comments * Addressing PR review comments * Replacing attomic with RWMutex * Returning errors as channel for Templates watcher * Address PR review comments * Other small fixes * Simplifying NewWithWatcher * Addressing PR review comments * Making error handling on rendering templates more robust * Fixing tests * Changing how we return errors * Fixing shadow variables * Addressing PR review comments * Logging errors from the outside of sendNotificationEmail * Fixing lock in shutdown * Fixing the resource copy for commands tests temporary directories * Removing unused import * A couple of tiny fixes
116 строки
2.8 KiB
Go
116 строки
2.8 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package templates
|
|
|
|
import (
|
|
"bytes"
|
|
"html/template"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestHTMLTemplateWatcher(t *testing.T) {
|
|
dir, err := ioutil.TempDir("", "")
|
|
require.NoError(t, err)
|
|
defer os.RemoveAll(dir)
|
|
|
|
require.NoError(t, os.Mkdir(filepath.Join(dir, "templates"), 0700))
|
|
require.NoError(t, ioutil.WriteFile(filepath.Join(dir, "templates", "foo.html"), []byte(`{{ define "foo" }}foo{{ end }}`), 0600))
|
|
|
|
prevDir, err := os.Getwd()
|
|
require.NoError(t, err)
|
|
defer os.Chdir(prevDir)
|
|
os.Chdir(dir)
|
|
|
|
watcher, errChan, err := NewWithWatcher("templates")
|
|
require.NoError(t, err)
|
|
require.NotNil(t, watcher)
|
|
select {
|
|
case msg := <-errChan:
|
|
err = msg
|
|
default:
|
|
err = nil
|
|
}
|
|
require.NoError(t, err)
|
|
defer watcher.Close()
|
|
|
|
text, err := watcher.RenderToString("foo", Data{})
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "foo", text)
|
|
|
|
require.NoError(t, ioutil.WriteFile(filepath.Join(dir, "templates", "foo.html"), []byte(`{{ define "foo" }}bar{{ end }}`), 0600))
|
|
|
|
require.Eventually(t, func() bool {
|
|
text, err := watcher.RenderToString("foo", Data{})
|
|
return text == "bar" && err == nil
|
|
}, time.Millisecond*1000, time.Millisecond*50)
|
|
}
|
|
|
|
func TestNewWithWatcher_BadDirectory(t *testing.T) {
|
|
watcher, errChan, err := NewWithWatcher("notarealdirectory")
|
|
require.Error(t, err)
|
|
assert.Nil(t, watcher)
|
|
assert.Nil(t, errChan)
|
|
}
|
|
|
|
func TestNew_BadDirectory(t *testing.T) {
|
|
watcher, err := New("notarealdirectory")
|
|
assert.Nil(t, watcher)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestRender(t *testing.T) {
|
|
tpl := template.New("test")
|
|
_, err := tpl.Parse(`{{ define "foo" }}foo{{ .Props.Bar }}{{ end }}`)
|
|
require.NoError(t, err)
|
|
mt := NewFromTemplate(tpl)
|
|
|
|
data := Data{
|
|
Props: map[string]interface{}{
|
|
"Bar": "bar",
|
|
},
|
|
}
|
|
text, err := mt.RenderToString("foo", data)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "foobar", text)
|
|
|
|
buf := &bytes.Buffer{}
|
|
require.NoError(t, mt.Render(buf, "foo", data))
|
|
assert.Equal(t, "foobar", buf.String())
|
|
}
|
|
|
|
func TestRenderError(t *testing.T) {
|
|
tpl := template.New("test")
|
|
_, err := tpl.Parse(`{{ define "foo" }}foo{{ .Foo.Bar }}bar{{ end }}`)
|
|
require.NoError(t, err)
|
|
mt := NewFromTemplate(tpl)
|
|
|
|
text, err := mt.RenderToString("foo", Data{})
|
|
require.Error(t, err)
|
|
assert.Equal(t, "", text)
|
|
|
|
buf := &bytes.Buffer{}
|
|
assert.Error(t, mt.Render(buf, "foo", Data{}))
|
|
assert.Equal(t, "foo", buf.String())
|
|
}
|
|
|
|
func TestRenderUnknownTemplate(t *testing.T) {
|
|
tpl := template.New("")
|
|
mt := NewFromTemplate(tpl)
|
|
|
|
text, err := mt.RenderToString("foo", Data{})
|
|
require.Error(t, err)
|
|
assert.Equal(t, "", text)
|
|
|
|
buf := &bytes.Buffer{}
|
|
assert.Error(t, mt.Render(buf, "foo", Data{}))
|
|
assert.Equal(t, "", buf.String())
|
|
}
|