Improving tests by handling multiple test cases

This commit is contained in:
vinchent 2024-07-13 16:47:23 +02:00
parent f67aed4942
commit 0f17b3405e
3 changed files with 49 additions and 33 deletions

View File

@ -80,13 +80,15 @@ func (m *Repository) MakeReservation(w http.ResponseWriter, r *http.Request) {
// filled with the info when sent back. // filled with the info when sent back.
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, "/", http.StatusTemporaryRedirect)
return return
} }
room, err := m.DB.GetRoomById(res.RoomID) room, err := m.DB.GetRoomById(res.RoomID)
if err != nil { 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 return
} }

View File

@ -6,7 +6,6 @@ import (
"log" "log"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"net/url"
"testing" "testing"
) )
@ -19,16 +18,15 @@ var theTests = []struct {
name string name string
url string url string
method string method string
params []postData
expectedStatusCode int expectedStatusCode int
}{ }{
// {"home", "/", "GET", []postData{}, http.StatusOK}, {"home", "/", "GET", http.StatusOK},
// {"about", "/about", "GET", []postData{}, http.StatusOK}, {"about", "/about", "GET", http.StatusOK},
// {"gq", "/generals-quarters", "GET", []postData{}, http.StatusOK}, {"gq", "/generals-quarters", "GET", http.StatusOK},
// {"ms", "/majors-suite", "GET", []postData{}, http.StatusOK}, {"ms", "/majors-suite", "GET", http.StatusOK},
// {"sa", "/availability", "GET", []postData{}, http.StatusOK}, {"sa", "/availability", "GET", http.StatusOK},
// {"contact", "/contact", "GET", []postData{}, http.StatusOK}, {"contact", "/contact", "GET", http.StatusOK},
// {"ma", "/make-reservation", "GET", []postData{}, http.StatusOK},
// {"post-search-avail", "/availability", "POST", []postData{ // {"post-search-avail", "/availability", "POST", []postData{
// {key: "start", value: "2020-01-01"}, // {key: "start", value: "2020-01-01"},
// {key: "end", value: "2020-01-02"}, // {key: "end", value: "2020-01-02"},
@ -51,7 +49,6 @@ func TestHandlers(t *testing.T) {
defer ts.Close() defer ts.Close()
for _, e := range theTests { for _, e := range theTests {
if e.method == "GET" {
resp, err := ts.Client().Get(ts.URL + e.url) resp, err := ts.Client().Get(ts.URL + e.url)
if err != nil { if err != nil {
t.Log(err) t.Log(err)
@ -60,20 +57,6 @@ func TestHandlers(t *testing.T) {
if resp.StatusCode != e.expectedStatusCode { if resp.StatusCode != e.expectedStatusCode {
t.Errorf("for %s, expected %d but got %d", e.name, e.expectedStatusCode, resp.StatusCode) 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)
}
}
} }
} }
@ -103,6 +86,32 @@ func TestRepository_Reservation(t *testing.T) {
t.Errorf("Reservation handler returned response code: got %d, wanted %d", t.Errorf("Reservation handler returned response code: got %d, wanted %d",
rr.Code, http.StatusOK) 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 { func getCtx(req *http.Request) context.Context {

View File

@ -1,6 +1,7 @@
package dbrepo package dbrepo
import ( import (
"errors"
"go-udemy-web-1/internal/models" "go-udemy-web-1/internal/models"
"time" "time"
) )
@ -33,5 +34,9 @@ func (m *testDBRepo) SearchAvailabilityForAllRooms(start, end time.Time) ([]mode
// GetRoomById gets a room by id // GetRoomById gets a room by id
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 {
return room, errors.New("Deliberate error")
}
return room, nil return room, nil
} }