Add Profile table to store Garmin credentials and engine configuration parameters. Implements GetProfile() and UpdateProfile() store methods with comprehensive test coverage. The profile singleton row is automatically initialized on migration and persists all configuration state. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
)
|
|
|
|
func TestProfile_DefaultsThenUpdate(t *testing.T) {
|
|
db := openTestDB(t)
|
|
ctx := context.Background()
|
|
|
|
p, err := db.GetProfile(ctx)
|
|
if err != nil {
|
|
t.Fatalf("GetProfile: %v", err)
|
|
}
|
|
if p.RollingWindowDays != 90 {
|
|
t.Errorf("RollingWindowDays = %d, want 90 (migration default)", p.RollingWindowDays)
|
|
}
|
|
if p.HRZone1MinPct != 50 || p.HRZone5MaxPct != 100 {
|
|
t.Errorf("zone defaults = %+v, want Z1 min=50, Z5 max=100", p)
|
|
}
|
|
|
|
maxHR, restingHR := 190.0, 50.0
|
|
p.GarminEmail = "runner@example.com"
|
|
p.GarminPassword = "hunter2"
|
|
p.RollingWindowDays = 120
|
|
p.MaxHeartRate = &maxHR
|
|
p.RestingHeartRate = &restingHR
|
|
p.IntervalWarmupMinutes = 8
|
|
|
|
if err := db.UpdateProfile(ctx, p); err != nil {
|
|
t.Fatalf("UpdateProfile: %v", err)
|
|
}
|
|
|
|
got, err := db.GetProfile(ctx)
|
|
if err != nil {
|
|
t.Fatalf("GetProfile after update: %v", err)
|
|
}
|
|
if got.GarminEmail != "runner@example.com" || got.RollingWindowDays != 120 {
|
|
t.Errorf("got = %+v, want updated email/window", got)
|
|
}
|
|
if got.MaxHeartRate == nil || *got.MaxHeartRate != 190 {
|
|
t.Errorf("MaxHeartRate = %v, want 190", got.MaxHeartRate)
|
|
}
|
|
if got.IntervalWarmupMinutes != 8 {
|
|
t.Errorf("IntervalWarmupMinutes = %v, want 8", got.IntervalWarmupMinutes)
|
|
}
|
|
}
|