diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d6a2b1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +**/c.out +**/c.html diff --git a/internal/forms/forms.go b/internal/forms/forms.go index 9fbf3cc..5452053 100644 --- a/internal/forms/forms.go +++ b/internal/forms/forms.go @@ -2,7 +2,6 @@ package forms import ( "fmt" - "net/http" "net/url" "strings" @@ -25,18 +24,18 @@ func New(data url.Values) *Form { // Required checks required fields func (f *Form) Required(fields ...string) { - for _, field := range fields { - value := f.Get(field) - if strings.TrimSpace(value) == "" { - f.Errors.Add(field, "This field cannot be blank") - } - } + for _, field := range fields { + value := f.Get(field) + if strings.TrimSpace(value) == "" { + f.Errors.Add(field, "This field cannot be blank") + } + } } // Has checks if form field is in post and not emtpy -func (f *Form) Has(field string, r *http.Request) bool { - x := r.Form.Get(field) - return x != "" +func (f *Form) Has(field string) bool { + x := f.Get(field) + return x != "" } // Valid returns true if there are no errors, otherwise false @@ -45,19 +44,19 @@ func (f *Form) Valid() bool { } // MinLength checks for string minimum length -func (f *Form) MinLength(field string, length int, r *http.Request) bool { - value := r.Form.Get(field) - if len(value) < length { - f.Errors.Add(field, fmt.Sprintf("This field must have at least %d letters", length)) - return false - } - return true +func (f *Form) MinLength(field string, length int) bool { + value := f.Get(field) + if len(value) < length { + f.Errors.Add(field, fmt.Sprintf("This field must have at least %d letters", length)) + return false + } + return true } // IsEmail checks the email address -func (f *Form) IsEmail(field string, r *http.Request) { - value := r.Form.Get(field) - if !govalidator.IsEmail(value) { - f.Errors.Add(field, "Invalid email address") - } +func (f *Form) IsEmail(field string) { + value := f.Get(field) + if !govalidator.IsEmail(value) { + f.Errors.Add(field, "Invalid email address") + } } diff --git a/internal/forms/forms_test.go b/internal/forms/forms_test.go new file mode 100644 index 0000000..3bd9ff3 --- /dev/null +++ b/internal/forms/forms_test.go @@ -0,0 +1,131 @@ +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") + } +} diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index fc88626..29beadd 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -100,8 +100,8 @@ func (m *Repository) PostMakeReservation(w http.ResponseWriter, r *http.Request) form := forms.New(r.PostForm) form.Required("first_name", "last_name", "email") - form.MinLength("first_name", 2, r) - form.IsEmail("email", r) + form.MinLength("first_name", 2) + form.IsEmail("email") if !form.Valid() { data := make(map[string]interface{})