Full Mattermost server source with integrated Community Enterprise features. Includes vendor directory for offline/air-gapped builds. Structure: - enterprise-impl/: Enterprise feature implementations - enterprise-community/: Init files that register implementations - enterprise/: Bridge imports (community_imports.go) - vendor/: All dependencies for offline builds Build (online): go build ./cmd/mattermost Build (offline/air-gapped): go build -mod=vendor ./cmd/mattermost 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
115 lines
2.8 KiB
Go
115 lines
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"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestHTMLTemplateWatcher(t *testing.T) {
|
|
dir, err := os.MkdirTemp("", "")
|
|
require.NoError(t, err)
|
|
defer os.RemoveAll(dir)
|
|
|
|
require.NoError(t, os.Mkdir(filepath.Join(dir, "templates"), 0700))
|
|
require.NoError(t, os.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, os.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]any{
|
|
"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())
|
|
}
|