finish handler tests
This commit is contained in:
parent
191b010b8e
commit
998850b708
@ -357,7 +357,7 @@ func (m *Repository) AvailabilityJSON(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
// ChooseRoom displays list of available rooms
|
// ChooseRoom displays list of available rooms
|
||||||
func (m *Repository) ChooseRoom(w http.ResponseWriter, r *http.Request) {
|
func (m *Repository) ChooseRoom(w http.ResponseWriter, r *http.Request) {
|
||||||
exploded := strings.Split(r.RequestURI, "/")
|
exploded := strings.Split(r.URL.RequestURI(), "/")
|
||||||
roomID, err := strconv.Atoi(exploded[2])
|
roomID, err := strconv.Atoi(exploded[2])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.App.Session.Put(r.Context(), "error", "Can't parse roomID")
|
m.App.Session.Put(r.Context(), "error", "Can't parse roomID")
|
||||||
@ -390,19 +390,19 @@ func (m *Repository) BookRoom(w http.ResponseWriter, r *http.Request) {
|
|||||||
layout := "2006-01-02"
|
layout := "2006-01-02"
|
||||||
startDate, err := time.Parse(layout, sd)
|
startDate, err := time.Parse(layout, sd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.App.Session.Put(r.Context(), "error", "Can't get reservation from session")
|
m.App.Session.Put(r.Context(), "error", "Can't parse start date")
|
||||||
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
|
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
endDate, err := time.Parse(layout, ed)
|
endDate, err := time.Parse(layout, ed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.App.Session.Put(r.Context(), "error", "Can't parse start date")
|
m.App.Session.Put(r.Context(), "error", "Can't parse end date")
|
||||||
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
|
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
room, err := m.DB.GetRoomById(roomID)
|
room, err := m.DB.GetRoomById(roomID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.App.Session.Put(r.Context(), "error", "Can't parse end date")
|
m.App.Session.Put(r.Context(), "error", "Can't parse roomId")
|
||||||
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
|
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -3,11 +3,13 @@ package handlers
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"go-udemy-web-1/internal/driver"
|
||||||
"go-udemy-web-1/internal/models"
|
"go-udemy-web-1/internal/models"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
@ -19,6 +21,20 @@ type postData struct {
|
|||||||
value string
|
value string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// {{{ Test NewRepo
|
||||||
|
|
||||||
|
func Test_NewRepo(t *testing.T) {
|
||||||
|
var db driver.DB
|
||||||
|
repo := NewRepo(&app, &db)
|
||||||
|
|
||||||
|
if reflect.TypeOf(repo).String() != "*handlers.Repository" {
|
||||||
|
t.Errorf("repo is of type %s instead of *handlers.Repository", reflect.TypeOf(repo).String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ Simple get tests
|
||||||
|
|
||||||
var theTests = []struct {
|
var theTests = []struct {
|
||||||
name string
|
name string
|
||||||
url string
|
url string
|
||||||
@ -31,21 +47,6 @@ var theTests = []struct {
|
|||||||
{"ms", "/majors-suite", "GET", http.StatusOK},
|
{"ms", "/majors-suite", "GET", http.StatusOK},
|
||||||
{"sa", "/availability", "GET", http.StatusOK},
|
{"sa", "/availability", "GET", http.StatusOK},
|
||||||
{"contact", "/contact", "GET", http.StatusOK},
|
{"contact", "/contact", "GET", http.StatusOK},
|
||||||
|
|
||||||
// {"post-search-avail", "/availability", "POST", []postData{
|
|
||||||
// {key: "start", value: "2020-01-01"},
|
|
||||||
// {key: "end", value: "2020-01-02"},
|
|
||||||
// }, http.StatusOK},
|
|
||||||
// {"post-search-avail-json", "/availability-json", "POST", []postData{
|
|
||||||
// {key: "start", value: "2020-01-01"},
|
|
||||||
// {key: "end", value: "2020-01-02"},
|
|
||||||
// }, http.StatusOK},
|
|
||||||
// {"make-reservation", "/make-reservation", "POST", []postData{
|
|
||||||
// {key: "first_name", value: "John"},
|
|
||||||
// {key: "last_name", value: "Smith"},
|
|
||||||
// {key: "email", value: "me@here.com"},
|
|
||||||
// {key: "phone", value: "12345"},
|
|
||||||
// }, http.StatusOK},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHandlers(t *testing.T) {
|
func TestHandlers(t *testing.T) {
|
||||||
@ -65,6 +66,7 @@ func TestHandlers(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
// {{{ Make Reservation Tests
|
// {{{ Make Reservation Tests
|
||||||
|
|
||||||
var makeReservationTests = []struct {
|
var makeReservationTests = []struct {
|
||||||
@ -141,7 +143,7 @@ var postMakeReservationTests = []struct {
|
|||||||
},
|
},
|
||||||
http.StatusTemporaryRedirect,
|
http.StatusTemporaryRedirect,
|
||||||
},
|
},
|
||||||
{"no_post_data", []postData{}, http.StatusOK},
|
{"no_post_data", []postData{}, http.StatusTemporaryRedirect},
|
||||||
{
|
{
|
||||||
"missing first name",
|
"missing first name",
|
||||||
[]postData{
|
[]postData{
|
||||||
@ -212,6 +214,7 @@ func TestRepository_PostMakeReservation(t *testing.T) {
|
|||||||
for _, test := range postMakeReservationTests {
|
for _, test := range postMakeReservationTests {
|
||||||
roomID := 1
|
roomID := 1
|
||||||
reqBody := url.Values{}
|
reqBody := url.Values{}
|
||||||
|
var req *http.Request
|
||||||
if len(test.reservationInfo) > 0 {
|
if len(test.reservationInfo) > 0 {
|
||||||
for _, element := range test.reservationInfo {
|
for _, element := range test.reservationInfo {
|
||||||
reqBody.Add(element.key, element.value)
|
reqBody.Add(element.key, element.value)
|
||||||
@ -219,6 +222,9 @@ func TestRepository_PostMakeReservation(t *testing.T) {
|
|||||||
roomID, _ = strconv.Atoi(element.value)
|
roomID, _ = strconv.Atoi(element.value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
req, _ = http.NewRequest("POST", "/make-reservation", strings.NewReader(reqBody.Encode()))
|
||||||
|
} else {
|
||||||
|
req, _ = http.NewRequest("POST", "/make-reservation", nil)
|
||||||
}
|
}
|
||||||
layout := "2006-01-02"
|
layout := "2006-01-02"
|
||||||
sd, _ := time.Parse(layout, "2050-01-01")
|
sd, _ := time.Parse(layout, "2050-01-01")
|
||||||
@ -229,7 +235,6 @@ func TestRepository_PostMakeReservation(t *testing.T) {
|
|||||||
EndDate: ed,
|
EndDate: ed,
|
||||||
}
|
}
|
||||||
|
|
||||||
req, _ := http.NewRequest("POST", "/make-reservation", strings.NewReader(reqBody.Encode()))
|
|
||||||
ctx := getCtx(req)
|
ctx := getCtx(req)
|
||||||
req = req.WithContext(ctx)
|
req = req.WithContext(ctx)
|
||||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
@ -313,16 +318,25 @@ var availabilityJSONTests = []struct {
|
|||||||
OK: false,
|
OK: false,
|
||||||
Message: "Error connecting to database",
|
Message: "Error connecting to database",
|
||||||
}},
|
}},
|
||||||
|
{"no form", []postData{}, jsonResponse{
|
||||||
|
OK: false,
|
||||||
|
Message: "Internal server error",
|
||||||
|
}},
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_AvailabilityJSON(t *testing.T) {
|
func Test_AvailabilityJSON(t *testing.T) {
|
||||||
for _, test := range availabilityJSONTests {
|
for _, test := range availabilityJSONTests {
|
||||||
|
var req *http.Request
|
||||||
reqBody := url.Values{}
|
reqBody := url.Values{}
|
||||||
|
if len(test.queryInfo) > 0 {
|
||||||
for _, element := range test.queryInfo {
|
for _, element := range test.queryInfo {
|
||||||
reqBody.Add(element.key, element.value)
|
reqBody.Add(element.key, element.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
req, _ := http.NewRequest("POST", "/make-reservation", strings.NewReader(reqBody.Encode()))
|
req, _ = http.NewRequest("POST", "/make-reservation", strings.NewReader(reqBody.Encode()))
|
||||||
|
} else {
|
||||||
|
req, _ = http.NewRequest("POST", "/make-reservation", nil)
|
||||||
|
}
|
||||||
ctx := getCtx(req)
|
ctx := getCtx(req)
|
||||||
req = req.WithContext(ctx)
|
req = req.WithContext(ctx)
|
||||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
@ -425,16 +439,22 @@ var postAvailabilityTests = []struct {
|
|||||||
{key: "start", value: "2050-01-05"},
|
{key: "start", value: "2050-01-05"},
|
||||||
{key: "end", value: "01-06"},
|
{key: "end", value: "01-06"},
|
||||||
}, http.StatusTemporaryRedirect},
|
}, http.StatusTemporaryRedirect},
|
||||||
|
{"wrong end date", []postData{}, http.StatusTemporaryRedirect},
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_PostAvailability(t *testing.T) {
|
func Test_PostAvailability(t *testing.T) {
|
||||||
for _, test := range postAvailabilityTests {
|
for _, test := range postAvailabilityTests {
|
||||||
|
var req *http.Request
|
||||||
|
if len(test.queryInfo) > 0 {
|
||||||
reqBody := url.Values{}
|
reqBody := url.Values{}
|
||||||
for _, element := range test.queryInfo {
|
for _, element := range test.queryInfo {
|
||||||
reqBody.Add(element.key, element.value)
|
reqBody.Add(element.key, element.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
req, _ := http.NewRequest("POST", "/availability", strings.NewReader(reqBody.Encode()))
|
req, _ = http.NewRequest("POST", "/availability", strings.NewReader(reqBody.Encode()))
|
||||||
|
} else {
|
||||||
|
req, _ = http.NewRequest("POST", "/availability", nil)
|
||||||
|
}
|
||||||
ctx := getCtx(req)
|
ctx := getCtx(req)
|
||||||
req = req.WithContext(ctx)
|
req = req.WithContext(ctx)
|
||||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
@ -451,6 +471,102 @@ func Test_PostAvailability(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ Test ChooseRoom
|
||||||
|
|
||||||
|
var chooseRoomTests = []struct {
|
||||||
|
name string
|
||||||
|
request string
|
||||||
|
haveSession bool
|
||||||
|
expectedStatusCode int
|
||||||
|
}{
|
||||||
|
{"ok", "/choose-room/1", true, http.StatusSeeOther},
|
||||||
|
{"wrong room id", "/choose-room/1wrong", true, http.StatusTemporaryRedirect},
|
||||||
|
{"no session", "/choose-room/1", false, http.StatusTemporaryRedirect},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_ChooseRoom(t *testing.T) {
|
||||||
|
for _, test := range chooseRoomTests {
|
||||||
|
req, _ := http.NewRequest("GET", test.request, nil)
|
||||||
|
ctx := getCtx(req)
|
||||||
|
req = req.WithContext(ctx)
|
||||||
|
|
||||||
|
layout := "2006-01-02"
|
||||||
|
sd, _ := time.Parse(layout, "2050-01-01")
|
||||||
|
ed, _ := time.Parse(layout, "2050-01-02")
|
||||||
|
reservation := models.Reservation{
|
||||||
|
StartDate: sd,
|
||||||
|
EndDate: ed,
|
||||||
|
}
|
||||||
|
|
||||||
|
if test.haveSession {
|
||||||
|
session.Put(req.Context(), "reservation", reservation)
|
||||||
|
}
|
||||||
|
rr := httptest.NewRecorder()
|
||||||
|
|
||||||
|
handler := http.HandlerFunc(Repo.ChooseRoom)
|
||||||
|
handler.ServeHTTP(rr, req)
|
||||||
|
|
||||||
|
if rr.Code != test.expectedStatusCode {
|
||||||
|
t.Errorf("for %s, reservation handler returned response code: got %d, wanted %d\n",
|
||||||
|
test.name, rr.Code, test.expectedStatusCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ Test BookRoom
|
||||||
|
|
||||||
|
var bookRoomTests = []struct {
|
||||||
|
name string
|
||||||
|
queryInfo []postData
|
||||||
|
expectedStatusCode int
|
||||||
|
}{
|
||||||
|
{"ok", []postData{
|
||||||
|
{key: "id", value: "1"},
|
||||||
|
{key: "s", value: "2050-01-01"},
|
||||||
|
{key: "e", value: "2050-01-02"},
|
||||||
|
}, http.StatusSeeOther},
|
||||||
|
{"wrong start date", []postData{
|
||||||
|
{key: "id", value: "1"},
|
||||||
|
{key: "s", value: "20-01-01"},
|
||||||
|
{key: "e", value: "2050-01-02"},
|
||||||
|
}, http.StatusTemporaryRedirect},
|
||||||
|
{"wrong end date", []postData{
|
||||||
|
{key: "id", value: "1"},
|
||||||
|
{key: "s", value: "2050-01-01"},
|
||||||
|
{key: "e", value: "2050-0-02"},
|
||||||
|
}, http.StatusTemporaryRedirect},
|
||||||
|
{"wrong room id", []postData{
|
||||||
|
{key: "id", value: "w"},
|
||||||
|
{key: "s", value: "2050-01-01"},
|
||||||
|
{key: "e", value: "2050-01-02"},
|
||||||
|
}, http.StatusTemporaryRedirect},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_BookRoom(t *testing.T) {
|
||||||
|
for _, test := range bookRoomTests {
|
||||||
|
request := "/book-room?"
|
||||||
|
for _, element := range test.queryInfo {
|
||||||
|
request += element.key + "=" + element.value + "&"
|
||||||
|
}
|
||||||
|
request = request[:len(request)-1]
|
||||||
|
req, _ := http.NewRequest("GET", request, nil)
|
||||||
|
ctx := getCtx(req)
|
||||||
|
req = req.WithContext(ctx)
|
||||||
|
|
||||||
|
rr := httptest.NewRecorder()
|
||||||
|
|
||||||
|
handler := http.HandlerFunc(Repo.BookRoom)
|
||||||
|
handler.ServeHTTP(rr, req)
|
||||||
|
|
||||||
|
if rr.Code != test.expectedStatusCode {
|
||||||
|
t.Errorf("for %s, reservation handler returned response code: got %d, wanted %d\n",
|
||||||
|
test.name, rr.Code, test.expectedStatusCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ Test Helpers
|
// {{{ Test Helpers
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ func (m *testDBRepo) SearchAvailabilityForAllRooms(start, end time.Time) ([]mode
|
|||||||
func (m *testDBRepo) GetRoomById(id int) (models.Room, error) {
|
func (m *testDBRepo) GetRoomById(id int) (models.Room, error) {
|
||||||
var room models.Room
|
var room models.Room
|
||||||
|
|
||||||
if id > 2 {
|
if id > 2 || id <= 0 {
|
||||||
return room, errors.New("deliberate error")
|
return room, errors.New("deliberate error")
|
||||||
}
|
}
|
||||||
return room, nil
|
return room, nil
|
||||||
|
Loading…
Reference in New Issue
Block a user