Compare commits
No commits in common. "0c0159734e63b38e6ea35227613920e2748be5f9" and "70996c6f604cb2ed1aa6ac0ab84856bfe0fb7374" have entirely different histories.
0c0159734e
...
70996c6f60
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,3 +0,0 @@
|
|||||||
**/c.out
|
|
||||||
**/c.html
|
|
||||||
bookings
|
|
@ -2,6 +2,7 @@ package forms
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -33,8 +34,8 @@ func (f *Form) Required(fields ...string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Has checks if form field is in post and not emtpy
|
// Has checks if form field is in post and not emtpy
|
||||||
func (f *Form) Has(field string) bool {
|
func (f *Form) Has(field string, r *http.Request) bool {
|
||||||
x := f.Get(field)
|
x := r.Form.Get(field)
|
||||||
return x != ""
|
return x != ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,8 +45,8 @@ func (f *Form) Valid() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MinLength checks for string minimum length
|
// MinLength checks for string minimum length
|
||||||
func (f *Form) MinLength(field string, length int) bool {
|
func (f *Form) MinLength(field string, length int, r *http.Request) bool {
|
||||||
value := f.Get(field)
|
value := r.Form.Get(field)
|
||||||
if len(value) < length {
|
if len(value) < length {
|
||||||
f.Errors.Add(field, fmt.Sprintf("This field must have at least %d letters", length))
|
f.Errors.Add(field, fmt.Sprintf("This field must have at least %d letters", length))
|
||||||
return false
|
return false
|
||||||
@ -54,8 +55,8 @@ func (f *Form) MinLength(field string, length int) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IsEmail checks the email address
|
// IsEmail checks the email address
|
||||||
func (f *Form) IsEmail(field string) {
|
func (f *Form) IsEmail(field string, r *http.Request) {
|
||||||
value := f.Get(field)
|
value := r.Form.Get(field)
|
||||||
if !govalidator.IsEmail(value) {
|
if !govalidator.IsEmail(value) {
|
||||||
f.Errors.Add(field, "Invalid email address")
|
f.Errors.Add(field, "Invalid email address")
|
||||||
}
|
}
|
||||||
|
@ -1,131 +0,0 @@
|
|||||||
package forms
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http/httptest"
|
|
||||||
"net/url"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestForms_Valid(t *testing.T) {
|
|
||||||
r := httptest.NewRequest("POST", "/test-url", nil)
|
|
||||||
form := New(r.PostForm)
|
|
||||||
|
|
||||||
isValid := form.Valid()
|
|
||||||
if !isValid {
|
|
||||||
t.Error("got invalid when should have been valid")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestForms_Required(t *testing.T) {
|
|
||||||
r := httptest.NewRequest("POST", "/test-url", nil)
|
|
||||||
form := New(r.PostForm)
|
|
||||||
|
|
||||||
form.Required("a", "b", "c")
|
|
||||||
if form.Valid() {
|
|
||||||
t.Error("required fields are not given, should be invalid")
|
|
||||||
}
|
|
||||||
|
|
||||||
postData := url.Values{}
|
|
||||||
|
|
||||||
postData.Add("a", "a")
|
|
||||||
postData.Add("b", "a")
|
|
||||||
postData.Add("c", "a")
|
|
||||||
|
|
||||||
r = httptest.NewRequest("POST", "/test-url", nil)
|
|
||||||
r.PostForm = postData
|
|
||||||
|
|
||||||
form = New(r.PostForm)
|
|
||||||
|
|
||||||
form.Required("a", "b", "c")
|
|
||||||
if !form.Valid() {
|
|
||||||
t.Error("required fields are given, should be valid")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestForms_Has(t *testing.T) {
|
|
||||||
postData := url.Values{}
|
|
||||||
form := New(postData)
|
|
||||||
|
|
||||||
if form.Has("a") {
|
|
||||||
t.Error("the field should not exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
postData = url.Values{}
|
|
||||||
postData.Add("a", "a")
|
|
||||||
form = New(postData)
|
|
||||||
|
|
||||||
if !form.Has("a") {
|
|
||||||
t.Error("the field should exist")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestForms_MinLength(t *testing.T) {
|
|
||||||
postData := url.Values{}
|
|
||||||
form := New(postData)
|
|
||||||
|
|
||||||
if form.MinLength("a", 3) {
|
|
||||||
t.Error("the field should not exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
errMsg := form.Errors.Get("a")
|
|
||||||
if errMsg != "This field must have at least 3 letters" {
|
|
||||||
t.Error("should have an errMsg")
|
|
||||||
}
|
|
||||||
|
|
||||||
if form.Valid() {
|
|
||||||
t.Error("should be invalid")
|
|
||||||
}
|
|
||||||
|
|
||||||
postData = url.Values{}
|
|
||||||
postData.Add("a", "ab")
|
|
||||||
postData.Add("b", "abc")
|
|
||||||
form = New(postData)
|
|
||||||
|
|
||||||
if form.MinLength("a", 3) {
|
|
||||||
t.Error("the field is shorter than 3 chars")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !form.MinLength("b", 3) {
|
|
||||||
t.Error("the field is equal to 3 chars")
|
|
||||||
}
|
|
||||||
|
|
||||||
if form.Valid() {
|
|
||||||
t.Error("should be invalid")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestForms_IsEmail(t *testing.T) {
|
|
||||||
postData := url.Values{}
|
|
||||||
form := New(postData)
|
|
||||||
|
|
||||||
form.IsEmail("a")
|
|
||||||
|
|
||||||
if form.Valid() {
|
|
||||||
t.Error("email should not exit")
|
|
||||||
}
|
|
||||||
|
|
||||||
postData = url.Values{}
|
|
||||||
postData.Add("a", "a@a.com")
|
|
||||||
form = New(postData)
|
|
||||||
|
|
||||||
form.IsEmail("a")
|
|
||||||
|
|
||||||
errMsg := form.Errors.Get("a")
|
|
||||||
if errMsg != "" {
|
|
||||||
t.Error("should not have an errMsg")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !form.Valid() {
|
|
||||||
t.Error("should be a valid email")
|
|
||||||
}
|
|
||||||
|
|
||||||
postData = url.Values{}
|
|
||||||
postData.Add("a", "a@.com")
|
|
||||||
form = New(postData)
|
|
||||||
|
|
||||||
form.IsEmail("a")
|
|
||||||
|
|
||||||
if form.Valid() {
|
|
||||||
t.Error("Should not be a valid email")
|
|
||||||
}
|
|
||||||
}
|
|
@ -100,8 +100,8 @@ func (m *Repository) PostMakeReservation(w http.ResponseWriter, r *http.Request)
|
|||||||
form := forms.New(r.PostForm)
|
form := forms.New(r.PostForm)
|
||||||
|
|
||||||
form.Required("first_name", "last_name", "email")
|
form.Required("first_name", "last_name", "email")
|
||||||
form.MinLength("first_name", 2)
|
form.MinLength("first_name", 2, r)
|
||||||
form.IsEmail("email")
|
form.IsEmail("email", r)
|
||||||
|
|
||||||
if !form.Valid() {
|
if !form.Valid() {
|
||||||
data := make(map[string]interface{})
|
data := make(map[string]interface{})
|
||||||
|
@ -2,7 +2,6 @@ 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"
|
||||||
@ -36,7 +35,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) error {
|
func RenderTemplate(w http.ResponseWriter, r *http.Request, tmpl string, td *models.TemplateData) {
|
||||||
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
|
||||||
@ -48,7 +47,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 {
|
||||||
return errors.New("could not get template from template cache")
|
log.Fatal("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
|
||||||
@ -60,17 +59,13 @@ 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) {
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
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…
x
Reference in New Issue
Block a user