From 7863cd14588335d65ccbc53a1fbb590c5b6a70d9 Mon Sep 17 00:00:00 2001 From: kiyon Date: Wed, 29 Jul 2020 11:07:47 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=B7=20add=20ctx.Render=20test=20cases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/TEST_DATA/template-invalid.html | 1 + ctx.go | 11 +-------- ctx_test.go | 31 ++++++++++++++++++++++++- utils.go | 14 +++++++++++ 4 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 .github/TEST_DATA/template-invalid.html diff --git a/.github/TEST_DATA/template-invalid.html b/.github/TEST_DATA/template-invalid.html new file mode 100644 index 00000000..ac4f6d13 --- /dev/null +++ b/.github/TEST_DATA/template-invalid.html @@ -0,0 +1 @@ +

{{.Title}

diff --git a/ctx.go b/ctx.go index 8c2c84ff..f3f4d940 100644 --- a/ctx.go +++ b/ctx.go @@ -15,7 +15,6 @@ import ( "log" "mime/multipart" "net/http" - "os" "path/filepath" "strconv" "strings" @@ -791,15 +790,7 @@ func (ctx *Ctx) Render(name string, bind interface{}, layouts ...string) (err er } else { // Render raw template using 'name' as filepath if no engine is set var tmpl *template.Template - // Read file - f, err := os.Open(filepath.Clean(name)) - if err != nil { - return err - } - if _, err = buf.ReadFrom(f); err != nil { - return err - } - if err = f.Close(); err != nil { + if _, err = readContent(buf, name); err != nil { return err } // Parse template diff --git a/ctx_test.go b/ctx_test.go index ff0bfbaf..d10225c1 100644 --- a/ctx_test.go +++ b/ctx_test.go @@ -10,6 +10,7 @@ package fiber import ( "bufio" "bytes" + "errors" "fmt" "io" "io/ioutil" @@ -1500,7 +1501,10 @@ func Test_Ctx_Render(t *testing.T) { utils.AssertEqual(t, nil, err) utils.AssertEqual(t, "

Hello, World!

", string(ctx.Fasthttp.Response.Body())) - err = ctx.Render("./.github/TEST_DATA/invalid.html", nil) + err = ctx.Render("./.github/TEST_DATA/template-non-exists.html", nil) + utils.AssertEqual(t, false, err == nil) + + err = ctx.Render("./.github/TEST_DATA/template-invalid.html", nil) utils.AssertEqual(t, false, err == nil) } @@ -1533,6 +1537,7 @@ func Test_Ctx_Render_Engine(t *testing.T) { utils.AssertEqual(t, "

Hello, World!

", string(ctx.Fasthttp.Response.Body())) } +// go test -v -run=^$ -bench=Benchmark_Ctx_Render_Engine -benchmem -count=4 func Benchmark_Ctx_Render_Engine(b *testing.B) { engine := &testTemplateEngine{} err := engine.Load() @@ -1552,19 +1557,43 @@ func Benchmark_Ctx_Render_Engine(b *testing.B) { utils.AssertEqual(b, "

Hello, World!

", string(ctx.Fasthttp.Response.Body())) } +type errorTemplateEngine struct{} + +func (t errorTemplateEngine) Render(w io.Writer, name string, bind interface{}, layout ...string) error { + return errors.New("errorTemplateEngine") +} + +func (t errorTemplateEngine) Load() error { return nil } + +// go test -run Test_Ctx_Render_Engine_Error +func Test_Ctx_Render_Engine_Error(t *testing.T) { + app := New() + app.Settings.Views = errorTemplateEngine{} + ctx := app.AcquireCtx(&fasthttp.RequestCtx{}) + defer app.ReleaseCtx(ctx) + err := ctx.Render("index.tmpl", nil) + utils.AssertEqual(t, false, err == nil) +} + // go test -run Test_Ctx_Render_Go_Template func Test_Ctx_Render_Go_Template(t *testing.T) { t.Parallel() + file, err := ioutil.TempFile(os.TempDir(), "fiber") utils.AssertEqual(t, nil, err) defer os.Remove(file.Name()) + _, err = file.Write([]byte("template")) utils.AssertEqual(t, nil, err) + err = file.Close() utils.AssertEqual(t, nil, err) + app := New() + ctx := app.AcquireCtx(&fasthttp.RequestCtx{}) defer app.ReleaseCtx(ctx) + err = ctx.Render(file.Name(), nil) utils.AssertEqual(t, nil, err) utils.AssertEqual(t, "template", string(ctx.Fasthttp.Response.Body())) diff --git a/utils.go b/utils.go index 5f578dc5..eaa7c7b7 100644 --- a/utils.go +++ b/utils.go @@ -8,7 +8,10 @@ import ( "bytes" "fmt" "hash/crc32" + "io" "net" + "os" + "path/filepath" "strings" "time" @@ -17,6 +20,17 @@ import ( fasthttp "github.com/valyala/fasthttp" ) +// readContent opens a named file and read content from it +func readContent(rf io.ReaderFrom, name string) (int64, error) { + // Read file + f, err := os.Open(filepath.Clean(name)) + if err != nil { + return 0, err + } + defer f.Close() + return rf.ReadFrom(f) +} + // quoteString escape special characters in a given string func quoteString(raw string) string { bb := bytebufferpool.Get()