package services import ( "testing" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" "time" ) func TestParsearFechaAviso(t *testing.T) { casos := []struct { entrada string hora int ok bool }{ {"2026-03-15 09:00", 9, true}, {"2026-03-15T09:00", 9, true}, {"2026-03-15T09:00:00Z", 9, true}, // Fecha sola: se entrega a las 9, no a medianoche — a medianoche // nadie mira el teléfono y el recordatorio se pierde. {"2026-03-15", 9, true}, {"el 15 de marzo", 0, false}, {"", 0, false}, } for _, c := range casos { got, err := ParsearFechaAviso(c.entrada) if c.ok != (err == nil) { t.Errorf("ParsearFechaAviso(%q): err=%v, esperaba ok=%v", c.entrada, err, c.ok) continue } if c.ok && got.Hour() != c.hora { t.Errorf("ParsearFechaAviso(%q) dio hora %d, esperaba %d", c.entrada, got.Hour(), c.hora) } } } // La repetición corre la fecha hacia adelante y, si el servidor estuvo caído, // se saltea los ciclos perdidos en vez de disparar una ráfaga de avisos viejos. func TestSiguienteFechaSalteaCiclosPerdidos(t *testing.T) { viejo := time.Now().AddDate(0, 0, -10) proximo := models.SiguienteFechaAviso(viejo, "diario") for !proximo.After(time.Now()) { proximo = models.SiguienteFechaAviso(proximo, "diario") } if !proximo.After(time.Now()) { t.Fatal("la fecha reprogramada quedó en el pasado") } if proximo.After(time.Now().AddDate(0, 0, 2)) { t.Errorf("saltó demasiado lejos: %v", proximo) } if !models.SiguienteFechaAviso(viejo, "").IsZero() { t.Error("sin repetición no debería haber próxima fecha") } }