aboutsummaryrefslogtreecommitdiff
path: root/web/server_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'web/server_test.go')
-rw-r--r--web/server_test.go104
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)
+}