6cf7eb2294
- Added new API endpoint `GET /api/v1/smoke/next_smoke_time` to provide AI-generated suggestions for the next smoking time based on user data. - Introduced a new database table `fa_smoke_ai_next_smoke` to store structured AI time node suggestions. - Updated smoke handler and service to integrate the new AI next smoke time functionality. - Enhanced documentation to reflect the new API endpoint and its usage, including details on how to generate AI time nodes.
84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package service
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestIsInSleepWindow(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// wake=07:30, sleep=23:30 => sleep: [23:30, 07:30)
|
|
wake := 7*60 + 30
|
|
sleep := 23*60 + 30
|
|
|
|
if !isInSleepWindow(0, wake, sleep) {
|
|
t.Fatalf("expected 00:00 to be in sleep window")
|
|
}
|
|
if isInSleepWindow(8*60, wake, sleep) {
|
|
t.Fatalf("expected 08:00 to be awake")
|
|
}
|
|
if !isInSleepWindow(23*60+45, wake, sleep) {
|
|
t.Fatalf("expected 23:45 to be in sleep window")
|
|
}
|
|
|
|
// wake=18:00, sleep=02:00 => sleep: [02:00, 18:00)
|
|
wake = 18 * 60
|
|
sleep = 2 * 60
|
|
if isInSleepWindow(1*60, wake, sleep) {
|
|
t.Fatalf("expected 01:00 to be awake (awake window crosses midnight)")
|
|
}
|
|
if !isInSleepWindow(10*60, wake, sleep) {
|
|
t.Fatalf("expected 10:00 to be in sleep window")
|
|
}
|
|
}
|
|
|
|
func TestAdjustToWakeIfInSleep(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
loc := time.Local
|
|
// wake=07:30, sleep=23:30
|
|
wake := "07:30"
|
|
sleep := "23:30"
|
|
|
|
// 02:00 should adjust to same-day 07:30
|
|
in := time.Date(2026, 1, 2, 2, 0, 0, 0, loc)
|
|
out, adjusted, err := adjustToWakeIfInSleep(in, wake, sleep)
|
|
if err != nil {
|
|
t.Fatalf("adjustToWakeIfInSleep: %v", err)
|
|
}
|
|
if !adjusted {
|
|
t.Fatalf("expected adjustment")
|
|
}
|
|
if out.Hour() != 7 || out.Minute() != 30 {
|
|
t.Fatalf("expected 07:30, got %02d:%02d", out.Hour(), out.Minute())
|
|
}
|
|
|
|
// 10:00 should not adjust
|
|
in = time.Date(2026, 1, 2, 10, 0, 0, 0, loc)
|
|
out, adjusted, err = adjustToWakeIfInSleep(in, wake, sleep)
|
|
if err != nil {
|
|
t.Fatalf("adjustToWakeIfInSleep: %v", err)
|
|
}
|
|
if adjusted {
|
|
t.Fatalf("expected no adjustment")
|
|
}
|
|
if !out.Equal(in) {
|
|
t.Fatalf("expected unchanged time")
|
|
}
|
|
|
|
// 23:45 should adjust to next-day 07:30
|
|
in = time.Date(2026, 1, 2, 23, 45, 0, 0, loc)
|
|
out, adjusted, err = adjustToWakeIfInSleep(in, wake, sleep)
|
|
if err != nil {
|
|
t.Fatalf("adjustToWakeIfInSleep: %v", err)
|
|
}
|
|
if !adjusted {
|
|
t.Fatalf("expected adjustment")
|
|
}
|
|
if out.Day() != 3 || out.Hour() != 7 || out.Minute() != 30 {
|
|
t.Fatalf("expected next day 07:30, got %s", out.Format(time.RFC3339))
|
|
}
|
|
}
|
|
|