diff --git a/backend/src/main/java/es/asepeyo/recordalexia/service/TodayService.java b/backend/src/main/java/es/asepeyo/recordalexia/service/TodayService.java index 5743889..8c2b050 100644 --- a/backend/src/main/java/es/asepeyo/recordalexia/service/TodayService.java +++ b/backend/src/main/java/es/asepeyo/recordalexia/service/TodayService.java @@ -76,7 +76,7 @@ public class TodayService { events, ProgressCalculator.from(tasks), new WalletInfo(child.getCoins()), - buildTimer(child)); + buildTimer(child.getDepartureTime(), LocalTime.now(clock), morning.isEmpty())); } private TaskView toTaskView(DailyTask t) { @@ -95,13 +95,20 @@ public class TodayService { c.isDyslexiaFont()); } - /** Temporizador de salida: minutos que faltan hasta departureTime (>= 0). */ - private TimerInfo buildTimer(Child child) { - LocalTime departure = child.getDepartureTime(); - if (departure == null) { + /** + * Temporizador de salida. Solo tiene sentido si HOY hay cole (hay tareas de + * mañana) y aún no ha pasado la hora: pasado ese momento desaparece, en vez de + * quedarse clavado en "0 min" el resto del día (o en domingo). Con minutos a + * null el kiosko no lo pinta. + */ + static TimerInfo buildTimer(LocalTime departure, LocalTime now, boolean sinColeHoy) { + if (departure == null || sinColeHoy) { return new TimerInfo(null, null); } - long minutes = Duration.between(LocalTime.now(clock), departure).toMinutes(); - return new TimerInfo(departure.format(HHMM), (int) Math.max(0, minutes)); + long minutes = Duration.between(now, departure).toMinutes(); + if (minutes < 0) { + return new TimerInfo(departure.format(HHMM), null); + } + return new TimerInfo(departure.format(HHMM), (int) minutes); } } diff --git a/backend/src/test/java/es/asepeyo/recordalexia/service/TodayServiceTimerTest.java b/backend/src/test/java/es/asepeyo/recordalexia/service/TodayServiceTimerTest.java new file mode 100644 index 0000000..d204c7f --- /dev/null +++ b/backend/src/test/java/es/asepeyo/recordalexia/service/TodayServiceTimerTest.java @@ -0,0 +1,48 @@ +package es.asepeyo.recordalexia.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import es.asepeyo.recordalexia.web.dto.TodayResponse.TimerInfo; +import java.time.LocalTime; +import org.junit.jupiter.api.Test; + +/** + * Reglas del temporizador "SALIMOS EN X min": solo aparece si hoy hay cole y la + * hora de salida no ha pasado; nunca se queda clavado en "0 min" el resto del día. + */ +class TodayServiceTimerTest { + + private static final LocalTime SALIDA = LocalTime.of(8, 30); + + @Test + void sinHoraDeSalidaNoHayTemporizador() { + TimerInfo timer = TodayService.buildTimer(null, LocalTime.of(8, 0), false); + assertThat(timer.departureTime()).isNull(); + assertThat(timer.minutesUntilDeparture()).isNull(); + } + + @Test + void sinColeHoyNoHayTemporizador() { + TimerInfo timer = TodayService.buildTimer(SALIDA, LocalTime.of(8, 0), true); + assertThat(timer.minutesUntilDeparture()).isNull(); + } + + @Test + void antesDeLaHoraMuestraLosMinutosQueFaltan() { + TimerInfo timer = TodayService.buildTimer(SALIDA, LocalTime.of(8, 10), false); + assertThat(timer.departureTime()).isEqualTo("08:30"); + assertThat(timer.minutesUntilDeparture()).isEqualTo(20); + } + + @Test + void justoALaHoraMuestraCero() { + TimerInfo timer = TodayService.buildTimer(SALIDA, LocalTime.of(8, 30), false); + assertThat(timer.minutesUntilDeparture()).isZero(); + } + + @Test + void pasadaLaHoraDesaparece() { + TimerInfo timer = TodayService.buildTimer(SALIDA, LocalTime.of(10, 0), false); + assertThat(timer.minutesUntilDeparture()).isNull(); + } +}