aboutsummaryrefslogtreecommitdiff
path: root/rides/rides_test.go
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-08-21 06:56:12 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-08-21 06:56:12 +0200
commit9da52d7355f5a77f0adc9a658619b3bfef03ba3c (patch)
treeb9e5f803d0c9787a84696b9e38b06b6721c9ded3 /rides/rides_test.go
parent13aeedfbb9271444ca42efb45bbe0986ae7610ce (diff)
feat(ride): persist canonical moving time, preserve Strava reference
Diffstat (limited to 'rides/rides_test.go')
-rw-r--r--rides/rides_test.go58
1 files changed, 55 insertions, 3 deletions
diff --git a/rides/rides_test.go b/rides/rides_test.go
index 90998cd..fc8ff0d 100644
--- a/rides/rides_test.go
+++ b/rides/rides_test.go
@@ -29,14 +29,14 @@ func sampleRide(t *testing.T) Ride {
Type: "Ride",
StartDate: time.Date(2026, 8, 1, 7, 30, 0, 0, time.UTC),
DistanceM: 42_195,
- MovingTimeS: 7_200,
+ ExternalMovingTimeS: 7_200,
ElapsedTimeS: 7_800,
TotalElevationGainM: 850,
AverageSpeedMps: 5.86,
}
}
-const testGPX = `<?xml version="1.0"?><gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1"><trk><trkseg><trkpt lat="43.0" lon="5.0"><ele>100</ele></trkpt><trkpt lat="43.001" lon="5.001"><ele>200</ele></trkpt></trkseg></trk></gpx>`
+const testGPX = `<?xml version="1.0"?><gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1"><trk><trkseg><trkpt lat="43.0" lon="5.0"><ele>100</ele><time>2026-08-01T07:30:00Z</time></trkpt><trkpt lat="43.001" lon="5.001"><ele>200</ele><time>2026-08-01T07:31:00Z</time></trkpt></trkseg></trk></gpx>`
func TestUpsertAndGet(t *testing.T) {
db := newTestDB(t)
@@ -93,6 +93,20 @@ func TestSaveComputesCotacol(t *testing.T) {
assert.Equal(t, ride.CotacolAlgorithmVersion, got.CotacolAlgorithmVersion())
}
+func TestSaveComputesMovingTimeAndPreservesExternal(t *testing.T) {
+ db := newTestDB(t)
+ require.NoError(t, Save(db, sampleRide(t)))
+
+ got, ok, err := GetByExternalID(db, "strava:1234")
+ require.NoError(t, err)
+ require.True(t, ok)
+ moving, found := got.MovingTimeS()
+ require.True(t, found)
+ assert.Equal(t, int64(60), moving)
+ assert.Equal(t, ride.MovingTimeAlgorithmVersion, got.MovingTimeAlgorithmVersion())
+ assert.Equal(t, int64(7_200), got.ExternalMovingTimeS)
+}
+
func TestSaveAllowsRideWithoutGPX(t *testing.T) {
db := newTestDB(t)
indoor := sampleRide(t)
@@ -108,6 +122,44 @@ func TestSaveAllowsRideWithoutGPX(t *testing.T) {
_, ready := got.CotacolScore()
assert.False(t, ready)
assert.Empty(t, got.CotacolAlgorithmVersion())
+ _, ready = got.MovingTimeS()
+ assert.False(t, ready)
+ assert.Empty(t, got.MovingTimeAlgorithmVersion())
+}
+
+func TestEffectiveMovingTimePrefersCanonical(t *testing.T) {
+ db := newTestDB(t)
+ require.NoError(t, Save(db, sampleRide(t)))
+ got, ok, err := GetByExternalID(db, "strava:1234")
+ require.NoError(t, err)
+ require.True(t, ok)
+ assert.Equal(t, int64(60), got.EffectiveMovingTimeS())
+
+ _, err = db.Exec("UPDATE rides SET moving_time_algo_version = 'old' WHERE external_id = ?", got.ExternalID)
+ require.NoError(t, err)
+ got, ok, err = GetByExternalID(db, "strava:1234")
+ require.NoError(t, err)
+ require.True(t, ok)
+ assert.Equal(t, int64(7_200), got.EffectiveMovingTimeS())
+}
+
+func TestListSortedByMovingTimeUsesCanonicalWithExternalFallback(t *testing.T) {
+ db := newTestDB(t)
+ first := sampleRide(t)
+ first.ExternalID = "strava:550e8400-e29b-41d4-a716-446655440000"
+ second := sampleRide(t)
+ second.ExternalID = "strava:6ba7b810-9dad-41d1-80b4-00c04fd430c8"
+ require.NoError(t, Save(db, first))
+ require.NoError(t, Save(db, second))
+ _, err := db.Exec("UPDATE rides SET external_moving_time_s = 1000, moving_time_s = 500 WHERE external_id = ?", first.ExternalID)
+ require.NoError(t, err)
+ _, err = db.Exec("UPDATE rides SET external_moving_time_s = 300, moving_time_s = 500, moving_time_algo_version = 'old' WHERE external_id = ?", second.ExternalID)
+ require.NoError(t, err)
+
+ items, err := ListSorted(db, SortMovingTime, false)
+ require.NoError(t, err)
+ assert.Equal(t, second.ExternalID, items[0].ExternalID)
+ assert.Equal(t, first.ExternalID, items[1].ExternalID)
}
func TestBackfill(t *testing.T) {
@@ -132,7 +184,7 @@ func TestBackfill(t *testing.T) {
func TestBackfillSkipsInvalidRide(t *testing.T) {
db := newTestDB(t)
_, err := db.Exec(`
- INSERT INTO rides (external_id, gpx_path, name, type, start_date, distance_m, moving_time_s, elapsed_time_s, total_elevation_gain_m, average_speed_mps)
+ INSERT INTO rides (external_id, gpx_path, name, type, start_date, distance_m, external_moving_time_s, elapsed_time_s, total_elevation_gain_m, average_speed_mps)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`, "strava:550e8400-e29b-41d4-a716-446655440000", "missing.gpx", "Broken Ride", "Ride", "2026-08-01T07:00:00Z", 20_000, 0, 0, 0, 0)
require.NoError(t, err)