From 1da94931188c35c06dd032aadce2799fc13db1dd Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Tue, 11 Aug 2026 13:59:08 +0200 Subject: feat: Add Strava import progress --- web/server_test.go | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'web/server_test.go') diff --git a/web/server_test.go b/web/server_test.go index cf8460c..32ab448 100644 --- a/web/server_test.go +++ b/web/server_test.go @@ -1,8 +1,10 @@ package web import ( + "bytes" "database/sql" "fmt" + "mime/multipart" "net/http" "net/http/httptest" "net/url" @@ -164,6 +166,28 @@ func TestSyncPageRequestsAuthorization(t *testing.T) { assert.Contains(t, response.Body.String(), "Authorize Strava") } +func TestSyncPageIncludesProgressUIWhenAuthorized(t *testing.T) { + server, _ := newWebTestServer(t) + appConfig, err := config.Load(server.configPath) + require.NoError(t, err) + appConfig.Strava.AccessToken = "access" + appConfig.Strava.RefreshToken = "refresh" + appConfig.Strava.ExpiresAt = time.Now().Add(time.Hour).Unix() + require.NoError(t, config.Save(server.configPath, appConfig)) + + req := httptest.NewRequest(http.MethodGet, "/sync", nil) + response := httptest.NewRecorder() + + server.Handler().ServeHTTP(response, req) + + body := response.Body.String() + assert.Equal(t, http.StatusOK, response.Code) + assert.Contains(t, body, `id="sync-form"`) + assert.Contains(t, body, `id="sync-progress"`) + assert.Contains(t, body, `") +} + +func TestSyncRejectsConcurrentImport(t *testing.T) { + server, _ := newWebTestServer(t) + appConfig, err := config.Load(server.configPath) + require.NoError(t, err) + appConfig.Strava.AccessToken = "access" + appConfig.Strava.RefreshToken = "refresh" + appConfig.Strava.ExpiresAt = time.Now().Add(time.Hour).Unix() + require.NoError(t, config.Save(server.configPath, appConfig)) + require.True(t, server.beginSync()) + defer server.endSync() + + form := url.Values{"from": {"2026-08-01"}, "to": {"2026-08-04"}} + req := httptest.NewRequest(http.MethodPost, "/sync", strings.NewReader(form.Encode())) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + response := httptest.NewRecorder() + + server.Handler().ServeHTTP(response, req) + + assert.Equal(t, http.StatusConflict, response.Code) + assert.Contains(t, response.Body.String(), "already in progress") +} + +func TestWriteSyncEvent(t *testing.T) { + response := httptest.NewRecorder() + progress := SyncProgress{Total: 2, Completed: 1, Imported: 1} + + require.NoError(t, writeSyncEvent(response, response, "progress", progress)) + require.NoError(t, writeSyncEvent(response, response, "complete", progress)) + + body := response.Body.String() + assert.Contains(t, body, "event: progress\ndata: {\"total\":2,\"completed\":1,\"imported\":1,\"skipped\":0}\n\n") + assert.Contains(t, body, "event: complete\ndata: {\"total\":2,\"completed\":1,\"imported\":1,\"skipped\":0}\n\n") + assert.Less(t, strings.Index(body, "event: progress"), strings.Index(body, "event: complete")) +} + func TestStravaLoginRedirectsToAuthorize(t *testing.T) { server, _ := newWebTestServer(t) req := httptest.NewRequest(http.MethodGet, "/strava/login?return_to=/sync", nil) -- cgit v1.2.3