feat(store): persist garmin_connected_at, set once on first successful auth
This commit is contained in:
@@ -107,3 +107,44 @@ func TestProfile_DefaultsThenUpdate(t *testing.T) {
|
||||
t.Errorf("TargetBrightenPct after update = %v, want 50", got.TargetBrightenPct)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMarkGarminConnected_SetsTimestampOnceOnFirstCall(t *testing.T) {
|
||||
db := openTestDB(t)
|
||||
ctx := context.Background()
|
||||
userID, err := db.ProvisionUser(ctx, "test-sub", "Test")
|
||||
if err != nil {
|
||||
t.Fatalf("ProvisionUser: %v", err)
|
||||
}
|
||||
|
||||
before, err := db.GetProfile(ctx, userID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetProfile: %v", err)
|
||||
}
|
||||
if before.GarminConnectedAt != nil {
|
||||
t.Fatalf("expected a fresh profile to have nil GarminConnectedAt, got %v", *before.GarminConnectedAt)
|
||||
}
|
||||
|
||||
if err := db.MarkGarminConnected(ctx, userID); err != nil {
|
||||
t.Fatalf("MarkGarminConnected: %v", err)
|
||||
}
|
||||
afterFirst, err := db.GetProfile(ctx, userID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetProfile after first mark: %v", err)
|
||||
}
|
||||
if afterFirst.GarminConnectedAt == nil {
|
||||
t.Fatal("expected GarminConnectedAt to be set after MarkGarminConnected")
|
||||
}
|
||||
firstValue := *afterFirst.GarminConnectedAt
|
||||
|
||||
// A second call must not change the recorded first-connection time.
|
||||
if err := db.MarkGarminConnected(ctx, userID); err != nil {
|
||||
t.Fatalf("MarkGarminConnected (second call): %v", err)
|
||||
}
|
||||
afterSecond, err := db.GetProfile(ctx, userID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetProfile after second mark: %v", err)
|
||||
}
|
||||
if afterSecond.GarminConnectedAt == nil || *afterSecond.GarminConnectedAt != firstValue {
|
||||
t.Fatalf("GarminConnectedAt changed on second call: first=%q second=%v", firstValue, afterSecond.GarminConnectedAt)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user