1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
package rides
import (
"database/sql"
"testing"
"time"
"github.com/martinlehoux/kagamigo/kcore"
_ "github.com/mattn/go-sqlite3"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func newTestDB(t *testing.T) *sql.DB {
t.Helper()
db, err := sql.Open("sqlite3", ":memory:")
require.NoError(t, err)
t.Cleanup(func() { db.Close() })
_, err = db.Exec(`
create table rides (
id integer primary key,
external_id text unique not null,
gpx_path text not null,
name text not null,
type text not null,
start_date text not null,
distance_m real not null,
moving_time_s integer not null,
elapsed_time_s integer not null,
total_elevation_gain_m real not null,
average_speed_mps real not null,
created_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
updated_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
)
`)
require.NoError(t, err)
return db
}
func sampleRide() Ride {
return Ride{
ExternalID: "strava:1234",
GPXPath: "rides/activity_1234.gpx",
Name: "Morning Ride",
Type: "Ride",
StartDate: time.Date(2026, 8, 1, 7, 30, 0, 0, time.UTC),
DistanceM: 42_195,
MovingTimeS: 7_200,
ElapsedTimeS: 7_800,
TotalElevationGainM: 850,
AverageSpeedMps: 5.86,
}
}
func TestUpsertAndGet(t *testing.T) {
db := newTestDB(t)
err := Save(db, sampleRide())
require.NoError(t, err)
got, ok, err := GetByExternalID(db, "strava:1234")
require.NoError(t, err)
require.True(t, ok)
assert.Equal(t, "Morning Ride", got.Name)
assert.Equal(t, sampleRide().StartDate, got.StartDate)
assert.Equal(t, 42_195.0, got.DistanceM)
assert.Equal(t, "rides/activity_1234.gpx", got.GPXPath)
_, ok, err = GetByExternalID(db, "strava:9999")
require.NoError(t, err)
assert.False(t, ok)
}
func TestUpsertUpdatesExisting(t *testing.T) {
db := newTestDB(t)
ride := sampleRide()
require.NoError(t, Save(db, ride))
ride.Name = "Renamed Ride"
ride.DistanceM = 50_000
require.NoError(t, Save(db, ride))
got, ok, err := GetByExternalID(db, "strava:1234")
require.NoError(t, err)
require.True(t, ok)
assert.Equal(t, "Renamed Ride", got.Name)
assert.Equal(t, 50_000.0, got.DistanceM)
}
func TestList(t *testing.T) {
db := newTestDB(t)
first := sampleRide()
first.StartDate = time.Date(2026, 7, 1, 7, 0, 0, 0, time.UTC)
second := sampleRide()
second.ExternalID = "strava:5678"
second.Name = "Evening Ride"
require.NoError(t, Save(db, first))
require.NoError(t, Save(db, second))
rides, err := List(db)
require.NoError(t, err)
require.Len(t, rides, 2)
assert.Equal(t, "strava:5678", rides[0].ExternalID)
assert.Equal(t, "strava:1234", rides[1].ExternalID)
kcore.Assert(len(rides) == 2, "two rides")
}
|