finish handler tests

This commit is contained in:
vinchent 2024-07-16 13:22:46 +02:00
parent 191b010b8e
commit 998850b708
3 changed files with 147 additions and 31 deletions

View File

@ -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
} }

View File

@ -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{}
for _, element := range test.queryInfo { if len(test.queryInfo) > 0 {
reqBody.Add(element.key, element.value) for _, element := range test.queryInfo {
} 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 {
reqBody := url.Values{} var req *http.Request
for _, element := range test.queryInfo { if len(test.queryInfo) > 0 {
reqBody.Add(element.key, element.value) reqBody := url.Values{}
} for _, element := range test.queryInfo {
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

View File

@ -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