code.gitea.io/gitea@v1.22.3/modules/templates/htmlrenderer_test.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package templates 5 6 import ( 7 "errors" 8 "html/template" 9 "os" 10 "strings" 11 "testing" 12 13 "code.gitea.io/gitea/modules/assetfs" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func TestExtractErrorLine(t *testing.T) { 19 cases := []struct { 20 code string 21 line int 22 pos int 23 target string 24 expect string 25 }{ 26 {"hello world\nfoo bar foo bar\ntest", 2, -1, "bar", ` 27 foo bar foo bar 28 ^^^ ^^^ 29 `}, 30 31 {"hello world\nfoo bar foo bar\ntest", 2, 4, "bar", ` 32 foo bar foo bar 33 ^ 34 `}, 35 36 { 37 "hello world\nfoo bar foo bar\ntest", 2, 4, "", 38 ` 39 foo bar foo bar 40 ^ 41 `, 42 }, 43 44 { 45 "hello world\nfoo bar foo bar\ntest", 5, 0, "", 46 `unable to find target line 5`, 47 }, 48 } 49 50 for _, c := range cases { 51 actual := extractErrorLine([]byte(c.code), c.line, c.pos, c.target) 52 assert.Equal(t, strings.TrimSpace(c.expect), strings.TrimSpace(actual)) 53 } 54 } 55 56 func TestHandleError(t *testing.T) { 57 dir := t.TempDir() 58 59 p := &templateErrorPrettier{assets: assetfs.Layered(assetfs.Local("tmp", dir))} 60 61 test := func(s string, h func(error) string, expect string) { 62 err := os.WriteFile(dir+"/test.tmpl", []byte(s), 0o644) 63 assert.NoError(t, err) 64 tmpl := template.New("test") 65 _, err = tmpl.Parse(s) 66 assert.Error(t, err) 67 msg := h(err) 68 assert.EqualValues(t, strings.TrimSpace(expect), strings.TrimSpace(msg)) 69 } 70 71 test("{{", p.handleGenericTemplateError, ` 72 template error: tmp:test:1 : unclosed action 73 ---------------------------------------------------------------------- 74 {{ 75 ---------------------------------------------------------------------- 76 `) 77 78 test("{{Func}}", p.handleFuncNotDefinedError, ` 79 template error: tmp:test:1 : function "Func" not defined 80 ---------------------------------------------------------------------- 81 {{Func}} 82 ^^^^ 83 ---------------------------------------------------------------------- 84 `) 85 86 test("{{'x'3}}", p.handleUnexpectedOperandError, ` 87 template error: tmp:test:1 : unexpected "3" in operand 88 ---------------------------------------------------------------------- 89 {{'x'3}} 90 ^ 91 ---------------------------------------------------------------------- 92 `) 93 94 // no idea about how to trigger such strange error, so mock an error to test it 95 err := os.WriteFile(dir+"/test.tmpl", []byte("god knows XXX"), 0o644) 96 assert.NoError(t, err) 97 expectedMsg := ` 98 template error: tmp:test:1 : expected end; found XXX 99 ---------------------------------------------------------------------- 100 god knows XXX 101 ^^^ 102 ---------------------------------------------------------------------- 103 ` 104 actualMsg := p.handleExpectedEndError(errors.New("template: test:1: expected end; found XXX")) 105 assert.EqualValues(t, strings.TrimSpace(expectedMsg), strings.TrimSpace(actualMsg)) 106 }