gitea源码

scopedtmpl_test.go 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package scopedtmpl
  4. import (
  5. "bytes"
  6. "html/template"
  7. "strings"
  8. "sync"
  9. "testing"
  10. "time"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. func TestScopedTemplateSetFuncMap(t *testing.T) {
  14. all := template.New("")
  15. all.Funcs(template.FuncMap{"CtxFunc": func(s string) string {
  16. return "default"
  17. }})
  18. _, err := all.New("base").Parse(`{{CtxFunc "base"}}`)
  19. assert.NoError(t, err)
  20. _, err = all.New("test").Parse(strings.TrimSpace(`
  21. {{template "base"}}
  22. {{CtxFunc "test"}}
  23. {{template "base"}}
  24. {{CtxFunc "test"}}
  25. `))
  26. assert.NoError(t, err)
  27. ts, err := newScopedTemplateSet(all, "test")
  28. assert.NoError(t, err)
  29. // try to use different CtxFunc to render concurrently
  30. funcMap1 := template.FuncMap{
  31. "CtxFunc": func(s string) string {
  32. time.Sleep(100 * time.Millisecond)
  33. return s + "1"
  34. },
  35. }
  36. funcMap2 := template.FuncMap{
  37. "CtxFunc": func(s string) string {
  38. time.Sleep(100 * time.Millisecond)
  39. return s + "2"
  40. },
  41. }
  42. out1 := bytes.Buffer{}
  43. out2 := bytes.Buffer{}
  44. wg := sync.WaitGroup{}
  45. wg.Add(2)
  46. go func() {
  47. err := ts.newExecutor(funcMap1).Execute(&out1, nil)
  48. assert.NoError(t, err)
  49. wg.Done()
  50. }()
  51. go func() {
  52. err := ts.newExecutor(funcMap2).Execute(&out2, nil)
  53. assert.NoError(t, err)
  54. wg.Done()
  55. }()
  56. wg.Wait()
  57. assert.Equal(t, "base1\ntest1\nbase1\ntest1", out1.String())
  58. assert.Equal(t, "base2\ntest2\nbase2\ntest2", out2.String())
  59. }
  60. func TestScopedTemplateSetEscape(t *testing.T) {
  61. all := template.New("")
  62. _, err := all.New("base").Parse(`<a href="?q={{.param}}">{{.text}}</a>`)
  63. assert.NoError(t, err)
  64. _, err = all.New("test").Parse(`{{template "base" .}}<form action="?q={{.param}}">{{.text}}</form>`)
  65. assert.NoError(t, err)
  66. ts, err := newScopedTemplateSet(all, "test")
  67. assert.NoError(t, err)
  68. out := bytes.Buffer{}
  69. err = ts.newExecutor(nil).Execute(&out, map[string]string{"param": "/", "text": "<"})
  70. assert.NoError(t, err)
  71. assert.Equal(t, `<a href="?q=%2f">&lt;</a><form action="?q=%2f">&lt;</form>`, out.String())
  72. }
  73. func TestScopedTemplateSetUnsafe(t *testing.T) {
  74. all := template.New("")
  75. _, err := all.New("test").Parse(`<a href="{{if true}}?{{end}}a={{.param}}"></a>`)
  76. assert.NoError(t, err)
  77. _, err = newScopedTemplateSet(all, "test")
  78. assert.ErrorContains(t, err, "appears in an ambiguous context within a URL")
  79. }