test: add hours validation tests for edit request handler
Add TestRequestEditHandler_PastClosing_Blocked (19:30 extends past 20:00 closing), TestRequestEditHandler_StagedHoursClosed_Blocked (day closed under staged change), and TestRequestEditHandler_ValidTime_Succeeds (10:00 within open hours). Removed the closed-day test that was incompatible with the bookings test DB seed (all 7 days open 08:00-20:00) — that case is covered by the staged-hours test.
This commit is contained in:
@@ -2387,3 +2387,93 @@ func TestAdminApproveEditRequest_ClosedExceptionalHours_Rejected(t *testing.T) {
|
|||||||
t.Errorf("expected status 409 (conflict), got %d. body: %s", w.Code, w.Body.String())
|
t.Errorf("expected status 409 (conflict), got %d. body: %s", w.Code, w.Body.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestRequestEditHandler_PastClosing_Blocked verifies that proposing a time
|
||||||
|
// whose end extends past closing hours returns a 400 error.
|
||||||
|
// Uses the bookings test DB hours (all days 08:00-20:00).
|
||||||
|
func TestRequestEditHandler_PastClosing_Blocked(t *testing.T) {
|
||||||
|
ctx, tx := testutils.SetupTestTx(t)
|
||||||
|
_, _, bookingID, token := setupEditRequestTest(t, ctx, tx)
|
||||||
|
|
||||||
|
// Test DB seed data: all days 08:00-20:00. Propose 19:30 which ends at
|
||||||
|
// 20:30 for a 60-min service — past the 20:00 closing.
|
||||||
|
nextDay := clock.Now().In(clock.London).AddDate(0, 0, 1)
|
||||||
|
pastClose := time.Date(nextDay.Year(), nextDay.Month(), nextDay.Day(), 19, 30, 0, 0, clock.London).UTC()
|
||||||
|
|
||||||
|
handler := http.HandlerFunc(RequestEditHandler)
|
||||||
|
w := makeRequest(handler, "POST", "/api/bookings/"+bookingID+"/edit-request", map[string]interface{}{
|
||||||
|
"new_start_time": pastClose.Format(time.RFC3339),
|
||||||
|
}, token, ctx)
|
||||||
|
|
||||||
|
if w.Code != http.StatusBadRequest {
|
||||||
|
t.Errorf("expected 400 for past-closing time, got %d: %s", w.Code, w.Body.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestRequestEditHandler_StagedHoursClosed_Blocked verifies that proposing a
|
||||||
|
// time on a day that becomes closed under a staged default hours change is
|
||||||
|
// blocked with a 400 error.
|
||||||
|
func TestRequestEditHandler_StagedHoursClosed_Blocked(t *testing.T) {
|
||||||
|
ctx, tx := testutils.SetupTestTx(t)
|
||||||
|
_, serviceID, bookingID, token := setupEditRequestTest(t, ctx, tx)
|
||||||
|
_ = serviceID
|
||||||
|
|
||||||
|
// Insert a staged change closing a weekday that is normally open
|
||||||
|
adminID, err := fixtures.CreateTestAdminUser(tx)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create admin user: %v", err)
|
||||||
|
}
|
||||||
|
defer fixtures.DeleteUser(tx, adminID)
|
||||||
|
|
||||||
|
tomorrow := clock.Now().In(clock.London).AddDate(0, 0, 1).Format("2006-01-02")
|
||||||
|
// Stage: all days closed
|
||||||
|
hoursJSON := `[{"weekday":0,"startTime":"00:00","endTime":"00:00","isOpen":false},{"weekday":1,"startTime":"00:00","endTime":"00:00","isOpen":false},{"weekday":2,"startTime":"00:00","endTime":"00:00","isOpen":false},{"weekday":3,"startTime":"00:00","endTime":"00:00","isOpen":false},{"weekday":4,"startTime":"00:00","endTime":"00:00","isOpen":false},{"weekday":5,"startTime":"00:00","endTime":"00:00","isOpen":false},{"weekday":6,"startTime":"00:00","endTime":"00:00","isOpen":false}]`
|
||||||
|
_, err = tx.Exec(ctx, `
|
||||||
|
INSERT INTO default_hours_scheduled_changes (effective_date, created_by, hours)
|
||||||
|
VALUES ($1, $2, $3)
|
||||||
|
`, tomorrow, adminID, hoursJSON)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to insert staged change: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Propose a time on a day that is now closed under the staged change
|
||||||
|
londonNow := clock.Now().In(clock.London)
|
||||||
|
target := londonNow.AddDate(0, 0, 1)
|
||||||
|
for target.Weekday() == time.Sunday {
|
||||||
|
target = target.AddDate(0, 0, 1)
|
||||||
|
}
|
||||||
|
proposedTime := time.Date(target.Year(), target.Month(), target.Day(), 10, 0, 0, 0, clock.London).UTC()
|
||||||
|
|
||||||
|
handler := http.HandlerFunc(RequestEditHandler)
|
||||||
|
w := makeRequest(handler, "POST", "/api/bookings/"+bookingID+"/edit-request", map[string]interface{}{
|
||||||
|
"new_start_time": proposedTime.Format(time.RFC3339),
|
||||||
|
}, token, ctx)
|
||||||
|
|
||||||
|
if w.Code != http.StatusBadRequest {
|
||||||
|
t.Errorf("expected 400 for staged-closed day, got %d: %s", w.Code, w.Body.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestRequestEditHandler_ValidTime_Succeeds verifies that proposing a time
|
||||||
|
// within open hours succeeds (returns 201).
|
||||||
|
func TestRequestEditHandler_ValidTime_Succeeds(t *testing.T) {
|
||||||
|
ctx, tx := testutils.SetupTestTx(t)
|
||||||
|
_, _, bookingID, token := setupEditRequestTest(t, ctx, tx)
|
||||||
|
|
||||||
|
// Propose 10:00 on a weekday that is open
|
||||||
|
londonNow := clock.Now().In(clock.London)
|
||||||
|
target := londonNow.AddDate(0, 0, 1)
|
||||||
|
for target.Weekday() == time.Sunday {
|
||||||
|
target = target.AddDate(0, 0, 1)
|
||||||
|
}
|
||||||
|
validTime := time.Date(target.Year(), target.Month(), target.Day(), 10, 0, 0, 0, clock.London).UTC()
|
||||||
|
|
||||||
|
handler := http.HandlerFunc(RequestEditHandler)
|
||||||
|
w := makeRequest(handler, "POST", "/api/bookings/"+bookingID+"/edit-request", map[string]interface{}{
|
||||||
|
"new_start_time": validTime.Format(time.RFC3339),
|
||||||
|
}, token, ctx)
|
||||||
|
|
||||||
|
if w.Code != http.StatusCreated {
|
||||||
|
t.Errorf("expected 201 for valid time, got %d: %s", w.Code, w.Body.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user