summaryrefslogtreecommitdiff
path: root/web/server_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'web/server_test.go')
-rw-r--r--web/server_test.go79
1 files changed, 79 insertions, 0 deletions
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, `<progress id="sync-progress-bar"`)
+ assert.Contains(t, body, `text/event-stream`)
+}
+
func TestSyncRedirectsToOAuthWhenUnauthenticated(t *testing.T) {
server, _ := newWebTestServer(t)
form := url.Values{"from": {"2026-08-01"}, "to": {"2026-08-04"}}
@@ -180,6 +204,61 @@ func TestSyncRedirectsToOAuthWhenUnauthenticated(t *testing.T) {
assert.Equal(t, "/sync?from=2026-08-01&to=2026-08-04", location.Query().Get("return_to"))
}
+func TestSyncParsesMultipartDateRange(t *testing.T) {
+ server, _ := newWebTestServer(t)
+ var body bytes.Buffer
+ form := multipart.NewWriter(&body)
+ require.NoError(t, form.WriteField("from", "2026-08-11"))
+ require.NoError(t, form.WriteField("to", "2026-08-01"))
+ require.NoError(t, form.Close())
+
+ req := httptest.NewRequest(http.MethodPost, "/sync", &body)
+ req.Header.Set("Accept", "text/event-stream")
+ req.Header.Set("Content-Type", form.FormDataContentType())
+ response := httptest.NewRecorder()
+
+ server.Handler().ServeHTTP(response, req)
+
+ assert.Equal(t, http.StatusBadRequest, response.Code)
+ assert.Equal(t, "the end date must not be before the start date\n", response.Body.String())
+ assert.NotContains(t, response.Body.String(), "<!doctype html>")
+}
+
+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)