fix(entries): reject create/update of intervals in the future
- Add ErrFutureDay sentinel error - CreateInterval: rejects if startDayKey > todayKey (400) - Update: rejects if new start_time moves entry to a future day (400) - Handler maps ErrFutureDay → 400 Bad Request for both endpoints - Add TestCreateIntervalRejectsFutureDay - Add TestUpdateRejectsMoveToFutureDay - UI already gates this via dayCapabilities (canAddInterval=false, canEditEntries=false for future days), but server now enforces it too
This commit is contained in:
@@ -231,3 +231,55 @@ func TestUpdateRejectsClosedDay(t *testing.T) {
|
||||
t.Fatalf("expected ErrDayAlreadyClosed, got %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCreateIntervalRejectsFutureDay(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
svc := newTestServices(t)
|
||||
|
||||
// Build a start_time that is tomorrow.
|
||||
tomorrow := time.Now().UTC().AddDate(0, 0, 1)
|
||||
startMs := time.Date(tomorrow.Year(), tomorrow.Month(), tomorrow.Day(), 9, 0, 0, 0, time.UTC).UnixMilli()
|
||||
endMs := startMs + 3_600_000 // +1h
|
||||
|
||||
_, err := svc.CreateInterval(ctx, service.CreateIntervalInput{
|
||||
StartTime: startMs,
|
||||
EndTime: endMs,
|
||||
Note: "future",
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatal("expected error creating interval in the future")
|
||||
}
|
||||
if !errors.Is(err, service.ErrFutureDay) {
|
||||
t.Fatalf("expected ErrFutureDay, got %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateRejectsMoveToFutureDay(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
svc := newTestServices(t)
|
||||
|
||||
// Create a valid interval for today.
|
||||
now := time.Now().UTC()
|
||||
startMs := time.Date(now.Year(), now.Month(), now.Day(), 8, 0, 0, 0, time.UTC).UnixMilli()
|
||||
endMs := startMs + 3_600_000
|
||||
entry, err := svc.CreateInterval(ctx, service.CreateIntervalInput{
|
||||
StartTime: startMs,
|
||||
EndTime: endMs,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("CreateInterval: %v", err)
|
||||
}
|
||||
|
||||
// Try to move start_time to tomorrow.
|
||||
tomorrow := now.AddDate(0, 0, 1)
|
||||
futureStart := time.Date(tomorrow.Year(), tomorrow.Month(), tomorrow.Day(), 8, 0, 0, 0, time.UTC).UnixMilli()
|
||||
_, err = svc.Update(ctx, entry.ID, service.UpdateEntryInput{
|
||||
StartTime: &futureStart,
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatal("expected error moving entry to future day")
|
||||
}
|
||||
if !errors.Is(err, service.ErrFutureDay) {
|
||||
t.Fatalf("expected ErrFutureDay, got %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user