2023-04-14 08:19:11 +03:00
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package templates
import (
"errors"
"html/template"
"os"
"strings"
"testing"
"code.gitea.io/gitea/modules/assetfs"
"github.com/stretchr/testify/assert"
2024-07-30 22:41:10 +03:00
"github.com/stretchr/testify/require"
2023-04-14 08:19:11 +03:00
)
func TestExtractErrorLine ( t * testing . T ) {
cases := [ ] struct {
code string
line int
pos int
target string
expect string
} {
{ "hello world\nfoo bar foo bar\ntest" , 2 , - 1 , "bar" , `
foo bar foo bar
^ ^ ^ ^ ^ ^
` } ,
{ "hello world\nfoo bar foo bar\ntest" , 2 , 4 , "bar" , `
foo bar foo bar
^
` } ,
{
"hello world\nfoo bar foo bar\ntest" , 2 , 4 , "" ,
`
foo bar foo bar
^
` ,
} ,
{
"hello world\nfoo bar foo bar\ntest" , 5 , 0 , "" ,
` unable to find target line 5 ` ,
} ,
}
for _ , c := range cases {
actual := extractErrorLine ( [ ] byte ( c . code ) , c . line , c . pos , c . target )
assert . Equal ( t , strings . TrimSpace ( c . expect ) , strings . TrimSpace ( actual ) )
}
}
func TestHandleError ( t * testing . T ) {
dir := t . TempDir ( )
p := & templateErrorPrettier { assets : assetfs . Layered ( assetfs . Local ( "tmp" , dir ) ) }
test := func ( s string , h func ( error ) string , expect string ) {
err := os . WriteFile ( dir + "/test.tmpl" , [ ] byte ( s ) , 0 o644 )
2024-07-30 22:41:10 +03:00
require . NoError ( t , err )
2023-04-14 08:19:11 +03:00
tmpl := template . New ( "test" )
_ , err = tmpl . Parse ( s )
2024-07-30 22:41:10 +03:00
require . Error ( t , err )
2023-04-14 08:19:11 +03:00
msg := h ( err )
assert . EqualValues ( t , strings . TrimSpace ( expect ) , strings . TrimSpace ( msg ) )
}
test ( "{{" , p . handleGenericTemplateError , `
template error : tmp : test : 1 : unclosed action
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
{ {
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
` )
test ( "{{Func}}" , p . handleFuncNotDefinedError , `
template error : tmp : test : 1 : function "Func" not defined
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
{ { Func } }
^ ^ ^ ^
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
` )
test ( "{{'x'3}}" , p . handleUnexpectedOperandError , `
template error : tmp : test : 1 : unexpected "3" in operand
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
{ { 'x' 3 } }
^
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
` )
// no idea about how to trigger such strange error, so mock an error to test it
err := os . WriteFile ( dir + "/test.tmpl" , [ ] byte ( "god knows XXX" ) , 0 o644 )
2024-07-30 22:41:10 +03:00
require . NoError ( t , err )
2023-04-14 08:19:11 +03:00
expectedMsg := `
template error : tmp : test : 1 : expected end ; found XXX
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
god knows XXX
^ ^ ^
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
`
actualMsg := p . handleExpectedEndError ( errors . New ( "template: test:1: expected end; found XXX" ) )
assert . EqualValues ( t , strings . TrimSpace ( expectedMsg ) , strings . TrimSpace ( actualMsg ) )
}