diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-08-28 22:38:57 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-08-28 22:38:57 +0200 |
| commit | 827b55f610119d553b965ceb4d3631f0481bbb3b (patch) | |
| tree | df00788440edc234c9d15adc9e49100704675130 /web/server_test.go | |
| parent | ff57ebcbe4949b7b53e7c42ecc7916b601a67213 (diff) | |
Rename rides.type to external_sport_type, infer bike type from Strava sport type and display categories in UI
Diffstat (limited to 'web/server_test.go')
| -rw-r--r-- | web/server_test.go | 242 |
1 files changed, 121 insertions, 121 deletions
diff --git a/web/server_test.go b/web/server_test.go index d75628d..2e9a332 100644 --- a/web/server_test.go +++ b/web/server_test.go @@ -89,24 +89,24 @@ const officialClimbTrackGPX = `<?xml version="1.0"?><gpx xmlns="http://www.topog func TestHandlerRendersRidesPage(t *testing.T) { server, db := newWebTestServer(t) require.NoError(t, ride.Save(db, ride.StoredRide{ - ExternalID: "strava:1234", - GPXPath: testGPXPath(t, "long.gpx"), - Name: "Long Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 20_000, + ExternalID: "strava:1234", + GPXPath: testGPXPath(t, "long.gpx"), + Name: "Long Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 20_000, })) require.NoError(t, ride.Save(db, ride.StoredRide{ - ExternalID: "strava:5678", - GPXPath: testGPXPath(t, "short.gpx"), - Name: "Short Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), - DistanceM: 9_999, + ExternalID: "strava:5678", + GPXPath: testGPXPath(t, "short.gpx"), + Name: "Short Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), + DistanceM: 9_999, })) req := httptest.NewRequest(http.MethodGet, "/", nil) response := httptest.NewRecorder() @@ -126,14 +126,14 @@ func TestHandlerRendersRidesPage(t *testing.T) { func TestHandlerRendersRideDetailWithEmbeddedRoute(t *testing.T) { server, db := newWebTestServer(t) require.NoError(t, ride.Save(db, ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", - GPXPath: testGPXPath(t, "detail.gpx"), - Name: "Detailed Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 20_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", + GPXPath: testGPXPath(t, "detail.gpx"), + Name: "Detailed Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 20_000, })) _, err := db.Exec(` INSERT INTO mountain_passes (osm_id, name, elevation, latitude, longitude) @@ -275,14 +275,14 @@ func TestHandlerCreatesOfficialClimbFromRoutePoints(t *testing.T) { routePath := filepath.Join(t.TempDir(), "official-climb.gpx") require.NoError(t, os.WriteFile(routePath, []byte(officialClimbTrackGPX), 0o600)) require.NoError(t, ride.Save(db, ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", - GPXPath: routePath, - Name: "Climb Candidate", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 2_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", + GPXPath: routePath, + Name: "Climb Candidate", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 2_000, })) item, found, err := ride.GetByExternalID(db, "strava:550e8400-e29b-41d4-a716-446655440000") require.NoError(t, err) @@ -334,13 +334,13 @@ func TestHandlerCreatesOfficialClimbFromRoutePoints(t *testing.T) { func TestHandlerRendersRideDetailWithoutRoute(t *testing.T) { server, db := newWebTestServer(t) item := ride.StoredRide{ - ExternalID: "strava:14701658670", - Name: "Indoor Ride", - Type: "VirtualRide", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 20_000, + ExternalID: "strava:14701658670", + Name: "Indoor Ride", + ExternalSportType: "VirtualRide", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 20_000, } require.NoError(t, ride.Save(db, item)) stored, found, err := ride.GetByExternalID(db, item.ExternalID) @@ -361,22 +361,22 @@ func TestHandlerRendersRideDetailWithoutRoute(t *testing.T) { func TestHandlerRendersAnalyticsChart(t *testing.T) { server, db := newWebTestServer(t) first := ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440001", - Name: "Fastish Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 40_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440001", + Name: "Fastish Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 40_000, } second := ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440002", - Name: "Climbing Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), - DistanceM: 40_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440002", + Name: "Climbing Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), + DistanceM: 40_000, } require.NoError(t, ride.Save(db, first)) require.NoError(t, ride.Save(db, second)) @@ -407,22 +407,22 @@ func TestHandlerRendersAnalyticsChart(t *testing.T) { func TestHandlerFiltersAnalyticsByDistance(t *testing.T) { server, db := newWebTestServer(t) short := ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440003", - Name: "Short Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 40_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440003", + Name: "Short Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 40_000, } long := ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440004", - Name: "Long Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), - DistanceM: 100_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440004", + Name: "Long Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), + DistanceM: 100_000, } require.NoError(t, ride.Save(db, short)) require.NoError(t, ride.Save(db, long)) @@ -462,7 +462,7 @@ func TestHandlerReturnsNotFoundForUnknownRide(t *testing.T) { func TestHandlerShowsErrorForUnavailableRideRoute(t *testing.T) { server, db := newWebTestServer(t) _, err := db.Exec(` - 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) + INSERT INTO rides (external_id, gpx_path, name, external_sport_type, start_date, distance_m, external_moving_time_s, elapsed_time_s, total_elevation_gain_m, average_speed_mps) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `, "strava:6ba7b810-9dad-41d1-80b4-00c04fd430c8", "missing.gpx", "Unavailable Route", "Ride", "2026-08-01T07:00:00Z", 20_000, 0, 0, 0, 0) require.NoError(t, err) @@ -634,12 +634,12 @@ func TestSyncRidesResyncsTitleFromList(t *testing.T) { startDate := time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC) gpxPath := testGPXPath(t, "existing.gpx") require.NoError(t, ride.Save(db, ride.StoredRide{ - ExternalID: "strava:789", - GPXPath: gpxPath, - Name: "Old Title", - Type: "Ride", - StartDate: startDate, - DistanceM: 20_000, + ExternalID: "strava:789", + GPXPath: gpxPath, + Name: "Old Title", + ExternalSportType: "Ride", + StartDate: startDate, + DistanceM: 20_000, })) // Verify the title was corrected on Strava (ride #789). client := fakeSyncClient{ @@ -666,12 +666,12 @@ func TestSyncRidesSkipsWhenTitleUnchanged(t *testing.T) { server, db := newWebTestServer(t) startDate := time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC) require.NoError(t, ride.Save(db, ride.StoredRide{ - ExternalID: "strava:789", - GPXPath: testGPXPath(t, "existing2.gpx"), - Name: "Same Title", - Type: "Ride", - StartDate: startDate, - DistanceM: 20_000, + ExternalID: "strava:789", + GPXPath: testGPXPath(t, "existing2.gpx"), + Name: "Same Title", + ExternalSportType: "Ride", + StartDate: startDate, + DistanceM: 20_000, })) client := fakeSyncClient{ activities: []strava.Activity{ @@ -805,14 +805,14 @@ func TestRideSortHeadersToggleDirection(t *testing.T) { func TestBuildRideViewsUsesStoredCotacol(t *testing.T) { _, db := newWebTestServer(t) stored := ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", - GPXPath: testGPXPath(t, "stored.gpx"), - Name: "Stored Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 20_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", + GPXPath: testGPXPath(t, "stored.gpx"), + Name: "Stored Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 20_000, } require.NoError(t, ride.Save(db, stored)) _, err := db.Exec("UPDATE rides SET gpx_path = ? WHERE external_id = ?", "missing.gpx", stored.ExternalID) @@ -831,7 +831,7 @@ func TestBuildRideViewMovingTimePrefersCanonical(t *testing.T) { ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", GPXPath: testGPXPath(t, "moving.gpx"), Name: "Moving Ride", - Type: "Ride", + ExternalSportType: "Ride", StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), DistanceM: 20_000, ExternalMovingTimeS: 7_200, @@ -847,24 +847,24 @@ func TestBuildRideViewMovingTimePrefersCanonical(t *testing.T) { func TestHandlerSortsRidesByDistance(t *testing.T) { server, db := newWebTestServer(t) require.NoError(t, ride.Save(db, ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", - GPXPath: testGPXPath(t, "near.gpx"), - Name: "Near Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 20_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", + GPXPath: testGPXPath(t, "near.gpx"), + Name: "Near Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 20_000, })) require.NoError(t, ride.Save(db, ride.StoredRide{ - ExternalID: "strava:6ba7b810-9dad-41d1-80b4-00c04fd430c8", - GPXPath: testGPXPath(t, "far.gpx"), - Name: "Far Ride", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), - DistanceM: 40_000, + ExternalID: "strava:6ba7b810-9dad-41d1-80b4-00c04fd430c8", + GPXPath: testGPXPath(t, "far.gpx"), + Name: "Far Ride", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), + DistanceM: 40_000, })) req := httptest.NewRequest(http.MethodGet, "/?sort=distance&dir=asc", nil) @@ -880,24 +880,24 @@ func TestHandlerSortsRidesByDistance(t *testing.T) { func TestHandlerSortsRidesByCotacol(t *testing.T) { server, db := newWebTestServer(t) first := ride.StoredRide{ - ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", - GPXPath: testGPXPath(t, "first.gpx"), - Name: "Low Cotacol", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), - DistanceM: 20_000, + ExternalID: "strava:550e8400-e29b-41d4-a716-446655440000", + GPXPath: testGPXPath(t, "first.gpx"), + Name: "Low Cotacol", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 1, 7, 0, 0, 0, time.UTC), + DistanceM: 20_000, } second := ride.StoredRide{ - ExternalID: "strava:6ba7b810-9dad-41d1-80b4-00c04fd430c8", - GPXPath: testGPXPath(t, "second.gpx"), - Name: "High Cotacol", - Type: "Ride", - BikeType: ride.BikeTypeRoad, - RideType: ride.RideTypeTraining, - StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), - DistanceM: 40_000, + ExternalID: "strava:6ba7b810-9dad-41d1-80b4-00c04fd430c8", + GPXPath: testGPXPath(t, "second.gpx"), + Name: "High Cotacol", + ExternalSportType: "Ride", + BikeType: ride.BikeTypeRoad, + RideType: ride.RideTypeTraining, + StartDate: time.Date(2026, 8, 2, 7, 0, 0, 0, time.UTC), + DistanceM: 40_000, } require.NoError(t, ride.Save(db, first)) require.NoError(t, ride.Save(db, second)) |
