Enhance smoking tracking features with AI next smoke time suggestions
- 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.
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user