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")
	}
}
