diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-09-06 12:38:16 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-09-06 12:38:16 +0200 |
| commit | 8e0c55230ef59869bda1ca19ca8697b447d57698 (patch) | |
| tree | 2d5941e95949c43a84326cc5d10db8e4fab72a64 /web/server_test.go | |
| parent | 28a7c9f281c16d1928b37dd1afdfe8399b7a03f8 (diff) | |
Preview: analyze a raw GPX or FIT file without persisting it
Diffstat (limited to 'web/server_test.go')
| -rw-r--r-- | web/server_test.go | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/web/server_test.go b/web/server_test.go index a07b7d9..e90f69a 100644 --- a/web/server_test.go +++ b/web/server_test.go @@ -917,3 +917,107 @@ func TestHandlerSortsRidesByCotacol(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) assert.Less(t, strings.Index(body, "Low Cotacol"), strings.Index(body, "High Cotacol")) } + +func previewUploadRequest(t *testing.T, filename string, content []byte) *http.Request { + t.Helper() + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + part, err := writer.CreateFormFile("file", filename) + require.NoError(t, err) + _, err = part.Write(content) + require.NoError(t, err) + require.NoError(t, writer.Close()) + request := httptest.NewRequest(http.MethodPost, "/preview", body) + request.Header.Set("Content-Type", writer.FormDataContentType()) + return request +} + +func TestPreviewPageRendersUploadForm(t *testing.T) { + server, _ := newWebTestServer(t) + request := httptest.NewRequest(http.MethodGet, "/preview", nil) + response := httptest.NewRecorder() + server.Handler().ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) + assert.Contains(t, response.Body.String(), "Preview a ride file") + assert.Contains(t, response.Body.String(), `type="file"`) +} + +func TestPreviewParsesGPXWithoutPersisting(t *testing.T) { + server, db := newWebTestServer(t) + request := previewUploadRequest(t, "morning-ride.gpx", []byte(officialClimbTrackGPX)) + response := httptest.NewRecorder() + server.Handler().ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) + body := response.Body.String() + assert.Contains(t, body, "ride-route") + assert.Contains(t, body, "ride-profile") + assert.Contains(t, body, "data-official-climb-form") + assert.NotContains(t, body, "Curation") + var count int + require.NoError(t, db.QueryRow("SELECT COUNT(*) FROM rides").Scan(&count)) + assert.Equal(t, 0, count, "preview must not persist the ride") +} + +func TestPreviewShowsInlineErrorForUnsupportedFile(t *testing.T) { + server, _ := newWebTestServer(t) + request := previewUploadRequest(t, "notes.txt", []byte("not a ride")) + response := httptest.NewRecorder() + server.Handler().ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) + assert.Contains(t, response.Body.String(), "unsupported file type") +} + +func TestPreviewShowsInlineErrorForInvalidRideFile(t *testing.T) { + server, _ := newWebTestServer(t) + request := previewUploadRequest(t, "broken.gpx", []byte("not xml")) + response := httptest.NewRecorder() + server.Handler().ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) + assert.Contains(t, response.Body.String(), "The file could not be parsed") +} + +func TestPreviewCreatesOfficialClimbWithoutPersistingRide(t *testing.T) { + server, db := newWebTestServer(t) + form := url.Values{ + "name": {"Col du Preview"}, + "start_index": {"0"}, + "end_index": {"2"}, + "start_lat": {"43.0"}, + "start_lon": {"5.0"}, + "end_lat": {"43.01"}, + "end_lon": {"5.01"}, + } + request := httptest.NewRequest(http.MethodPost, "/preview/official-climbs", strings.NewReader(form.Encode())) + request.Header.Set("Content-Type", "application/x-www-form-urlencoded") + response := httptest.NewRecorder() + server.Handler().ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) + climbs, err := official_climb.List(db) + require.NoError(t, err) + require.Len(t, climbs, 1) + assert.Equal(t, "Col du Preview", climbs[0].Name) + var count int + require.NoError(t, db.QueryRow("SELECT COUNT(*) FROM rides").Scan(&count)) + assert.Equal(t, 0, count, "preview climb creation must not persist a ride") +} + +func TestPreviewOfficialClimbRejectsUnorderedBoundaries(t *testing.T) { + server, db := newWebTestServer(t) + form := url.Values{ + "name": {"Col du Chaos"}, + "start_index": {"5"}, + "end_index": {"2"}, + "start_lat": {"43.0"}, + "start_lon": {"5.0"}, + "end_lat": {"43.01"}, + "end_lon": {"5.01"}, + } + request := httptest.NewRequest(http.MethodPost, "/preview/official-climbs", strings.NewReader(form.Encode())) + request.Header.Set("Content-Type", "application/x-www-form-urlencoded") + response := httptest.NewRecorder() + server.Handler().ServeHTTP(response, request) + assert.Equal(t, http.StatusBadRequest, response.Code) + climbs, err := official_climb.List(db) + require.NoError(t, err) + assert.Empty(t, climbs) +} |
