From 0f17b3405e1c19288ea12dfb4975a375ff39297d Mon Sep 17 00:00:00 2001 From: vinchent Date: Sat, 13 Jul 2024 16:47:23 +0200 Subject: [PATCH] Improving tests by handling multiple test cases --- internal/handlers/handlers.go | 6 ++- internal/handlers/handlers_test.go | 71 ++++++++++++++----------- internal/repository/dbrepo/test-repo.go | 5 ++ 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index d6c217b..8ad1169 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -80,13 +80,15 @@ func (m *Repository) MakeReservation(w http.ResponseWriter, r *http.Request) { // filled with the info when sent back. 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 } diff --git a/internal/handlers/handlers_test.go b/internal/handlers/handlers_test.go index 2b5ccec..95f1a68 100644 --- a/internal/handlers/handlers_test.go +++ b/internal/handlers/handlers_test.go @@ -6,7 +6,6 @@ import ( "log" "net/http" "net/http/httptest" - "net/url" "testing" ) @@ -19,16 +18,15 @@ var theTests = []struct { name string url string method string - params []postData expectedStatusCode int }{ - // {"home", "/", "GET", []postData{}, http.StatusOK}, - // {"about", "/about", "GET", []postData{}, http.StatusOK}, - // {"gq", "/generals-quarters", "GET", []postData{}, http.StatusOK}, - // {"ms", "/majors-suite", "GET", []postData{}, http.StatusOK}, - // {"sa", "/availability", "GET", []postData{}, http.StatusOK}, - // {"contact", "/contact", "GET", []postData{}, http.StatusOK}, - // {"ma", "/make-reservation", "GET", []postData{}, http.StatusOK}, + {"home", "/", "GET", http.StatusOK}, + {"about", "/about", "GET", http.StatusOK}, + {"gq", "/generals-quarters", "GET", http.StatusOK}, + {"ms", "/majors-suite", "GET", http.StatusOK}, + {"sa", "/availability", "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"}, @@ -51,28 +49,13 @@ func TestHandlers(t *testing.T) { defer ts.Close() for _, e := range theTests { - if e.method == "GET" { - resp, err := ts.Client().Get(ts.URL + e.url) - if err != nil { - t.Log(err) - t.Fatal(err) - } - if resp.StatusCode != e.expectedStatusCode { - t.Errorf("for %s, expected %d but got %d", e.name, e.expectedStatusCode, resp.StatusCode) - } - } else { - values := url.Values{} - for _, x := range e.params { - values.Add(x.key, x.value) - } - resp, err := ts.Client().PostForm(ts.URL+e.url, values) - if err != nil { - t.Log(err) - t.Fatal(err) - } - if resp.StatusCode != e.expectedStatusCode { - t.Errorf("for %s, expected %d but got %d", e.name, e.expectedStatusCode, resp.StatusCode) - } + resp, err := ts.Client().Get(ts.URL + e.url) + if err != nil { + t.Log(err) + t.Fatal(err) + } + if resp.StatusCode != e.expectedStatusCode { + t.Errorf("for %s, expected %d but got %d", e.name, e.expectedStatusCode, resp.StatusCode) } } } @@ -103,6 +86,32 @@ func TestRepository_Reservation(t *testing.T) { t.Errorf("Reservation handler returned response code: got %d, wanted %d", rr.Code, http.StatusOK) } + + // test case where reservation is not in session (reset everything) + req, _ = http.NewRequest("GET", "/make-reservation", nil) + ctx = getCtx(req) + req = req.WithContext(ctx) + rr = httptest.NewRecorder() + + handler.ServeHTTP(rr, req) + if rr.Code != http.StatusTemporaryRedirect { + t.Errorf("Reservation handler returned response code: got %d, wanted %d", + rr.Code, http.StatusTemporaryRedirect) + } + + // test with non-existant room + req, _ = http.NewRequest("GET", "/make-reservation", nil) + ctx = getCtx(req) + req = req.WithContext(ctx) + rr = httptest.NewRecorder() + reservation.RoomID = 100 + session.Put(ctx, "reservation", reservation) + + handler.ServeHTTP(rr, req) + if rr.Code != http.StatusTemporaryRedirect { + t.Errorf("Reservation handler returned response code: got %d, wanted %d", + rr.Code, http.StatusTemporaryRedirect) + } } func getCtx(req *http.Request) context.Context { diff --git a/internal/repository/dbrepo/test-repo.go b/internal/repository/dbrepo/test-repo.go index 0f69013..8d9a0ef 100644 --- a/internal/repository/dbrepo/test-repo.go +++ b/internal/repository/dbrepo/test-repo.go @@ -1,6 +1,7 @@ package dbrepo import ( + "errors" "go-udemy-web-1/internal/models" "time" ) @@ -33,5 +34,9 @@ func (m *testDBRepo) SearchAvailabilityForAllRooms(start, end time.Time) ([]mode // GetRoomById gets a room by id func (m *testDBRepo) GetRoomById(id int) (models.Room, error) { var room models.Room + + if id > 2 { + return room, errors.New("Deliberate error") + } return room, nil }