Part of per-user profile isolation: profile rows are no longer a global singleton, so every read/write requires the caller's userID. This also requires scoping ListActivities, ListWorkoutKinds, UpsertActivity, CreateWorkoutKind, GetSyncState, UpdateSyncState, and ResetAllSyncedData to userID, plus updating all related tests in the store package.
110 lines
3.6 KiB
Go
110 lines
3.6 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
)
|
|
|
|
func TestProfile_DefaultsThenUpdate(t *testing.T) {
|
|
db := openTestDB(t)
|
|
ctx := context.Background()
|
|
userID, err := db.ProvisionUser(ctx, "test-sub", "Default")
|
|
if err != nil {
|
|
t.Fatalf("ProvisionUser: %v", err)
|
|
}
|
|
|
|
p, err := db.GetProfile(ctx, userID)
|
|
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)
|
|
}
|
|
if p.WarmupMinutes != 10 || p.CooldownMinutes != 5 {
|
|
t.Errorf("phase-minute defaults = %+v, want warmup=10, cooldown=5", p)
|
|
}
|
|
if p.BackfillHorizonDays != 1095 {
|
|
t.Errorf("BackfillHorizonDays = %d, want 1095 (migration default)", p.BackfillHorizonDays)
|
|
}
|
|
if p.MinRepresentativePaceSecPerKm != 720 || p.MinRepresentativeTimeSeconds != 3 {
|
|
t.Errorf("pace artifact filter defaults = %+v, want pace=720, time=3", p)
|
|
}
|
|
if p.Name != "Default" {
|
|
t.Errorf("Name = %q, want %q (migration default)", p.Name, "Default")
|
|
}
|
|
if p.PaceColor != "#3b82f6" || p.HeartRateColor != "#ef4444" {
|
|
t.Errorf("main line color defaults = %+v, want pace=#3b82f6, heartRate=#ef4444", p)
|
|
}
|
|
if p.WarmupColor != "#c2410c" || p.EffortColor != "#7c3aed" || p.RecoveryColor != "#15803d" || p.CooldownColor != "#fb923c" {
|
|
t.Errorf("effort color defaults = %+v", p)
|
|
}
|
|
if p.MainLineTintPct != 20 {
|
|
t.Errorf("MainLineTintPct = %v, want 20 (migration default)", p.MainLineTintPct)
|
|
}
|
|
if p.BackgroundDarkenPct != 35 {
|
|
t.Errorf("BackgroundDarkenPct = %v, want 35 (migration default)", p.BackgroundDarkenPct)
|
|
}
|
|
if p.TargetBrightenPct != 20 {
|
|
t.Errorf("TargetBrightenPct = %v, want 20 (migration default)", p.TargetBrightenPct)
|
|
}
|
|
|
|
maxHR, restingHR := 190.0, 50.0
|
|
p.Name = "Kriss"
|
|
p.PaceColor = "#111111"
|
|
p.EffortColor = "#222222"
|
|
p.MainLineTintPct = 45
|
|
p.BackgroundDarkenPct = 60
|
|
p.TargetBrightenPct = 50
|
|
p.GarminEmail = "runner@example.com"
|
|
p.GarminPassword = "hunter2"
|
|
p.RollingWindowDays = 120
|
|
p.MaxHeartRate = &maxHR
|
|
p.RestingHeartRate = &restingHR
|
|
p.WarmupMinutes = 8
|
|
p.BackfillHorizonDays = 14
|
|
p.MinRepresentativePaceSecPerKm = 600
|
|
p.MinRepresentativeTimeSeconds = 5
|
|
|
|
if err := db.UpdateProfile(ctx, userID, p); err != nil {
|
|
t.Fatalf("UpdateProfile: %v", err)
|
|
}
|
|
|
|
got, err := db.GetProfile(ctx, userID)
|
|
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.Name != "Kriss" {
|
|
t.Errorf("Name = %q, want %q after update", got.Name, "Kriss")
|
|
}
|
|
if got.MaxHeartRate == nil || *got.MaxHeartRate != 190 {
|
|
t.Errorf("MaxHeartRate = %v, want 190", got.MaxHeartRate)
|
|
}
|
|
if got.WarmupMinutes != 8 {
|
|
t.Errorf("WarmupMinutes = %v, want 8", got.WarmupMinutes)
|
|
}
|
|
if got.BackfillHorizonDays != 14 {
|
|
t.Errorf("BackfillHorizonDays = %v, want 14", got.BackfillHorizonDays)
|
|
}
|
|
if got.MinRepresentativePaceSecPerKm != 600 || got.MinRepresentativeTimeSeconds != 5 {
|
|
t.Errorf("pace artifact filter after update = %+v, want pace=600, time=5", got)
|
|
}
|
|
if got.PaceColor != "#111111" || got.EffortColor != "#222222" {
|
|
t.Errorf("chart colors after update = %+v, want pace=#111111, effort=#222222", got)
|
|
}
|
|
if got.MainLineTintPct != 45 {
|
|
t.Errorf("MainLineTintPct after update = %v, want 45", got.MainLineTintPct)
|
|
}
|
|
if got.BackgroundDarkenPct != 60 {
|
|
t.Errorf("BackgroundDarkenPct after update = %v, want 60", got.BackgroundDarkenPct)
|
|
}
|
|
if got.TargetBrightenPct != 50 {
|
|
t.Errorf("TargetBrightenPct after update = %v, want 50", got.TargetBrightenPct)
|
|
}
|
|
}
|