add tests for c.JSON and c.HTML renderers

This commit is contained in:
Pedro Pérez 2024-11-13 14:56:55 +01:00
parent f9990d37c0
commit 749cacedc9
2 changed files with 82 additions and 2 deletions

8
ron.go
View File

@ -20,7 +20,7 @@ type Engine struct {
Renderer *Render Renderer *Render
} }
func (c *Context) JSON(code int, data Data) { func (c *Context) JSON(code int, data any) {
c.W.WriteHeader(code) c.W.WriteHeader(code)
c.W.Header().Set("Content-Type", "application/json") c.W.Header().Set("Content-Type", "application/json")
encoder := json.NewEncoder(c.W) encoder := json.NewEncoder(c.W)
@ -31,9 +31,13 @@ func (c *Context) JSON(code int, data Data) {
func (c *Context) HTML(code int, name string, data Data) { func (c *Context) HTML(code int, name string, data Data) {
c.W.WriteHeader(code) c.W.WriteHeader(code)
c.E.Renderer.Template(c.W, name, &TemplateData{ c.W.Header().Set("Content-Type", "text/html; charset=utf-8")
err := c.E.Renderer.Template(c.W, name, &TemplateData{
Data: data, Data: data,
}) })
if err != nil {
http.Error(c.W, err.Error(), http.StatusInternalServerError)
}
} }
func New() *Engine { func New() *Engine {

76
ron_test.go Normal file
View File

@ -0,0 +1,76 @@
package ron
import (
"net/http"
"net/http/httptest"
"os"
"testing"
)
type Foo struct {
Bar string `json:"bar"`
Taz int `json:"taz"`
Car *string `json:"car"`
}
func Test_JSON(t *testing.T) {
rr := httptest.NewRecorder()
c := &Context{
W: rr,
}
expected := `{"bar":"bar","taz":30,"car":null}`
c.JSON(http.StatusOK, Foo{
Bar: "bar",
Taz: 30,
Car: nil,
})
if status := rr.Code; status != http.StatusOK {
t.Errorf("Expected status code: %d, Actual: %d", http.StatusOK, status)
}
if rr.Header().Get("Content-Type") != "application/json" {
t.Errorf("Expected Content-Type: application/json, Actual: %s", c.W.Header().Get("Content-Type"))
}
if rr.Body.String() != string(expected)+"\n" {
t.Errorf("Expected: %s, Actual: %s", string(expected), rr.Body.String())
}
}
func Test_HTML(t *testing.T) {
os.Mkdir("templates", os.ModePerm)
f, _ := os.Create("templates/page.index.gohtml")
f.WriteString("<h1>{{.Data.heading1}}</h1><h2>{{.Data.heading2}}</h2>")
f.Close()
defer os.RemoveAll("templates")
rr := httptest.NewRecorder()
c := &Context{
W: rr,
E: &Engine{
Renderer: NewHTMLRender(),
},
}
expected := `<h1>foo</h1><h2>bar</h2>`
c.HTML(http.StatusOK, "page.index.gohtml", Data{
"heading1": "foo",
"heading2": "bar",
})
if status := rr.Code; status != http.StatusOK {
t.Errorf("Expected status code: %d, Actual: %d", http.StatusOK, status)
}
if rr.Header().Get("Content-Type") != "text/html; charset=utf-8" {
t.Errorf("Expected Content-Type: text/html; charset=utf-8, Actual: %s", c.W.Header().Get("Content-Type"))
}
if rr.Body.String() != string(expected) {
t.Errorf("Expected: %s, Actual: %s", string(expected), rr.Body.String())
}
}