Writing tests for Render package
This commit is contained in:
parent
70996c6f60
commit
875be55076
@ -2,6 +2,7 @@ package render
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"go-udemy-web-1/internal/config"
|
"go-udemy-web-1/internal/config"
|
||||||
"go-udemy-web-1/internal/models"
|
"go-udemy-web-1/internal/models"
|
||||||
@ -35,7 +36,7 @@ func AddDefaultData(td *models.TemplateData, r *http.Request) *models.TemplateDa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RenderTemplate renders a HTML template file
|
// RenderTemplate renders a HTML template file
|
||||||
func RenderTemplate(w http.ResponseWriter, r *http.Request, tmpl string, td *models.TemplateData) {
|
func RenderTemplate(w http.ResponseWriter, r *http.Request, tmpl string, td *models.TemplateData) error {
|
||||||
var tc map[string]*template.Template
|
var tc map[string]*template.Template
|
||||||
if app.UseCache {
|
if app.UseCache {
|
||||||
// get the template cache from the app config
|
// get the template cache from the app config
|
||||||
@ -47,7 +48,7 @@ func RenderTemplate(w http.ResponseWriter, r *http.Request, tmpl string, td *mod
|
|||||||
// get requested template from cache
|
// get requested template from cache
|
||||||
t, ok := tc[tmpl]
|
t, ok := tc[tmpl]
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Fatal("Could not get template from template cache")
|
return errors.New("could not get template from template cache")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write to a buffer to make sure that the template can be read and
|
// Write to a buffer to make sure that the template can be read and
|
||||||
@ -59,13 +60,17 @@ func RenderTemplate(w http.ResponseWriter, r *http.Request, tmpl string, td *mod
|
|||||||
err := t.Execute(buf, td)
|
err := t.Execute(buf, td)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// render the template
|
// render the template
|
||||||
_, err = buf.WriteTo(w)
|
_, err = buf.WriteTo(w)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateTemplateCache() (map[string]*template.Template, error) {
|
func CreateTemplateCache() (map[string]*template.Template, error) {
|
||||||
|
76
internal/render/render_test.go
Normal file
76
internal/render/render_test.go
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
package render
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go-udemy-web-1/internal/models"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAddDefaultData(t *testing.T) {
|
||||||
|
var td models.TemplateData
|
||||||
|
|
||||||
|
r, err := getSession()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
session.Put(r.Context(), "flash", "123")
|
||||||
|
|
||||||
|
result := AddDefaultData(&td, r)
|
||||||
|
|
||||||
|
if result.Flash != "123" {
|
||||||
|
t.Error("flash value of 123 not found in session")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRenderTemplate(t *testing.T) {
|
||||||
|
pathToTemplates = "../../templates"
|
||||||
|
tc, err := CreateTemplateCache()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
app.TemplateCahce = tc
|
||||||
|
|
||||||
|
r, err := getSession()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var ww myWriter
|
||||||
|
|
||||||
|
err = RenderTemplate(&ww, r, "home.page.tmpl", &models.TemplateData{})
|
||||||
|
if err != nil {
|
||||||
|
t.Error("error writiing template to browser")
|
||||||
|
}
|
||||||
|
|
||||||
|
err = RenderTemplate(&ww, r, "non-existent.page.html", &models.TemplateData{})
|
||||||
|
if err == nil {
|
||||||
|
t.Error("rendered template that doesn't exist")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSession() (*http.Request, error) {
|
||||||
|
r, err := http.NewRequest("GET", "/some-url", nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := r.Context()
|
||||||
|
ctx, _ = session.Load(ctx, r.Header.Get("X-Session"))
|
||||||
|
r = r.WithContext(ctx)
|
||||||
|
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewTemplate(t *testing.T) {
|
||||||
|
NewTemplates(app)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateTemplateCache(t *testing.T) {
|
||||||
|
pathToTemplates = "../../templates"
|
||||||
|
_, err := CreateTemplateCache()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
52
internal/render/setup_test.go
Normal file
52
internal/render/setup_test.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package render
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/gob"
|
||||||
|
"go-udemy-web-1/internal/config"
|
||||||
|
"go-udemy-web-1/internal/models"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/alexedwards/scs/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
session *scs.SessionManager
|
||||||
|
testApp config.AppConfig
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// what am I going to put in the session
|
||||||
|
gob.Register(models.Reservation{})
|
||||||
|
|
||||||
|
// change this to true when in production
|
||||||
|
testApp.InProduction = false
|
||||||
|
|
||||||
|
session = scs.New()
|
||||||
|
session.Lifetime = 24 * time.Hour
|
||||||
|
session.Cookie.Persist = true
|
||||||
|
session.Cookie.SameSite = http.SameSiteLaxMode
|
||||||
|
session.Cookie.Secure = testApp.InProduction
|
||||||
|
|
||||||
|
testApp.Session = session
|
||||||
|
|
||||||
|
app = &testApp
|
||||||
|
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
|
type myWriter struct{}
|
||||||
|
|
||||||
|
func (tw *myWriter) Header() http.Header {
|
||||||
|
var h http.Header
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tw *myWriter) WriteHeader(i int) {}
|
||||||
|
|
||||||
|
func (tw *myWriter) Write(b []byte) (int, error) {
|
||||||
|
length := len(b)
|
||||||
|
return length, nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user