mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 19:06:18 +01:00 
			
		
		
		
	Show friendly 500 error page to users and developers (#24110)
Close #24104 This also introduces many tests to cover many complex error handling functions. ### Before The details are never shown in production. <details>  </details> ### After The details could be shown to site admin users. It is safe. 
This commit is contained in:
		
							
								
								
									
										106
									
								
								modules/templates/htmlrenderer_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								modules/templates/htmlrenderer_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| // 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" | ||||
| ) | ||||
|  | ||||
| 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), 0o644) | ||||
| 		assert.NoError(t, err) | ||||
| 		tmpl := template.New("test") | ||||
| 		_, err = tmpl.Parse(s) | ||||
| 		assert.Error(t, err) | ||||
| 		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"), 0o644) | ||||
| 	assert.NoError(t, err) | ||||
| 	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)) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user