diff --git a/rowers/tests/test_aworkouts.py b/rowers/tests/test_aworkouts.py index 9228e781..d5254fde 100644 --- a/rowers/tests/test_aworkouts.py +++ b/rowers/tests/test_aworkouts.py @@ -308,6 +308,27 @@ class WorkoutViewTest(TestCase): response = self.c.get(url,follow=True) self.assertEqual(response.status_code,200) + url = reverse('workout_erase_column_view',kwargs={'id':encoder.encode_hex(self.wwater.id),'column':'hr'}) + expected_url = reverse('workout_data_view',kwargs={'id':encoder.encode_hex(self.wwater.id)}) + + response = self.c.get(url,follow=True) + self.assertEqual(response.status_code,200) + + form_data = {} + response = self.c.post(url,form_data,follow=True) + self.assertRedirects(response,expected_url=expected_url,status_code=302,target_status_code=200) + + url = expected_url + form_data = { + 'cols':['driveenergy','spm'] + } + form = DataFrameColumnsForm(form_data) + + self.assertTrue(form.is_valid()) + + response = self.c.post(url,form_data) + self.assertEqual(response.status_code,200) + @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.getsmallrowdata_db') def test_smoothen(self, mocked_sqlalchemy, mocked_getsmallrowdata_db): diff --git a/rowers/tests/test_plans.py b/rowers/tests/test_plans.py index 04453339..270b50a3 100644 --- a/rowers/tests/test_plans.py +++ b/rowers/tests/test_plans.py @@ -12,6 +12,9 @@ from rowers.utils import allmonths,allsundays import rowers.plannedsessions as plannedsessions from django.db import transaction +from rowers.views.workoutviews import plannedsession_compare_view +from rowers.opaque import encoder + @override_settings(TESTING=True) class TrainingPlanTest(TestCase): def setUp(self): @@ -311,6 +314,71 @@ class SessionLinkTest(TestCase): response = self.c.get(url) self.assertEqual(response.status_code,200) + url = reverse(plannedsession_compare_view,kwargs={'id':ps.id,'userid':self.u.id}) + response = self.c.get(url,follow=True) + expected_url = reverse('plannedsession_view',kwargs={'id':ps.id}) + self.assertRedirects(response,expected_url=expected_url, + status_code=302,target_status_code=200) + + # need a workout attached to the session, to get correct redirect below + w.plannedsession = ps + w.save() + + url = reverse(plannedsession_compare_view,kwargs={'id':ps.id,'userid':self.u.id}) + response = self.c.get(url,follow=True) + expected_url = reverse('multi_compare_view',kwargs={'userid':self.u.id,'id':encoder.encode_hex(w.id)}) + self.assertRedirects(response,expected_url=expected_url, + status_code=302,target_status_code=200) + + # while we're here, let's submit a POST request to multi compare view + url = expected_url + + form_data = { + 'xparam': 'distance', + 'yparam': 'spm', + 'plottype': 'line', + 'teamid':0, + } + + form = ChartParamChoiceForm(form_data) + self.assertTrue(form.is_valid()) + + request = self.factory.post(url, + data=form_data) + + # adding session + middleware = SessionMiddleware() + middleware.process_request(request) + request.session.save() + + session = request.session + session['ids'] = [w.id] + session.save() + + request.user = self.u + response = multi_compare_view(request,id=str(w.id)) + self.assertEqual(response.status_code,200) + + # and adding a get + request = self.factory.get(url) + # adding session + middleware = SessionMiddleware() + middleware.process_request(request) + request.session.save() + + session = request.session + session['ids'] = [w.id] + session['plottype'] = 'line' + session['xparam'] = 'distance' + session['yparam'] = 'spm' + session.save() + + request.user = self.u + response = multi_compare_view(request,id=str(w.id)) + self.assertEqual(response.status_code,200) + + + def test_multiplesessions(self): with transaction.atomic(): login = self.c.login(username=self.u.username, password=self.password) diff --git a/rowers/tests/test_races.py b/rowers/tests/test_races.py index e529844a..ee1b6828 100644 --- a/rowers/tests/test_races.py +++ b/rowers/tests/test_races.py @@ -16,9 +16,10 @@ import rowers.courses as courses import rowers.tasks as tasks from rowers.views.racesviews import * from rowers.utils import calculate_age -from rowers.views import addmanual_view +from rowers.views import addmanual_view, virtualevent_compare_view from django.contrib.messages.storage.fallback import FallbackStorage +from django.contrib.sessions.middleware import SessionMiddleware from base64 import b64encode import base64 @@ -61,6 +62,13 @@ class ChallengesTest(TestCase): gdproptindate=timezone.now(), rowerplan='coach') + self.u2 = UserFactory() + self.r2 = Rower.objects.create(user=self.u2, + birthdate=datetime.datetime.now()-datetime.timedelta(days=28*365), + gdproptin=True,surveydone=True, + gdproptindate=timezone.now(), + rowerplan='basic') + self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) self.factory = RequestFactory() @@ -93,6 +101,22 @@ class ChallengesTest(TestCase): self.wthyro.date = nu.date() self.wthyro.save() + result = get_random_file(filename='rowers/tests/testdata/thyro.csv') + self.wthyro2 = WorkoutFactory(user=self.r2, + csvfilename=result['filename'], + starttime=result['starttime'], + startdatetime=result['startdatetime'], + duration=result['duration'], + distance=result['totaldist'], + workouttype = 'water', + ) + + self.wthyro2.startdatetime = nu + self.wthyro2.date = nu.date() + self.wthyro2.save() + + + startdate = arrow.get(datetime.datetime.now()-datetime.timedelta(days=1)).datetime start_time = datetime.time() enddate = startdate+datetime.timedelta(days=5) @@ -125,6 +149,21 @@ class ChallengesTest(TestCase): ) self.SpeedOrder.save() + self.result = VirtualRaceResult( + userid = self.u2.id, + username = self.u2.username, + race = self.SpeedOrder, + distance = 300, + duration = datetime.time(0,1,20), + points = 75, + coursecompleted = True, + age = 28, + startsecond = 0, + endsecond = 120, + workoutid = self.wthyro2.id + ) + self.result.save() + def tearDown(self): for workout in self.user_workouts: @@ -604,6 +643,60 @@ class ChallengesTest(TestCase): record.workoutid = self.wthyro.id record.save() + # map compare + url = reverse('virtualevent_mapcompare_view',kwargs={'id':race.id}) + response = self.c.get(url) + self.assertEqual(response.status_code,200) + + # compare + url = reverse('virtualevent_compare_view',kwargs={'id':race.id}) + response = self.c.get(url) + self.assertEqual(response.status_code,200) + + # post to compare + form_data = { + 'workouts':[self.wthyro2.id], + 'xparam': 'distance', + 'yparam': 'spm', + 'plottype': 'line', + 'teamid':0, + } + form = ChartParamChoiceForm(form_data) + self.assertTrue(form.is_valid()) + + form = WorkoutMultipleCompareForm(form_data) + self.assertTrue(form.is_valid()) + + response = self.c.post(url,form_data) + self.assertEqual(response.status_code,200) + + # post2 to compare + form_data = { + 'xparam': 'distance', + 'yparam': 'spm', + 'plottype': 'line', + 'teamid':0, + } + form = ChartParamChoiceForm(form_data) + self.assertTrue(form.is_valid()) + + request = self.factory.post(url, + data=form_data) + + # adding session + middleware = SessionMiddleware() + middleware.process_request(request) + request.session.save() + + session = request.session + session['ids'] = [self.wthyro2.id] + session.save() + + request.user = self.u + response = virtualevent_compare_view(request,id=str(race.id)) + self.assertEqual(response.status_code,200) + + url = reverse('virtualevent_disqualify_view',kwargs={'id':race.id,'recordid':record.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) @@ -635,10 +728,8 @@ class ChallengesTest(TestCase): self.assertEqual(response.status_code, 200) - # map compare - url = reverse('virtualevent_mapcompare_view',kwargs={'id':race.id}) - response = self.c.get(url) - self.assertEqual(response.status_code,200) + + # add boat diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 0c28ebcd..a3bf5bc9 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -715,7 +715,6 @@ def addmanual_view(request,raceid=0): messages.error(request,er) if result: - print('mies') otherrecords = IndoorVirtualRaceResult.objects.filter( race = race ).exclude(userid=r.id) @@ -992,7 +991,7 @@ def video_selectworkout(request,userid=0): ).exclude(boattype__in=negtypes) - if rankingonly: # pragma : no cover + if rankingonly: # pragma: no cover workouts = workouts.exclude(rankingpiece=False) startdatestring = startdate.strftime('%Y-%m-%d') @@ -1475,7 +1474,7 @@ def virtualevent_mapcompare_view(request,id=0): for result in results: startenddict[result.workoutid] = (result.startsecond,result.endsecond) - if len(workoutids) == 0: + if len(workoutids) == 0: # pragma: no cover url = reverse('virtualevent_view', kwargs={ 'id':race.id, @@ -1489,7 +1488,7 @@ def virtualevent_mapcompare_view(request,id=0): for id in workoutids: try: workouts.append(Workout.objects.get(id=id)) - except Workout.DoesNotExist: + except Workout.DoesNotExist: # pragma: no cover pass labeldict = { @@ -1545,18 +1544,18 @@ def virtualevent_compare_view(request,id=0): result = request.user.is_authenticated and ispromember(request.user) if result: promember=1 - else: + else: # pragma: no cover r = None try: race = VirtualRace.objects.get(id=id) - except VirtualRace.DoesNotExist: + except VirtualRace.DoesNotExist: # pragma: no cover raise Http404("Virtual Challenge does not exist") if race.sessiontype == 'race': script,div = course_map(race.course) resultobj = VirtualRaceResult - else: + else: # pragma: no cover script = '' div = '' resultobj = IndoorVirtualRaceResult @@ -1569,18 +1568,12 @@ def virtualevent_compare_view(request,id=0): workoutids = [result.workoutid for result in results] - - startenddict = {} if race.sessiontype == 'race': for result in results: startenddict[result.workoutid] = (result.startsecond,result.endsecond) - - - - - if len(workoutids) == 0: + if len(workoutids) == 0: # pragma: no cover url = reverse('virtualevent_view', kwargs={ 'id':race.id, @@ -1590,7 +1583,6 @@ def virtualevent_compare_view(request,id=0): return HttpResponseRedirect(url) - if request.method == 'GET': xparam = 'time' if race.sessionmode == 'distance': @@ -1612,7 +1604,7 @@ def virtualevent_compare_view(request,id=0): for id in workoutids: try: workouts.append(Workout.objects.get(id=id)) - except Workout.DoesNotExist: + except Workout.DoesNotExist: # pragma: no cover pass form = WorkoutMultipleCompareForm() @@ -1653,6 +1645,7 @@ def virtualevent_compare_view(request,id=0): form.fields["workouts"].queryset = Workout.objects.filter(id__in=workoutids) request.session['ids'] = workoutids + chartform = ChartParamChoiceForm(request.POST) if chartform.is_valid(): xparam = chartform.cleaned_data['xparam'] @@ -1661,15 +1654,16 @@ def virtualevent_compare_view(request,id=0): teamid = chartform.cleaned_data['teamid'] try: workoutids = request.session['ids'] - except KeyError: + except KeyError: # pragma: no cover pass + workouts = [] for id in workoutids: try: workouts.append(Workout.objects.get( id=id)) - except Workout.DoesNotExist: + except Workout.DoesNotExist: # pragma: no cover pass labeldict = { @@ -1684,7 +1678,7 @@ def virtualevent_compare_view(request,id=0): script = res[0] div = res[1] errormessage = res[3] - if errormessage != '': + if errormessage != '': # pragma: no cover messages.error(request,errormessage) breadcrumbs = [ @@ -1734,7 +1728,7 @@ def plannedsession_compare_view(request,id=0,userid=0): try: ps = PlannedSession.objects.get(id=id) - except PlannedSession.DoesNotExist: + except PlannedSession.DoesNotExist: # pragma: no cover raise Http404("Planned session does not exist") @@ -1791,7 +1785,7 @@ def multi_compare_view(request,id=0,userid=0): int(w.id): w.__str__() for w in workouts } - else: + else: # pragma: no cover return HttpResponse("Form is not valid") elif request.method == 'POST' and 'ids' in request.session: chartform = ChartParamChoiceForm(request.POST) @@ -1806,7 +1800,7 @@ def multi_compare_view(request,id=0,userid=0): for id in ids: try: workouts.append(Workout.objects.get(id=id)) - except Workout.DoesNotExist: + except Workout.DoesNotExist: # pragma: no cover pass labeldict = { @@ -1822,7 +1816,7 @@ def multi_compare_view(request,id=0,userid=0): for id in ids: try: workouts.append(Workout.objects.get(id=id)) - except Workout.DoesNotExist: + except Workout.DoesNotExist: # pragma: no cover pass labeldict = { @@ -1852,7 +1846,7 @@ def multi_compare_view(request,id=0,userid=0): script = res[0] div = res[1] errormessage = res[3] - if errormessage != '': + if errormessage != '': # pragma: no cover messages.error(request,errormessage) r = getrower(request.user) @@ -1872,7 +1866,7 @@ def multi_compare_view(request,id=0,userid=0): } ] - if 'ps' in request.session: + if 'ps' in request.session: # pragma: no cover ps = PlannedSession.objects.get(id=int(request.session['ps'])) breadcrumbs = [ { @@ -1995,7 +1989,7 @@ def workouts_view(request,message='',successmessage='', startdatetime__lte=activity_enddate, duplicate=False, privacy='visible').order_by("-date", "-starttime") - elif theteam.viewing == 'coachonly': + elif theteam.viewing == 'coachonly': # pragma: no cover workouts = Workout.objects.filter( team=theteam,user=r, startdatetime__gte=startdate, @@ -2141,14 +2135,13 @@ def workouts_view(request,message='',successmessage='', redirect_field_name=None) @permission_required('workout.change_workout',fn=get_workout_by_opaqueid,raise_exception=True) def workout_fusion_list(request,id=0, - startdatestring="",enddatestring="", startdate=timezone.now()-datetime.timedelta(days=365), enddate=timezone.now()): r = getrequestrower(request) u = r.user - if request.method == 'POST': + if request.method == 'POST': # pragma: no cover dateform = DateRangeForm(request.POST) if dateform.is_valid(): startdate = dateform.cleaned_data['startdate'] @@ -2159,11 +2152,6 @@ def workout_fusion_list(request,id=0, 'enddate':enddate, }) - if startdatestring: - startdate = iso8601.parse_date(startdatestring) - if enddatestring: - enddate = iso8601.parse_date(enddatestring) - startdate = datetime.datetime.combine(startdate,datetime.time()) enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59)) #enddate = enddate+datetime.timedelta(days=1) @@ -2200,7 +2188,7 @@ def workout_fusion_list(request,id=0, try: workouts = paginator.page(page) - except EmptyPage: + except EmptyPage: # pragma: no cover workouts = paginator.page(paginator.num_pages) row = get_workoutuser(id, request) @@ -2259,7 +2247,7 @@ def workout_view(request,id=0,raceresult=0,sessionresult=0,nocourseraceresult=0) g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime") - for i in g: + for i in g: # pragma: no cover try: width,height = Image.open(i.filename).size i.width = width @@ -2270,7 +2258,7 @@ def workout_view(request,id=0,raceresult=0,sessionresult=0,nocourseraceresult=0) # get raceresult or session result intervaldata = {} - if sessionresult != 0: + if sessionresult != 0: # pragma: no cover try: result = CourseTestResult.objects.get(id=sessionresult) startsecond = result.startsecond @@ -2289,7 +2277,7 @@ def workout_view(request,id=0,raceresult=0,sessionresult=0,nocourseraceresult=0) except CourseTestResult.DoesNotExist: pass - if nocourseraceresult != 0: + if nocourseraceresult != 0: # pragma: no cover try: result = IndoorVirtualRaceResult.objects.get(id=nocourseraceresult) startsecond = result.startsecond @@ -2309,7 +2297,7 @@ def workout_view(request,id=0,raceresult=0,sessionresult=0,nocourseraceresult=0) pass - if raceresult != 0: + if raceresult != 0: # pragma: no cover try: result = VirtualRaceResult.objects.get(id=raceresult) startsecond = result.startsecond @@ -2337,17 +2325,17 @@ def workout_view(request,id=0,raceresult=0,sessionresult=0,nocourseraceresult=0) if rowdata != 0: try: latitude = rowdata.df[' latitude'] - if not latitude.std(): + if not latitude.std(): # pragma: no cover hascoordinates = 0 except (KeyError,AttributeError): hascoordinates = 0 - else: + else: # pragma: no cover hascoordinates = 0 if hascoordinates: - if intervaldata: + if intervaldata: # pragma: no cover rowdata.df['reltime'] = rowdata.df['TimeStamp (sec)']-rowdata.df.loc[0,'TimeStamp (sec)'] mask = (rowdata.df['reltime']>startsecond) & (rowdata.df['reltime']