Finished controller tests.

This commit is contained in:
mikestefanello 2021-12-19 15:50:50 -05:00
parent 40f0d7251d
commit 65a9ac9fa5
3 changed files with 113 additions and 14 deletions

View file

@ -1,6 +1,9 @@
package controller
import (
"context"
"html/template"
"io/ioutil"
"net/http"
"net/http/httptest"
"os"
@ -8,9 +11,14 @@ import (
"testing"
"goweb/config"
"goweb/middleware"
"goweb/msg"
"goweb/services"
"github.com/eko/gocache/v2/store"
"github.com/eko/gocache/v2/marshaler"
"github.com/gorilla/sessions"
"github.com/labstack/echo-contrib/session"
@ -43,9 +51,10 @@ func TestMain(m *testing.M) {
os.Exit(exitVal)
}
func newContext(url string) echo.Context {
func newContext(url string) (echo.Context, *httptest.ResponseRecorder) {
req := httptest.NewRequest(http.MethodGet, url, strings.NewReader(""))
return c.Web.NewContext(req, httptest.NewRecorder())
rec := httptest.NewRecorder()
return c.Web.NewContext(req, rec), rec
}
func initSesssion(t *testing.T, ctx echo.Context) {
@ -56,7 +65,7 @@ func initSesssion(t *testing.T, ctx echo.Context) {
}
func TestController_Redirect(t *testing.T) {
ctx := newContext("/abc")
ctx, _ := newContext("/abc")
ctr := NewController(c)
err := ctr.Redirect(ctx, "home")
require.NoError(t, err)
@ -73,7 +82,7 @@ func TestController_SetValidationErrorMessages(t *testing.T) {
err := v.Struct(e)
require.Error(t, err)
ctx := newContext("/")
ctx, _ := newContext("/")
initSesssion(t, ctx)
ctr := NewController(c)
ctr.SetValidationErrorMessages(ctx, err, e)
@ -82,3 +91,93 @@ func TestController_SetValidationErrorMessages(t *testing.T) {
require.Len(t, msgs, 1)
assert.Equal(t, "<strong>Label test</strong> is required.", msgs[0])
}
func TestController_RenderPage(t *testing.T) {
setup := func() (echo.Context, *httptest.ResponseRecorder, Controller, Page) {
ctx, rec := newContext("/test/TestController_RenderPage")
initSesssion(t, ctx)
ctr := NewController(c)
p := NewPage(ctx)
p.Name = "home"
p.Layout = "main"
p.Cache.Enabled = false
p.Headers["a"] = "b"
p.Headers["c"] = "d"
p.StatusCode = http.StatusCreated
return ctx, rec, ctr, p
}
t.Run("missing name", func(t *testing.T) {
// Rendering should fail if the Page has no name
ctx, _, ctr, p := setup()
p.Name = ""
err := ctr.RenderPage(ctx, p)
assert.Error(t, err)
})
t.Run("no page cache", func(t *testing.T) {
ctx, _, ctr, p := setup()
err := ctr.RenderPage(ctx, p)
require.NoError(t, err)
// Check status code and headers
assert.Equal(t, http.StatusCreated, ctx.Response().Status)
for k, v := range p.Headers {
assert.Equal(t, v, ctx.Response().Header().Get(k))
}
// Check the template cache
parsed, ok := templates.Load(p.Name)
assert.True(t, ok)
// Check that all expected templates were parsed.
// This includes the name, layout and all components
expectedTemplates := make(map[string]bool)
expectedTemplates[p.Name+config.TemplateExt] = true
expectedTemplates[p.Layout+config.TemplateExt] = true
components, err := ioutil.ReadDir(getTemplatesDirectoryPath() + "/components")
require.NoError(t, err)
for _, f := range components {
expectedTemplates[f.Name()] = true
}
tmpl, ok := parsed.(*template.Template)
require.True(t, ok)
for _, v := range tmpl.Templates() {
delete(expectedTemplates, v.Name())
}
assert.Empty(t, expectedTemplates)
})
t.Run("page cache", func(t *testing.T) {
ctx, rec, ctr, p := setup()
p.Cache.Enabled = true
p.Cache.Tags = []string{"tag1"}
err := ctr.RenderPage(ctx, p)
require.NoError(t, err)
// Fetch from the cache
res, err := marshaler.New(c.Cache).
Get(context.Background(), p.URL, new(middleware.CachedPage))
require.NoError(t, err)
// Compare the cached page
cp, ok := res.(*middleware.CachedPage)
require.True(t, ok)
assert.Equal(t, p.URL, cp.URL)
assert.Equal(t, p.Headers, cp.Headers)
assert.Equal(t, p.StatusCode, cp.StatusCode)
assert.Equal(t, rec.Body.Bytes(), cp.HTML)
// Clear the tag
err = c.Cache.Invalidate(context.Background(), store.InvalidateOptions{
Tags: []string{p.Cache.Tags[0]},
})
require.NoError(t, err)
// Refetch from the cache and expect no results
_, err = marshaler.New(c.Cache).
Get(context.Background(), p.URL, new(middleware.CachedPage))
assert.Error(t, err)
})
}

View file

@ -12,7 +12,7 @@ import (
)
func TestNewPage(t *testing.T) {
ctx := newContext("/")
ctx, _ := newContext("/")
p := NewPage(ctx)
assert.Same(t, ctx, p.Context)
assert.NotNil(t, p.ToURL)
@ -27,7 +27,7 @@ func TestNewPage(t *testing.T) {
assert.Empty(t, p.RequestID)
assert.False(t, p.Cache.Enabled)
ctx = newContext("/abc?def=123")
ctx, _ = newContext("/abc?def=123")
ctx.Set(context.AuthenticatedUserKey, 1)
ctx.Set(echomw.DefaultCSRFConfig.ContextKey, "csrf")
p = NewPage(ctx)
@ -39,7 +39,7 @@ func TestNewPage(t *testing.T) {
}
func TestPage_GetMessages(t *testing.T) {
ctx := newContext("/")
ctx, _ := newContext("/")
p := NewPage(ctx)
initSesssion(t, ctx)

View file

@ -8,24 +8,24 @@ import (
)
func TestNewPager(t *testing.T) {
ctx := newContext("/")
ctx, _ := newContext("/")
pgr := NewPager(ctx, 10)
assert.Equal(t, 10, pgr.ItemsPerPage)
assert.Equal(t, 1, pgr.Page)
assert.Equal(t, 0, pgr.Items)
assert.Equal(t, 0, pgr.Pages)
ctx = newContext(fmt.Sprintf("/abc?%s=%d", PageQueryKey, 2))
ctx, _ = newContext(fmt.Sprintf("/abc?%s=%d", PageQueryKey, 2))
pgr = NewPager(ctx, 10)
assert.Equal(t, 2, pgr.Page)
ctx = newContext(fmt.Sprintf("/abc?%s=%d", PageQueryKey, -2))
ctx, _ = newContext(fmt.Sprintf("/abc?%s=%d", PageQueryKey, -2))
pgr = NewPager(ctx, 10)
assert.Equal(t, 1, pgr.Page)
}
func TestPager_SetItems(t *testing.T) {
ctx := newContext("/")
ctx, _ := newContext("/")
pgr := NewPager(ctx, 20)
pgr.SetItems(100)
assert.Equal(t, 100, pgr.Items)
@ -33,7 +33,7 @@ func TestPager_SetItems(t *testing.T) {
}
func TestPager_IsBeginning(t *testing.T) {
ctx := newContext("/")
ctx, _ := newContext("/")
pgr := NewPager(ctx, 20)
pgr.Pages = 10
assert.True(t, pgr.IsBeginning())
@ -44,7 +44,7 @@ func TestPager_IsBeginning(t *testing.T) {
}
func TestPager_IsEnd(t *testing.T) {
ctx := newContext("/")
ctx, _ := newContext("/")
pgr := NewPager(ctx, 20)
pgr.Pages = 10
assert.False(t, pgr.IsEnd())
@ -55,7 +55,7 @@ func TestPager_IsEnd(t *testing.T) {
}
func TestPager_GetOffset(t *testing.T) {
ctx := newContext("/")
ctx, _ := newContext("/")
pgr := NewPager(ctx, 20)
assert.Equal(t, 0, pgr.GetOffset())
pgr.Page = 2