From f6c535d2d627d3d63f0801a742d1bac334706854 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 29 Apr 2024 20:06:41 +0200 Subject: [PATCH] going through tests --- rowers/courses.py | 57 ---------- rowers/dataprep.py | 39 ------- rowers/dataroutines.py | 6 +- rowers/interactiveplots.py | 16 +-- rowers/plannedsessions.py | 2 - rowers/tests/test_api.py | 37 ++++--- rowers/tests/test_emails.py | 12 +-- rowers/tests/test_flexchart.py | 8 +- rowers/tests/test_imports.py | 24 ++--- rowers/tests/test_interactivecharts.py | 32 +++--- rowers/tests/test_permissions.py | 16 +-- rowers/tests/test_permissions2.py | 16 +-- rowers/tests/test_urls.py | 6 +- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4003 bytes rowers/views/analysisviews.py | 144 ------------------------- 15 files changed, 89 insertions(+), 326 deletions(-) diff --git a/rowers/courses.py b/rowers/courses.py index d3eab241..060d15ae 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -1,5 +1,4 @@ from rowers.courseutils import coursetime_paths, coursetime_first, time_in_path -import pandas as pd from rowers.models import ( Rower, Workout, GeoPoint, GeoPolygon, GeoCourse, @@ -420,62 +419,6 @@ def createcourse( return c -def get_time_course(ws, course): # pragma: no cover - coursetimeseconds = 0.0 - coursecompleted = False - - w = ws[0] - columns = ['time', ' latitude', ' longitude', 'cum_dist'] - rowdata = dataprep.getsmallrowdata_db( - columns, - ids=[w.id], - doclean=False, - workstrokesonly=False - ) - - rowdata.rename(columns={ - ' latitude': 'latitude', - ' longitude': 'longitude', - }, inplace=True) - - rowdata['time'] = rowdata['time']/1000. - - rowdata.fillna(method='backfill', inplace=True) - - rowdata['time'] = rowdata['time']-rowdata.ix[0, 'time'] - # we may want to expand the time (interpolate) - rowdata['dt'] = rowdata['time'].apply( - lambda x: timedelta(seconds=x) - ) - rowdata = rowdata.resample('100ms', on='dt').mean() - rowdata = rowdata.interpolate() - - # create path - polygons = GeoPolygon.objects.filter( - course=course).order_by("order_in_course") - paths = [] - for polygon in polygons: - path = polygon_to_path(polygon) - paths.append(path) - - ( - coursetimeseconds, - coursemeters, - coursecompleted, - - ) = coursetime_paths(rowdata, paths) - ( - coursetimefirst, - coursemetersfirst, - firstcompleted - ) = coursetime_first( - rowdata, paths) - - coursetimeseconds = coursetimeseconds-coursetimefirst - coursemeters = coursemeters-coursemetersfirst - - return coursetimeseconds, coursemeters, coursecompleted - def replacecourse(course1, course2): ps = PlannedSession.objects.filter(course=course1) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 275f8684..4c8e94a9 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -758,45 +758,6 @@ def fetchcp_new(rower, workouts): return df['delta'], df['cp'], 0, df['workout'], df['url'] -def fetchcp(rower, theworkouts, table='cpdata'): # pragma: no cover - # get all power data from database (plus workoutid) - theids = [int(w.id) for w in theworkouts] - columns = ['power', 'workoutid', 'time'] - df = getsmallrowdata_db(columns, ids=theids) - df.dropna(inplace=True, axis=0) - if df.empty: - avgpower2 = {} - for id in theids: - avgpower2[id] = 0 - return pd.Series([], dtype='float'), pd.Series([], dtype='float'), avgpower2 - - try: - dfgrouped = df.groupby(['workoutid']) - except KeyError: - avgpower2 = {} - return pd.Series([], dtype='float'), pd.Series([], dtype='float'), avgpower2 - try: - avgpower2 = dict(dfgrouped.mean()['power'].astype(int)) - except KeyError: - avgpower2 = {} - for id in theids: - avgpower2[id] = 0 - return pd.Series([], dtype='float'), pd.Series([], dtype='float'), avgpower2 - - cpdf = getcpdata_sql(rower.id, table=table) - - if not cpdf.empty: - return cpdf['delta'], cpdf['cp'], avgpower2 - else: - _ = myqueue(queuelow, - handle_updatecp, - rower.id, - theids, - table=table) - - return pd.Series([], dtype='float'), pd.Series([], dtype='float'), avgpower2 - - return pd.Series([], dtype='float'), pd.Series([], dtype='float'), avgpower2 def update_rolling_cp(r, types, mode='water', dosend=False): diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 467fc5ce..083dce8d 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -205,7 +205,7 @@ def get_video_data(w, groups=['basic'], mode='water'): columns += [name for name, d in rowingmetrics if d['group'] in groups and d['mode'] in modes] columns = list(set(columns)) - df = getsmallrowdata_db(columns, ids=[w.id], + df = getsmallrowdata_pd(columns, ids=[w.id], workstrokesonly=False, doclean=False, compute=False) df['time'] = (df['time']-df['time'].min())/1000. @@ -1772,7 +1772,7 @@ def read_cols_pl(ids, columns): if len(ids) == 0: return pl.DataFrame() - df = getsmallrowdata_pl(columns, ids=ids, doclean=False, compute=False) + df = read_data(columns, ids=ids, doclean=False, compute=False) if 'peakforce' in columns: funits = ((w.id, w.forceunit) @@ -1980,7 +1980,7 @@ def datafusion(id1, id2, columns, offset): def fix_newtons(id=0, limit=3000): # pragma: no cover # rowdata,row = getrowdata_db(id=id,doclean=False,convertnewtons=False) - rowdata = getsmallrowdata_db(['peakforce'], ids=[id], doclean=False) + rowdata = read_data(['peakforce'], ids=[id], doclean=False) try: peakforce = rowdata['peakforce'] if peakforce.mean() > limit: diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 06fe2637..597b5158 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1973,7 +1973,7 @@ def thumbnails_set(r, id, favorites): columns += [f.yparam2 for f in favorites] columns += ['time'] - rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], doclean=True) + rowdata = dataprep.getsmallrowdata_pd(columns, ids=[id], doclean=True) try: rowdata.dropna(axis=1, how='all', inplace=True) @@ -1987,7 +1987,7 @@ def thumbnails_set(r, id, favorites): if rowdata.empty: try: - rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], doclean=False, + rowdata = dataprep.getsmallrowdata_pd(columns, ids=[id], doclean=False, workstrokesonly=False) except: # pragma: no cover return [ @@ -1996,12 +1996,12 @@ def thumbnails_set(r, id, favorites): 'notes': "" }] - if rowdata.empty: - return [ - {'script': "", - 'div': "", - 'notes': "" - }] + if rowdata.empty: + return [ + {'script': "", + 'div': "", + 'notes': "" + }] lengte = len(rowdata) maxlength = 50 diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index dc2c4a08..5d49e59e 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -18,13 +18,11 @@ import rowers.dataprep as dataprep import numpy as np import rowers.metrics as metrics import rowers.mytypes as mytypes -from rowers.courses import get_time_course from rowers.utils import to_pace from rowers.opaque import encoder from rowingdata import rower as rrower from rowingdata import rowingdata as rrdata import arrow -import pandas as pd import polars as pl import json diff --git a/rowers/tests/test_api.py b/rowers/tests/test_api.py index e17c3532..3aee087e 100644 --- a/rowers/tests/test_api.py +++ b/rowers/tests/test_api.py @@ -58,20 +58,22 @@ class OwnApi(TestCase): response = self.c.get(url) self.assertEqual(response.status_code,200) - url = reverse('strokedatajson',kwargs={'id':w.id}) + with patch('rowers.dataprep.read_data') as mock_read_data: + mock_read_data.return_value = pl.read_csv('rowers/tests/testdata/colsfromdb.csv') + url = reverse('strokedatajson',kwargs={'id':w.id}) - request = self.factory.get(url) - request.user = self.u - force_authenticate(request, user=self.u) - response = strokedatajson(request,id=w.id) - self.assertEqual(response.status_code,200) + request = self.factory.get(url) + request.user = self.u + force_authenticate(request, user=self.u) + response = strokedatajson(request,id=w.id) + self.assertEqual(response.status_code,200) - # response must be json - - strokedata = json.loads(response.content) - df = pl.from_dict(strokedata) + # response must be json + + strokedata = json.loads(response.content) + df = pl.from_dict(strokedata) - self.assertFalse(df.is_empty()) + self.assertFalse(df.is_empty()) form_data = { "distance": [23, 46, 48], @@ -120,12 +122,15 @@ class OwnApi(TestCase): request = self.factory.get(url) request.user = self.u force_authenticate(request, user=self.u) - response = strokedatajson_v2(request,id=w.id) - self.assertEqual(response.status_code,200) + with patch('rowers.dataprep.read_data') as mock_read_data: + mock_read_data.return_value = pl.read_csv('rowers/tests/testdata/colsfromdb.csv') + response = strokedatajson_v2(request,id=w.id) + self.assertEqual(response.status_code,200) + + # response must be json + strokedata = json.loads(response.content) + df = pl.from_dicts(strokedata['data']) - # response must be json - strokedata = json.loads(response.content) - df = pl.from_dicts(strokedata['data']) self.assertFalse(df.is_empty()) diff --git a/rowers/tests/test_emails.py b/rowers/tests/test_emails.py index a606263d..ae26ef5e 100644 --- a/rowers/tests/test_emails.py +++ b/rowers/tests/test_emails.py @@ -108,8 +108,8 @@ class EmailUpload(TestCase): @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_uploadapi2(self,mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_uploadapi2(self,mocked_sqlalchemy,mocked_read_data): form_data = {"secret": settings.UPLOAD_SERVICE_SECRET, "user": 1, "file": 'media/mailbox_attachments/colin3.csv', @@ -140,8 +140,8 @@ class EmailUpload(TestCase): @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_uploadapi3(self,mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_uploadapi3(self,mocked_sqlalchemy,mocked_read_data): with transaction.atomic(): form_data = { 'title': 'test', @@ -167,8 +167,8 @@ class EmailUpload(TestCase): self.assertEqual(w.notes,'aap noot mies') @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_uploadapi_credentials(self,mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_uploadapi_credentials(self,mocked_sqlalchemy,mocked_read_data): form_data = { 'title': 'test', 'workouttype':'rower', diff --git a/rowers/tests/test_flexchart.py b/rowers/tests/test_flexchart.py index d66d20ea..455eb1d8 100644 --- a/rowers/tests/test_flexchart.py +++ b/rowers/tests/test_flexchart.py @@ -103,8 +103,8 @@ class WorkoutViewTest(TestCase): pass @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db') - def test_flexchart_water(self, mocked_sqlalechemy, mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data') + def test_flexchart_water(self, mocked_sqlalechemy, mocked_read_data): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) @@ -151,8 +151,8 @@ class WorkoutViewTest(TestCase): self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db') - def test_flexchart_erg(self, mocked_sqlalechemy, mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data') + def test_flexchart_erg(self, mocked_sqlalechemy, mocked_read_data): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index d5e9470d..78818eb5 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -720,8 +720,8 @@ class NKObjects(DjangoTestCase): ) @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_nk_intervals(self,mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_nk_intervals(self,mocked_sqlalchemy,mocked_read_data): with open('rowers/tests/testdata/carlos_workout.json','r') as f: workoutdata = json.load(f) with open('rowers/tests/testdata/carlos_strokes.json','r') as f: @@ -817,10 +817,10 @@ class NKObjects(DjangoTestCase): @patch('rowers.integrations.nk.requests.get', side_effect=mocked_requests) @patch('rowers.integrations.nk.requests.post', side_effect=mocked_requests) @patch('rowers.nkimportutils.requests.session', side_effect=mocked_session) - @patch('rowers.dataprep.getsmallrowdata_db', side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_nk_import(self, mock_get, mock_post, mocked_session, - mocked_getsmallrowdata_db): + mocked_read_data): integration = NKIntegration(self.u) result = integration.token_refresh() @@ -854,10 +854,10 @@ class NKObjects(DjangoTestCase): @patch('rowers.integrations.nk.requests.get', side_effect=mocked_requests) @patch('rowers.integrations.nk.requests.post', side_effect=mocked_requests) @patch('rowers.nkimportutils.requests.session', side_effect=mocked_session) - @patch('rowers.dataprep.getsmallrowdata_db', side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_nk_import_task(self, mock_get, mock_post, mocked_session, - mocked_getsmallrowdata_db): + mocked_read_data): alldata = { 469: {'elapsedTime': 3901900, 'totalDistanceImp': 0, @@ -904,10 +904,10 @@ class NKObjects(DjangoTestCase): @patch('rowers.integrations.nk.requests.get', side_effect=mocked_requests) @patch('rowers.integrations.nk.requests.post', side_effect=mocked_requests) @patch('rowers.nkimportutils.requests.session', side_effect=mocked_session) - @patch('rowers.dataprep.getsmallrowdata_db', side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_nk_import_impeller(self, mock_get, mock_post, mocked_session, - mocked_getsmallrowdata_db): + mocked_read_data): integration = NKIntegration(self.u) result = integration.token_refresh() @@ -1083,9 +1083,9 @@ class RP3Objects(DjangoTestCase): @patch('rowers.integrations.rp3.requests.get', side_effect=mocked_requests) @patch('rowers.integrations.rp3.requests.post', side_effect=mocked_requests) - @patch('rowers.dataprep.getsmallrowdata_db', side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_rp3_import(self, mock_get, mockpost, - mocked_getsmallrowdata_db): + mocked_read_data): response = self.c.get('/rowers/workout/rp3import/591621',follow=True) @@ -1268,9 +1268,9 @@ class StravaObjects(DjangoTestCase): @patch('rowers.utils.requests.get', side_effect=mocked_requests) @patch('rowers.integrations.strava.requests.post', side_effect=mocked_requests) - @patch('rowers.dataprep.getsmallrowdata_db') + @patch('rowers.dataprep.read_data') def test_strava_import(self, mock_get, mock_post, - mocked_getsmallrowdata_db): + mocked_read_data): response = self.c.get('/rowers/workout/stravaimport/12',follow=True) expected_url = reverse('workout_import_view',kwargs={'source':'strava'}) diff --git a/rowers/tests/test_interactivecharts.py b/rowers/tests/test_interactivecharts.py index 2d217f0b..c46855f8 100644 --- a/rowers/tests/test_interactivecharts.py +++ b/rowers/tests/test_interactivecharts.py @@ -51,16 +51,16 @@ class InteractiveChartTest(TestCase): @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_interactive_chart1(self, mocked_sqlalchemy,mocked_read_df_sql, - mocked_getsmallrowdata_db): + mocked_read_data): res = iplots.interactive_chart(self.wote.id) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_interactive_chart2(self, mocked_sqlalchemy,mocked_read_df_sql, - mocked_getsmallrowdata_db): + mocked_read_data): res = iplots.interactive_chart(self.wote.id,promember=1) @@ -80,52 +80,52 @@ class InteractiveChartTest(TestCase): @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_interactive_chart7(self, mocked_sqlalchemy,mocked_read_df_sql, - mocked_getsmallrowdata_db): + mocked_read_data): res = iplots.interactive_flex_chart2(self.wote.id,self.r,promember=0, xparam='time', yparam1='pace',yparam2='spm',mode='water') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_interactive_chart8(self, mocked_sqlalchemy,mocked_read_df_sql, - mocked_getsmallrowdata_db): + mocked_read_data): res = iplots.interactive_flex_chart2(self.wote.id,self.r, promember=0,xparam='distance', yparam1='pace',yparam2='spm',mode='water') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_interactive_chart9(self, mocked_sqlalchemy,mocked_read_df_sql, - mocked_getsmallrowdata_db): + mocked_read_data): res = iplots.interactive_flex_chart2(self.wote.id,self.r, promember=1,xparam='time', yparam1='pace',yparam2='hr',mode='water') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_interactive_chart10(self, mocked_sqlalchemy,mocked_read_df_sql, - mocked_getsmallrowdata_db): + mocked_read_data): res = iplots.interactive_flex_chart2(self.wote.id,self.r, promember=1,xparam='distance', yparam1='pace',yparam2='hr',mode='water') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_interactive_chart11(self, mocked_sqlalchemy,mocked_read_df_sql, - mocked_getsmallrowdata_db): + mocked_read_data): res = iplots.interactive_flex_chart2(self.wote.id,self.r, promember=1,xparam='time', yparam1='pace',yparam2='spm',mode='water') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_interactive_chart12(self, mocked_sqlalchemy,mocked_read_df_sql, - mocked_getsmallrowdata_db): + mocked_read_data): res = iplots.interactive_flex_chart2(self.wote.id,self.r, promember=1, xparam='distance', diff --git a/rowers/tests/test_permissions.py b/rowers/tests/test_permissions.py index 2f527fda..4ee00a3b 100644 --- a/rowers/tests/test_permissions.py +++ b/rowers/tests/test_permissions.py @@ -911,8 +911,8 @@ class PermissionsViewTests(TestCase): ## Coach can upload on behalf of athlete - if team allows @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_coach_edit_athlete_upload(self,mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_coach_edit_athlete_upload(self,mocked_sqlalchemy,mocked_read_data): self.rbasic.team.add(self.teamcoach) self.rbasic.coachinggroups.add(self.coachinggroup) @@ -957,8 +957,8 @@ class PermissionsViewTests(TestCase): ## Coach can upload on behalf of athlete - if team allows @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_coach_edit_athlete_uploadnot(self,mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_coach_edit_athlete_uploadnot(self,mocked_sqlalchemy,mocked_read_data): self.rbasic.team.add(self.teamcoach) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) @@ -1168,8 +1168,8 @@ class PermissionsViewTests(TestCase): ## Self Coach cannot upload on behalf of athlete @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_plan_edit_athlete_upload(self,mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_plan_edit_athlete_upload(self,mocked_sqlalchemy,mocked_read_data): self.rpro.team.add(self.teamplan) login = self.c.login(username=self.uplan2.username, password=self.uplan2password) @@ -1291,8 +1291,8 @@ class PermissionsViewTests(TestCase): ## Self Coach cannot upload on behalf of athlete @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_plan_edit_athlete_upload(self,mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_plan_edit_athlete_upload(self,mocked_sqlalchemy,mocked_read_data): self.rpro.team.add(self.teamplan) login = self.c.login(username=self.uplan2.username, password=self.uplan2password) diff --git a/rowers/tests/test_permissions2.py b/rowers/tests/test_permissions2.py index 52d495aa..074f4e7f 100644 --- a/rowers/tests/test_permissions2.py +++ b/rowers/tests/test_permissions2.py @@ -218,7 +218,7 @@ class PermissionsViewTests(TestCase): @patch('rowers.integrations.c2.C2Integration.open') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db') + @patch('rowers.dataprep.read_data') @patch('requests.get',side_effect=mocked_requests) @patch('requests.post',side_effect=mocked_requests) @patch('rowers.dataprep.get_video_data',side_effect=mocked_get_video_data) @@ -228,7 +228,7 @@ class PermissionsViewTests(TestCase): mock_c2open, mocked_sqlalchemy, mocked_read_df_sql, - mocked_getsmallrowdata_db, + mocked_read_data, mock_get, mock_post, mocked_get_video_data, @@ -253,7 +253,7 @@ class PermissionsViewTests(TestCase): @patch('rowers.integrations.c2.C2Integration.open') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db') + @patch('rowers.dataprep.read_data') @patch('requests.get',side_effect=mocked_requests) @patch('requests.post',side_effect=mocked_requests) @patch('rowers.dataprep.get_video_data',side_effect=mocked_get_video_data) @@ -263,7 +263,7 @@ class PermissionsViewTests(TestCase): mock_c2open, mocked_sqlalchemy, mocked_read_df_sql, - mocked_getsmallrowdata_db, + mocked_read_data, mock_get, mock_post, mocked_get_video_data, @@ -335,7 +335,7 @@ class PermissionsViewTests(TestCase): @patch('rowers.integrations.c2.C2Integration.open') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db') + @patch('rowers.dataprep.read_data') @patch('requests.get',side_effect=mocked_requests) @patch('requests.post',side_effect=mocked_requests) @patch('rowers.dataprep.get_video_data',side_effect=mocked_get_video_data) @@ -345,7 +345,7 @@ class PermissionsViewTests(TestCase): mock_c2open, mocked_sqlalchemy, mocked_read_df_sql, - mocked_getsmallrowdata_db, + mocked_read_data, mock_get, mock_post, mocked_get_video_data, @@ -418,7 +418,7 @@ class PermissionsViewTests(TestCase): @patch('rowers.integrations.c2.C2Integration.open') @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db') + @patch('rowers.dataprep.read_data') @patch('requests.get',side_effect=mocked_requests) @patch('requests.post',side_effect=mocked_requests) @patch('rowers.dataprep.get_video_data',side_effect=mocked_get_video_data) @@ -428,7 +428,7 @@ class PermissionsViewTests(TestCase): mock_c2open, mocked_sqlalchemy, mocked_read_df_sql, - mocked_getsmallrowdata_db, + mocked_read_data, mock_get, mock_post, mocked_get_video_data, diff --git a/rowers/tests/test_urls.py b/rowers/tests/test_urls.py index 5d19c820..4f2d6d9c 100644 --- a/rowers/tests/test_urls.py +++ b/rowers/tests/test_urls.py @@ -193,7 +193,7 @@ class URLTests(TestCase): @parameterized.expand(lijst) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_df_sql') - @patch('rowers.dataprep.getsmallrowdata_db') + @patch('rowers.dataprep.read_data') @patch('requests.get',side_effect=mocked_requests) @patch('requests.post',side_effect=mocked_requests) @patch('rowers.dataprep.get_video_data',side_effect=mocked_get_video_data) @@ -201,7 +201,7 @@ class URLTests(TestCase): def test_url_generator(self,url,expected, mocked_sqlalchemy, mocked_read_df_sql, - mocked_getsmallrowdata_db, + mocked_read_data, mock_get, mock_post, mocked_get_video_data, @@ -212,7 +212,7 @@ class URLTests(TestCase): self.assertTrue(login) response = self.c.get(url,follow=True) if response.status_code != expected: - print(url ) + print(url) print(response.status_code) self.assertEqual(response.status_code, diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 4ed63f161db8901eb27d7a5dd48e39e93f0af9e5..fc88d4937d88aac8c7941b1fc71f93d7b02ffc45 100644 GIT binary patch literal 4003 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 0] - powerdf.dropna(axis=0, inplace=True) - powerdf.sort_values(['Delta', 'CP'], ascending=[1, 0], inplace=True) - powerdf.drop_duplicates(subset='Delta', keep='first', inplace=True) - powerdf.to_csv(csvfilename) - - _ = myqueue(queuehigh, - handle_sendemailfile, - 'Sander', - 'Roosendaal', - 'roosendaalsander@gmail.com', - csvfilename, - delete=True) - - successmessage = "The CSV file was sent to the site admin per email" - messages.info(request, successmessage) - response = HttpResponseRedirect('/rowers/list-workouts/') - - return response - - -@login_required() -def otwcp_toadmin_view(request, theuser=0, - startdate=timezone.now() - datetime.timedelta(days=365), - enddate=timezone.now(), - startdatestring="", - enddatestring="", - ): # pragma: no cover - - if startdatestring != "": - try: - startdate = iso8601.parse_date(startdatestring) - except ParseError: - pass - - if enddatestring != "": - try: - enddate = iso8601.parse_date(enddatestring) - except ParseError: - pass - - if theuser == 0: - theuser = request.user.id - - u = User.objects.get(id=theuser) - r = Rower.objects.get(user=u) - - startdate = datetime.datetime.combine(startdate, datetime.time()) - enddate = datetime.datetime.combine(enddate, datetime.time(23, 59, 59)) - - theworkouts = Workout.objects.filter( - user=r, rankingpiece=True, - workouttype='water', - startdatetime__gte=startdate, - startdatetime__lte=enddate - ).order_by("-startdatetime") - - delta, cpvalue, avgpower = dataprep.fetchcp( - r, theworkouts, table='cpdata' - ) - - powerdf = pd.DataFrame({ - 'Delta': delta, - 'CP': cpvalue, - }) - - csvfilename = 'CP_data_user_{id}.csv'.format( - id=theuser - ) - - powerdf = powerdf[powerdf['CP'] > 0] - powerdf.dropna(axis=0, inplace=True) - powerdf.sort_values(['Delta', 'CP'], ascending=[1, 0], inplace=True) - powerdf.drop_duplicates(subset='Delta', keep='first', inplace=True) - powerdf.to_csv(csvfilename) - - _ = myqueue(queuehigh, - handle_sendemailfile, - 'Sander', - 'Roosendaal', - 'roosendaalsander@gmail.com', - csvfilename, - delete=True) - - successmessage = "The CSV file was sent to the site admin per email" - messages.info(request, successmessage) - response = HttpResponseRedirect('/rowers/list-workouts/') - - return response - - def agegrouprecordview(request, sex='male', weightcategory='hwt', distance=2000, duration=None):