From 0d4c6231a7d3cc2ced1a98c3027da5330b6b00e7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 4 Jan 2019 21:48:13 +0100 Subject: [PATCH] some more tests --- rowers/tests/mocks.py | 18 +++++++ rowers/tests/test_imports.py | 69 ++++++++++++++++++++++++-- rowers/tests/testdata/testdata.csv.gz | Bin 11511 -> 11426 bytes rowers/tests/testdata/testdata.tcx.gz | Bin 0 -> 4045 bytes rowers/views.py | 2 +- rowsandall_app/settings_dev.py | 1 + 6 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 rowers/tests/testdata/testdata.tcx.gz diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index e48495c8..6937e41c 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -125,6 +125,23 @@ def mocked_read_df_cols_sql(ids, columns, convertnewtons=True): return df, extracols +def mocked_stravaexport(f2,workoutname,stravatoken,description='', + activity_type='Rowing'): + print "this is mocked strava export" + return 1,'success' + +def StravaActivity(): + def wait(*args, **kwargs): + return 1 + +class MockStravalibClient(): + def upload_activity(*args, **kwargs): + return StravaActivity() + + def update_activity(*args, **kwargs): + return StravaActivity() + + class mocked_rowingdata(rowingdata): def __init__(self, *args, **kwargs): super(mocked_rowingdata).__init__(*args, **kwargs) @@ -271,6 +288,7 @@ def mocked_requests(*args, **kwargs): return MockResponse(json_data,200) + if not args: return MockSession() diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index fad25be5..115484f9 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -6,7 +6,7 @@ pytestmark = pytest.mark.django_db from bs4 import BeautifulSoup import re from nose_parameterized import parameterized -from django.test import TestCase, Client,override_settings +from django.test import TestCase, Client,override_settings, modify_settings from django.core.management import call_command from django.utils.six import StringIO from django.test.client import RequestFactory @@ -36,6 +36,8 @@ import rowers.c2stuff as c2stuff import json import numpy as np +import rowers + from rowers import urls from rowers.views import ( error500_view,error404_view,error400_view,error403_view @@ -278,9 +280,58 @@ class StravaObjects(DjangoTestCase): ) self.r.stravatoken = '12' + self.r.stravarefreshtoken = '123' self.r.save() self.c.login(username='john',password='koeinsloot') + self.nu = datetime.datetime.now() + + filename = 'rowers/tests/testdata/testdata.csv' + + rr = rrower(hrmax=self.r.max,hrut2=self.r.ut2, + hrut1=self.r.ut1,hrat=self.r.at, + hrtr=self.r.tr,hran=self.r.an,ftp=self.r.ftp) + row = rdata(filename,rower=rr) + totaldist = row.df['cum_dist'].max() + totaltime = row.df['TimeStamp (sec)'].max()-row.df['TimeStamp (sec)'].min() + totaltime = totaltime+row.df.ix[0,' ElapsedTime (sec)'] + + + hours = int(totaltime/3600.) + minutes = int((totaltime - 3600.*hours)/60.) + seconds = int(totaltime - 3600.*hours - 60.*minutes) + tenths = int(10*(totaltime - 3600.*hours - 60.*minutes - seconds)) + + duration = "%s:%s:%s.%s" % (hours,minutes,seconds,tenths) + + + workoutdate = row.rowdatetime.strftime('%Y-%m-%d') + workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') + + self.w = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) + + +# @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests) +# @patch('rowers.views.stravastuff.handle_stravaexport') + #@patch('rowers.dataprep.getsmallrowdata_db') + #def test_strava_upload(self, mock_post,MockStravalibClient, + # mocked_getsmallrowdata_db): + # def test_strava_upload(self,mock_post, mocked_stravaexport): + # response = self.c.get('/rowers/workout/1/stravauploadw/') + + # self.assertRedirects(response, + # expected_url = '/rowers/workout/1/edit/', + # status_code=302,target_status_code=200) + + # self.assertEqual(response.url, '/rowers/workout/1/edit/') + # self.assertEqual(response.status_code, 302) @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests) def test_strava_list(self, mock_get): @@ -289,16 +340,28 @@ class StravaObjects(DjangoTestCase): self.assertEqual(response.status_code,200) @patch('rowers.utils.requests.get', side_effect=mocked_requests) - def test_strava_import(self, mock_get): + @patch('rowers.dataprep.getsmallrowdata_db') + def test_strava_import(self, mock_get, + mocked_getsmallrowdata_db): response = self.c.get('/rowers/workout/stravaimport/12',follow=True) self.assertRedirects(response, - expected_url='/rowers/workout/1/edit/', + expected_url='/rowers/workout/2/edit/', status_code=301,target_status_code=200) self.assertEqual(response.status_code, 200) + @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests) + def test_strava_callback(self, mock_post): + response = self.c.get('/stravacall_back?code=absdef23',follow=True) + self.assertEqual(response.status_code, 200) + + @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests) + def test_strava_token_refresh(self, mock_post): + result = rowers.stravastuff.rower_strava_token_refresh(self.u) + self.assertEqual(result,"987654321234567898765432123456789") + #@pytest.mark.django_db diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index c8e1107351aae1553cc73d50275a17f91d536e0d..7e09e8115c40386c386423838988752971ee1a54 100644 GIT binary patch literal 11426 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≧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 w5V5Hb^v`{TaTo-aedFP(4zu0+PoIY$HY#M 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 diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz new file mode 100644 index 0000000000000000000000000000000000000000..2d9b5194e7b187fdb84a4ea71098218cae3f2819 GIT binary patch literal 4045 zcmV;;4>Ir{iwFpt#V=d}|8!+@bYx+4VJ>uIcmVC4-ESPX5y0OI^nVcikUkXQkuw}} zMo|>xt7rf_4H6^GTd|R^^0m@Q(5*l6-6H+-TEl)z1@BM==nHa zAFo!gUcEBs!_DPpYtF7NSLw^$+4J?~uv#N0IBd_>>8Rc2`1ZVyug->X|8xJ) z4IJr@dI{$B?%DK#e;dZnhl{J5&3d8AJp_b{H_?!Ugfl>2>``qdZoM-RRIjgJyL zM@J`bouKCw$FB_gz;qc z-qw3Ze6hLZ=*c?$648@B2^F|G43N{r7dc|8IwJ{n_>9 z9?-1ahHh;DKY(0#-Z`LmDdPbPo?)B4*l)VN+HA*nw&!mW4-b*~Gm`u7e{sw& zxFF+ygO&XehrWdSF9PEGFXHxP{K{K+=Mme7p74H;J88Ci|I$yt`Qdk~h6jcEd#6k% z{pT=_>3@)%tZx5$@2abG+4p|ruiR$l;lX#TfA?Yl*^yNs;Ly0`FpwX4T@XO13<3m` zq%MdC0!Y?XQ3&`D2%tJi;HfqU$Uu-}3Me2zYp^H;(iQ~4*9HL_N8nfmfs~a5XxoAy z)&_xhdvy>s5O_9F6ase;1gCYwLWRA9#w3BW zwONM52BXyl3Y;yC0Um?_REGi7Wfs7(OLu*RG)rJ8Z_Kc(}J?t1Xh5w$u_vW05haFd$pD+Q1){Q^4*pPGXSM zyoj#)3`ojG5!=I{wkV5J6V1~Ykcli_m1stAh2sXz zVNhG#fY^lSbhZJaGqNBIT(=E=8w1Rh$%xFV@DV02vuJ_34?U+aGX~z+z+NW}2nwf` zItFuN5DW(hpu!+vmj;JnfVE*DCO9VDc$0{Qr9teT!n_zbFc`(@Yy-x^CSvT;U}g-+ z00`)$f%w9~ANWwL<6H!JO!TzW_4-M5(el@2u!+Rh*TPb z=2}@pZ5Viy>_gGn2BC0Ab9)$2Z5Tv@L0OXOOSiI;?b2Xg47@dt1yDC3xA2@~YOS%I zd~FzjiK0w2dy%r$N6leSS=SQg%H(J{s+0mbyC`YU;|9|hutCQpIt-+H3T>s9$mO9o zxRHl}QN@LKYh;w5g1{~-L)G2ff4#c1? zhtcQCWO2&oHHvOg^#)xUOk?1UC($*p5tr^^>{C+b#vqzx8R*7bkd*FPirrI~83Qrm zMO4A$kTglJOm0dVI55Eps}jw@Eeiwe;iE|m$Y4~C#|+>KdkW2AP@7V4Y^)crsy7IE z9p|nT+Nn42xiUFA@v520ArDOI7_^gU_PH_{ghgi?5G<-P8T)*LNeqH<$u`g_g#d-) z2CZQbpf(KHgdn0?Pa#AsY#TI(L2aG_Cf^T4w*X&Y?1|>aF!0G!0No({AlMVlZ7GG^ zfW*r2n9+6&4#c1~Pa)4tcAyI%Md!3oohA|?Q%`lQ{EpAX-y@8L$lZ~qCqv)w@YUw}>DvTm>WfupswiR%p=?f}J=>tRxB*cPAL+W5Vhp{N^)L)-OEeQ38zkzK0*6I;3O$%S zfdQpAZ=yDe7$p|=6q=I;R2v3pe8NB_4cHc5vAsQM5Ng997>5#64kJ5Wlr-oVOk=<% zu;`lC7`SlUpgE<$m0^&JjH8gMK%G&#G&l?csSN{foYN`=UwApr_QFTCDFqiy6wnR5 zNqZL_ded4kIYMn1h{0qWsKQ5FdR5juVz^^4Ck6n#$DpOuQo;ZYkmx)Gfx>Go z~24i_m`Iy&Q3aUN@iLtO!2z|x&c`>-HOjge2Hj00OA2UHseKF_@gO1};ei4-Vr1YU3c}j#dO62OJh959;FpLv0+0At!-! z97rr|CpM=STxA>pvu96{mggXZkS+Wbb02CaCVzu-cTCm!fG za%CKNYpk&7;s-7ko}qkTiK^{><0J=YEQ%=Q0sBR9;JV*9$w9~*c%_{vRG0(o9L&rC z8;ROD64+4KZ-gFCoR9maP9E6WIEZ=472Q~M z2gr+>df<8->9;wEd3GvUbUMEgycEtexz;$4+BiVtt#TxigN2R8>hXhV4uU~Iuha|C z79M=yx}7*P2Vy|m+~|PaqNXXkUZ*<6fdk`2IU~)16kfNtJ-q<6aX@(xin3lAvsKYK zXh|=)XtFra$pdu0a2%=I2Qza3$>Jjky1F!kWi8Lw^9$1)py8nHXF?2%nwQt>k)}Ba zCNhZ5UqD}aEhgywjWcr~CNL}KA0U;UiUZwFoRPhJN1{6b59V;-X^%t{VCE^4K|9#@{`fJ`zD zP-iE4@;#2!R$TdZj;2@I2Z0tC*uStjQrb-%Ht_yOlRnqDC4;>w-j+N7 z%JWc2$w7d^eq*19GB*b?&%r>YUWm9TdC>L3BnQdjW3kHm17cs;U+8(~xj8@+JV)I; z6cXR#iEYJ|F_;*w)#aUo4U4Kn>2~5Y2V%U4vK}eqs6*Ea?bIjoab9_i#OdtB0L$uQ z>2tECIUwUvtj=!?$XzeA6<7A0IbdC1Tkx`|e&=3~G|54Z465@BA=qvoG{%89Kx#WN z+Fq~RQePYAIhqayl^n2J)LfiyCr)r6d5)&_Ldy7oK(AA6i~}%?+IV8LrPukkeLm96 z98lswNEbhd4h#1;+U_^b%mJI|wfzebO82qYo_C&?1LsU&wLHMmeJr-;ooD928$uSP zJn&RF-)Os?I5P*)Bn-S#9#AM;htloDnK^*uH4*9&Yt}NWo z1bu$uyc{?%01|Y5qmcCVTpNlfW)8?WWGx3l3d@5&S9fj>IQO+F;|IdF&&_Kno|rhe zUGH6)ZxnHT-g;vkpaBoMb$P(rK41Aj4&s~~yxDxW#K3SJN@8d{OHSz z_2qgy9{pv%=`Tmacw}EY%7fD!e{ep2bh5hL`S#e8yWhFraQAWZW{;E4Z_+Ehy7_tc zuZP6a&DE>juzfaMT6c&U_q6}>%@^M!w!eOH`Qtj> zpS2%ad;9On>fRS`Uc~;1r4Rd8zuBfo@_Bl(>zgmqgZVLCKYjH-I_<2zl8ONUY;elK literal 0 HcmV?d00001 diff --git a/rowers/views.py b/rowers/views.py index bf920f55..a2ab56d6 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -2252,7 +2252,7 @@ def workout_strava_upload_view(request,id=0): try: thetoken = strava_open(request.user) except NoTokenError: - return HttpResponseRedirect("/rowers/me/stravaauthorize") + return HttpResponseRedirect("/rowers/me/stravaauthorize/") if (r.stravatoken == '') or (r.stravatoken is None): s = "Token doesn't exist. Need to authorize" diff --git a/rowsandall_app/settings_dev.py b/rowsandall_app/settings_dev.py index 8443b40a..b4953f19 100644 --- a/rowsandall_app/settings_dev.py +++ b/rowsandall_app/settings_dev.py @@ -96,3 +96,4 @@ EMAIL_USE_TLS = CFG['email_use_tls'] DEFAULT_FROM_EMAIL = 'info@rowsandall.com' SETTINGS_NAME = 'rowsandall_app.settings_dev' +