diff --git a/rowers/tests/test_api.py b/rowers/tests/test_api.py index 1187265e..6f32ba8d 100644 --- a/rowers/tests/test_api.py +++ b/rowers/tests/test_api.py @@ -44,7 +44,6 @@ class OwnApi(TestCase): self.password = faker.word() self.u.set_password(self.password) self.u.save() - self.factory = APIRequestFactory() @@ -210,6 +209,43 @@ class OwnApi(TestCase): response = strokedata_tcx(request) self.assertEqual(response.status_code,200) + def test_strokedataform_rowingdata(self): + + url = reverse('strokedata_rowingdata') + + filename = 'rowers/tests/testdata/testdata.csv' + f = open(filename, 'rb') + + # Use Basic Auth header (alternative if using a custom view) + credentials = f"{self.u.username}:{self.password}" + base64_credentials = base64.b64encode(credentials.encode()).decode() + + # Use Basic Auth header + headers = { + "HTTP_AUTHORIZATION": f"Basic {base64_credentials}" + } + + form_data = { + "workouttype": "rower", + "boattype": "1x", + "notes": "A test file upload", + } + + # Send POST request + response = self.client.post( + url, + {"file": f, **form_data}, + format="multipart", # Ensure multipart/form-data is used + **headers, # Optional if login doesn't suffice + ) + + f.close() + + # Assertions + self.assertEqual(response.status_code, 201) + + + def test_strokedataform_empty(self): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index ee6427eb..7e8d8029 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/views/apiviews.py b/rowers/views/apiviews.py index a3b0114d..9008a763 100644 --- a/rowers/views/apiviews.py +++ b/rowers/views/apiviews.py @@ -434,40 +434,43 @@ def strokedata_rowingdata(request): if r.rowerplan == 'freecoach': return HttpResponseNotAllowed("This endpoint is for users, not for free coach accounts") - if request.method == 'POST': - form = DocumentsForm(request.POST, request.FILES) - if not form.is_valid(): - return HttpResponseBadRequest(json.dumps(form.errors)) + if request.method != 'POST': + return HttpResponseNotAllowed("Method not supported") # pragma: no cover + + form = DocumentsForm(request.POST, request.FILES) + if not form.is_valid(): + return HttpResponseBadRequest(json.dumps(form.errors)) - f = form.cleaned_data['file'] - if f is None: - return HttpResponseBadRequest("Missing file") + f = form.cleaned_data['file'] + if f is None: + return HttpResponseBadRequest("Missing file") - filename, completefilename = handle_uploaded_file(f) + filename, completefilename = handle_uploaded_file(f) + + uploadoptions = { + 'secret': settings.UPLOAD_SERVICE_SECRET, + 'user': r.user.id, + 'file': completefilename, + 'workouttype': form.cleaned_data['workouttype'], + 'boattype': form.cleaned_data['boattype'], + 'title': form.cleaned_data['title'], + 'rpe': form.cleaned_data['rpe'], + 'notes': form.cleaned_data['notes'] + } - uploadoptions = { - 'secret': settings.UPLOAD_SERVICE_SECRET, - 'user': r.user.id, - 'file': completefilename, - 'workouttype': form.cleaned_data['workouttype'], - 'boattype': form.cleaned_data['boattype'], - 'title': form.cleaned_data['title'], - 'rpe': form.cleaned_data['rpe'], - 'notes': form.cleaned_data['notes'] + url = settings.UPLOAD_SERVICE_URL + + _ = myqueue(queuehigh, + handle_request_post, + url, + uploadoptions) + response = JsonResponse( + { + "status": "success", } - - url = settings.UPLOAD_SERVICE_URL - - _ = myqueue(queuehigh, - handle_request_post, - url, - uploadoptions) - - return JsonResponse( - { - "status": "success", - } - ) + ) + response.status_code = 201 + return response @csrf_exempt