Skip to content

Commit

Permalink
Update unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
abneed committed Jul 16, 2022
1 parent 6d0c516 commit 9f256ec
Show file tree
Hide file tree
Showing 6 changed files with 1,026 additions and 96 deletions.
167 changes: 125 additions & 42 deletions internal/handlers/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,18 @@ package handlers

import (
"encoding/json"
"errors"
"net/http"
"strconv"
"strings"
"time"

"github.com/abneed/bookings/helpers"
"github.com/abneed/bookings/internal/config"
"github.com/abneed/bookings/internal/driver"
"github.com/abneed/bookings/internal/forms"
"github.com/abneed/bookings/internal/models"
"github.com/abneed/bookings/internal/render"
"github.com/abneed/bookings/internal/repository"
"github.com/abneed/bookings/internal/repository/dbrepo"
"github.com/go-chi/chi"
)

// Repo the repository used by the handlers
Expand All @@ -35,6 +33,14 @@ func NewRepo(a *config.AppConfig, db *driver.DB) *Repository {
}
}

// NewTestRepo creates a new repository
func NewTestRepo(a *config.AppConfig) *Repository {
return &Repository{
App: a,
DB: dbrepo.NewTestRepo(a),
}
}

// NewHandlers sets the repository for the handlers
func NewHandlers(r *Repository) {
Repo = r
Expand All @@ -56,13 +62,15 @@ func (m *Repository) About(w http.ResponseWriter, r *http.Request) {
func (m *Repository) Reservation(w http.ResponseWriter, r *http.Request) {
res, ok := m.App.Session.Get(r.Context(), "reservation").(models.Reservation)
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, "/", http.StatusTemporaryRedirect)
return
}

room, err := m.DB.GetRoomById(res.RoomID)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't find room!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

Expand All @@ -89,22 +97,49 @@ func (m *Repository) Reservation(w http.ResponseWriter, r *http.Request) {

// PostReservation handles the posting of a reservation form
func (m *Repository) PostReservation(w http.ResponseWriter, r *http.Request) {
reservation, ok := m.App.Session.Get(r.Context(), "reservation").(models.Reservation)
if !ok {
helpers.ServerError(w, errors.New("can't get from session"))
err := r.ParseForm()
if err != nil {
m.App.Session.Put(r.Context(), "error", "can't parse form!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

err := r.ParseForm()
sd := r.Form.Get("start_date")
ed := r.Form.Get("end_date")

// 2020-01-01 -- 01/02 03:04:05PM `06 -0700
layout := "2006-01-02"

startDate, err := time.Parse(layout, sd)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't parse start date")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

reservation.FirstName = r.Form.Get("first_name")
reservation.LastName = r.Form.Get("last_name")
reservation.Phone = r.Form.Get("phone")
reservation.Email = r.Form.Get("email")
endDate, err := time.Parse(layout, ed)
if err != nil {
m.App.Session.Put(r.Context(), "error", "can't parse end date")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

roomID, err := strconv.Atoi(r.Form.Get("room_id"))
if err != nil {
m.App.Session.Put(r.Context(), "error", "invalid data!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

reservation := models.Reservation{
FirstName: r.Form.Get("first_name"),
LastName: r.Form.Get("last_name"),
Phone: r.Form.Get("phone"),
Email: r.Form.Get("email"),
StartDate: startDate,
EndDate: endDate,
RoomID: roomID,
}

form := forms.New(r.PostForm)

Expand All @@ -115,7 +150,7 @@ func (m *Repository) PostReservation(w http.ResponseWriter, r *http.Request) {
if !form.Valid() {
data := make(map[string]interface{})
data["reservation"] = reservation

http.Error(w, "my own message", http.StatusSeeOther)
render.Template(w, r, "make-reservation.page.html", &models.TemplateData{
Form: form,
Data: data,
Expand All @@ -125,12 +160,11 @@ func (m *Repository) PostReservation(w http.ResponseWriter, r *http.Request) {

newReservationID, err := m.DB.InsertReservation(reservation)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't insert reservation into database!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

m.App.Session.Put(r.Context(), "reservation", reservation)

restriction := models.RoomRestriction{
StartDate: reservation.StartDate,
EndDate: reservation.EndDate,
Expand All @@ -141,7 +175,8 @@ func (m *Repository) PostReservation(w http.ResponseWriter, r *http.Request) {

err = m.DB.InsertRoomRestriction(restriction)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't insert room restriction!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}
m.App.Session.Put(r.Context(), "reservation", reservation)
Expand All @@ -166,31 +201,37 @@ func (m *Repository) Availability(w http.ResponseWriter, r *http.Request) {

// PostAvailability renders the search availability page
func (m *Repository) PostAvailability(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil {
m.App.Session.Put(r.Context(), "error", "can't parse form!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

start := r.Form.Get("start")
end := r.Form.Get("end")

layout := "2006-01-02"
startDate, err := time.Parse(layout, start)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't parse start date!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}
endDate, err := time.Parse(layout, end)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't parse end date!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

rooms, err := m.DB.SearchAvailabilityForAllRooms(startDate, endDate)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't get availability for rooms")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

for _, i := range rooms {
m.App.InfoLog.Println("ROOM:", i.ID, i.RoomName)
}

if len(rooms) == 0 {
// no availability
m.App.Session.Put(r.Context(), "error", "No availability")
Expand Down Expand Up @@ -223,24 +264,53 @@ type jsonResponse struct {

// AvailabilityJSON handles request for availability and send JSON response
func (m *Repository) AvailabilityJSON(w http.ResponseWriter, r *http.Request) {
// need to parse request body
err := r.ParseForm()
if err != nil {
// can't parse form, so return appropriate json
resp := jsonResponse{
OK: false,
Message: "Internal server error",
}

out, _ := json.MarshalIndent(resp, "", " ")
w.Header().Set("Content-Type", "application/json")
w.Write(out)
return
}

sd := r.Form.Get("start")
ed := r.Form.Get("end")

layout := "2006-01-02"
startDate, err := time.Parse(layout, sd)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't parse start date!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}
endDate, err := time.Parse(layout, ed)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't parse end date!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

roomID, _ := strconv.Atoi(r.Form.Get("room_id"))

available, _ := m.DB.SearchAvailabilityByDatesByRoomID(startDate, endDate, roomID)
available, err := m.DB.SearchAvailabilityByDatesByRoomID(startDate, endDate, roomID)
if err != nil {
// got a database error, so return appropriate json
resp := jsonResponse{
OK: false,
Message: "Error connecting to database",
}

out, _ := json.MarshalIndent(resp, "", " ")
w.Header().Set("Content-Type", "application/json")
w.Write(out)
return
}
resp := jsonResponse{
OK: available,
Message: "",
Expand All @@ -249,11 +319,9 @@ func (m *Repository) AvailabilityJSON(w http.ResponseWriter, r *http.Request) {
RoomID: strconv.Itoa(roomID),
}

out, err := json.MarshalIndent(resp, "", " ")
if err != nil {
helpers.ServerError(w, err)
return
}
// I removed the error check, since we handle all aspects of
// the json right here
out, _ := json.MarshalIndent(resp, "", " ")

w.Header().Set("Content-Type", "application/json")
w.Write(out)
Expand All @@ -268,7 +336,6 @@ func (m *Repository) Contact(w http.ResponseWriter, r *http.Request) {
func (m *Repository) ReservationSummary(w http.ResponseWriter, r *http.Request) {
reservation, ok := m.App.Session.Get(r.Context(), "reservation").(models.Reservation)
if !ok {
m.App.ErrorLog.Println("Can't get error from session")
m.App.Session.Put(r.Context(), "error", "Can't get reservation from session")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
Expand All @@ -282,7 +349,6 @@ func (m *Repository) ReservationSummary(w http.ResponseWriter, r *http.Request)
sd := reservation.StartDate.Format("2006-01-02")
ed := reservation.EndDate.Format("2006-01-02")
stringMap := make(map[string]string)

stringMap["start_date"] = sd
stringMap["end_date"] = ed

Expand All @@ -294,15 +360,29 @@ func (m *Repository) ReservationSummary(w http.ResponseWriter, r *http.Request)

// ChooseRoom displays list of available rooms
func (m *Repository) ChooseRoom(w http.ResponseWriter, r *http.Request) {
roomID, err := strconv.Atoi(chi.URLParam(r, "id"))
// used to have next 6 lines
//roomID, err := strconv.Atoi(chi.URLParam(r, "id"))
//if err != nil {
// log.Println(err)
// m.App.Session.Put(r.Context(), "error", "missing url parameter")
// http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
// return
//}

// changed to this, so we can test it more easily
// split the URL up by /, and grab the 3rd element
exploded := strings.Split(r.RequestURI, "/")
roomID, err := strconv.Atoi(exploded[2])
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "missing url parameter")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

res, ok := m.App.Session.Get(r.Context(), "reservation").(models.Reservation)
if !ok {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "Can't get reservation from session")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

Expand All @@ -322,20 +402,23 @@ func (m *Repository) BookRoom(w http.ResponseWriter, r *http.Request) {
layout := "2006-01-02"
startDate, err := time.Parse(layout, sd)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't parse start date!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}
endDate, err := time.Parse(layout, ed)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "can't parse end date!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

var res models.Reservation

room, err := m.DB.GetRoomById(roomID)
if err != nil {
helpers.ServerError(w, err)
m.App.Session.Put(r.Context(), "error", "Can't get room from db!")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}

Expand Down
Loading

0 comments on commit 9f256ec

Please sign in to comment.