add tests for postavailability and reservation summary

This commit is contained in:
vinchent 2024-07-15 22:38:29 +02:00
parent e8390cc51d
commit 6853a1a483
3 changed files with 129 additions and 11 deletions

View File

@ -2,11 +2,9 @@ package handlers
import ( import (
"encoding/json" "encoding/json"
"errors"
"go-udemy-web-1/internal/config" "go-udemy-web-1/internal/config"
"go-udemy-web-1/internal/driver" "go-udemy-web-1/internal/driver"
"go-udemy-web-1/internal/forms" "go-udemy-web-1/internal/forms"
"go-udemy-web-1/internal/helpers"
"go-udemy-web-1/internal/models" "go-udemy-web-1/internal/models"
"go-udemy-web-1/internal/render" "go-udemy-web-1/internal/render"
"go-udemy-web-1/internal/repository" "go-udemy-web-1/internal/repository"
@ -225,18 +223,21 @@ func (m *Repository) PostAvailability(w http.ResponseWriter, r *http.Request) {
layout := "2006-01-02" layout := "2006-01-02"
startDate, err := time.Parse(layout, start) startDate, err := time.Parse(layout, start)
if err != nil { if err != nil {
helpers.ServerError(w, err) m.App.Session.Put(r.Context(), "error", "Can't parse start date")
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
return return
} }
endDate, err := time.Parse(layout, end) endDate, err := time.Parse(layout, end)
if err != nil { if err != nil {
helpers.ServerError(w, err) m.App.Session.Put(r.Context(), "error", "Can't parse end date")
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
return return
} }
rooms, err := m.DB.SearchAvailabilityForAllRooms(startDate, endDate) rooms, err := m.DB.SearchAvailabilityForAllRooms(startDate, endDate)
if err != nil { if err != nil {
helpers.ServerError(w, err) m.App.Session.Put(r.Context(), "error", "Can't connect to database")
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
return return
} }
@ -248,7 +249,8 @@ func (m *Repository) PostAvailability(w http.ResponseWriter, r *http.Request) {
// No availability // No availability
m.App.InfoLog.Println("No availability") m.App.InfoLog.Println("No availability")
m.App.Session.Put(r.Context(), "error", "No availability") m.App.Session.Put(r.Context(), "error", "No availability")
http.Redirect(w, r, "/search-availability", http.StatusSeeOther) http.Redirect(w, r, "/availability", http.StatusSeeOther)
return
} }
data := make(map[string]interface{}) data := make(map[string]interface{})
@ -358,14 +360,16 @@ func (m *Repository) AvailabilityJSON(w http.ResponseWriter, r *http.Request) {
func (m *Repository) ChooseRoom(w http.ResponseWriter, r *http.Request) { func (m *Repository) ChooseRoom(w http.ResponseWriter, r *http.Request) {
roomID, err := strconv.Atoi(chi.URLParam(r, "id")) roomID, err := strconv.Atoi(chi.URLParam(r, "id"))
if err != nil { if err != nil {
helpers.ServerError(w, err) m.App.Session.Put(r.Context(), "error", "Can't parse roomID")
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
return return
} }
m.App.Session.Get(r.Context(), "reservation") m.App.Session.Get(r.Context(), "reservation")
res, ok := m.App.Session.Get(r.Context(), "reservation").(models.Reservation) res, ok := m.App.Session.Get(r.Context(), "reservation").(models.Reservation)
if !ok { if !ok {
helpers.ServerError(w, errors.New("cannot get reservation from session")) m.App.Session.Put(r.Context(), "error", "Can't get reservation from session")
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
return return
} }
@ -386,17 +390,20 @@ 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 {
helpers.ServerError(w, err) m.App.Session.Put(r.Context(), "error", "Can't get reservation from session")
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 {
helpers.ServerError(w, err) m.App.Session.Put(r.Context(), "error", "Can't parse start date")
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 {
helpers.ServerError(w, err) m.App.Session.Put(r.Context(), "error", "Can't parse end date")
http.Redirect(w, r, "/availability", http.StatusTemporaryRedirect)
return return
} }
res.RoomID = roomID res.RoomID = roomID

View File

@ -351,6 +351,106 @@ func Test_AvailabilityJSON(t *testing.T) {
} }
} }
// }}}
// {{{ Test ReservationSummary
var reservationSummaryTests = []struct {
name string
haveSession bool
expectedStatusCode int
}{
{"ok", true, http.StatusOK},
{"nok", false, http.StatusTemporaryRedirect},
}
func Test_ReservationSummary(t *testing.T) {
for _, test := range reservationSummaryTests {
req, _ := http.NewRequest("GET", "/reservation-summary", nil)
ctx := getCtx(req)
req = req.WithContext(ctx)
rr := httptest.NewRecorder()
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,
FirstName: "John",
LastName: "Smith",
Email: "john@smith.com",
RoomID: 1,
}
if test.haveSession {
session.Put(req.Context(), "reservation", reservation)
}
handler := http.HandlerFunc(Repo.ReservationSummary)
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 PostAvailability
var postAvailabilityTests = []struct {
name string
queryInfo []postData
expectedStatusCode int
}{
{"ok", []postData{
{key: "start", value: "2050-01-01"},
{key: "end", value: "2050-01-02"},
}, http.StatusOK},
{"database error", []postData{
{key: "start", value: "2050-01-03"},
{key: "end", value: "2050-01-04"},
}, http.StatusTemporaryRedirect},
{"no availability", []postData{
{key: "start", value: "2050-01-05"},
{key: "end", value: "2050-01-06"},
}, http.StatusSeeOther},
{"wrong start date", []postData{
{key: "start", value: "2050-05"},
{key: "end", value: "2050-01-06"},
}, http.StatusTemporaryRedirect},
{"wrong end date", []postData{
{key: "start", value: "2050-01-05"},
{key: "end", value: "01-06"},
}, http.StatusTemporaryRedirect},
}
func Test_PostAvailability(t *testing.T) {
for _, test := range postAvailabilityTests {
reqBody := url.Values{}
for _, element := range test.queryInfo {
reqBody.Add(element.key, element.value)
}
req, _ := http.NewRequest("POST", "/availability", strings.NewReader(reqBody.Encode()))
ctx := getCtx(req)
req = req.WithContext(ctx)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
rr := httptest.NewRecorder()
handler := http.HandlerFunc(Repo.PostAvailability)
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

@ -41,6 +41,17 @@ func (m *testDBRepo) SearchAvailabilityByDatesByRoomID(start, end time.Time, roo
// SearchAvailabilityForAllRooms returns a slice of rooms, if any, for given date range // SearchAvailabilityForAllRooms returns a slice of rooms, if any, for given date range
func (m *testDBRepo) SearchAvailabilityForAllRooms(start, end time.Time) ([]models.Room, error) { func (m *testDBRepo) SearchAvailabilityForAllRooms(start, end time.Time) ([]models.Room, error) {
var rooms []models.Room var rooms []models.Room
if start.Format("2006-01-02") == "2050-01-01" && end.Format("2006-01-02") == "2050-01-02" {
room := models.Room{
RoomName: "room",
ID: 1,
}
rooms = append(rooms, room)
return rooms, nil
}
if start.Format("2006-01-02") == "2050-01-03" && end.Format("2006-01-02") == "2050-01-04" {
return rooms, errors.New("deliberate error")
}
return rooms, nil return rooms, nil
} }