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  }