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  }