diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 6b5bae94..ee9df88f 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1225,7 +1225,10 @@ def handle_nonpainsled(f2, fileformat, summary=''): try: os.remove(f_to_be_deleted) except: - os.remove(f_to_be_deleted + '.gz') + try: + os.remove(f_to_be_deleted + '.gz') + except: + pass return (f2, summary, oarlength, inboard, fileformat) diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index c3679e3b..2b01521c 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -150,3 +150,20 @@ class SessionFactory(factory.DjangoModelFactory): name = factory.LazyAttribute(lambda _: faker.word()) comment = faker.text() +@pytest.fixture(scope="session", autouse=True) +def cleanup(request): + def remove_test_files(): + + for filename in os.listdir('media/mailbox_attachments'): + path = os.path.join('media/mailbox_attachments/',filename) + if not os.path.isdir(path): + os.remove(path) + + for filename in os.listdir('rowers/tests/testdata/temp'): + path = os.path.join('rowers/tests/testdata/temp/',filename) + if not os.path.isdir(path): + os.remove(path) + + + request.addfinalizer(remove_test_files) + diff --git a/rowers/tests/test_emails.py b/rowers/tests/test_emails.py new file mode 100644 index 00000000..6970ad56 --- /dev/null +++ b/rowers/tests/test_emails.py @@ -0,0 +1,213 @@ +#from __future__ import print_function +from statements import * + +class EmailUpload(TestCase): + def setUp(self): + redis_connection.publish('tasks','KILL') + u = User.objects.create_user('john', + 'sander@ds.ds', + 'koeinsloot') + r = Rower.objects.create(user=u,gdproptin=True, + gdproptindate=timezone.now() + ) + + self.theadmin = UserFactory(is_staff=True) + self.rtheadmin = Rower.objects.create(user=self.theadmin, + birthdate = faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach') + + nu = datetime.datetime.now() + workoutsbox = Mailbox.objects.create(name='workouts') + workoutsbox.save() + failbox = Mailbox.objects.create(name='Failed') + failbox.save() + + m = Message(mailbox=workoutsbox, + from_header = u.email, + subject = "run", + body = """ +workout run + """) + m.save() + a2 = 'media/mailbox_attachments/colin3.csv' + copyfile('rowers/tests/testdata/emails/colin.csv',a2) + a = MessageAttachment(message=m,document=a2[6:]) + a.save() + + def tearDown(self): + for filename in os.listdir('media/mailbox_attachments'): + path = os.path.join('media/mailbox_attachments/',filename) + if not os.path.isdir(path): + try: + os.remove(path) + except (IOError,WindowsError): + pass + + @patch('rowers.dataprep.create_engine') + @patch('rowers.polarstuff.get_polar_notifications') + @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) + @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) + def test_emailupload( + self, mocked_sqlalchemy,mocked_polar_notifications, mock_get, mock_post): + out = StringIO() + call_command('processemail', stdout=out,testing=True) + self.assertIn('Successfully processed email attachments',out.getvalue()) + + ws = Workout.objects.filter(name="run") + + self.assertEqual(len(ws),1) + w = ws[0] + self.assertEqual(w.workouttype,'Run') + + + +#@pytest.mark.django_db +class EmailTests(TestCase): + def setUp(self): + redis_connection.publish('tasks','KILL') + u = User.objects.create_user('john', + 'sander@ds.ds', + 'koeinsloot') + r = Rower.objects.create(user=u,gdproptin=True, + gdproptindate=timezone.now() + ) + + self.theadmin = UserFactory(is_staff=True) + self.rtheadmin = Rower.objects.create(user=self.theadmin, + birthdate = faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach') + + nu = datetime.datetime.now() + workoutsbox = Mailbox.objects.create(name='workouts') + workoutsbox.save() + failbox = Mailbox.objects.create(name='Failed') + failbox.save() + + for filename in os.listdir(u'rowers/tests/testdata/emails'): + m = Message(mailbox=workoutsbox, + from_header = u.email, + subject = filename, + body=""" +--- +workouttype: water +boattype: 4x +... + """) + m.save() + a2 = 'media/mailbox_attachments/'+filename + copyfile(u'rowers/tests/testdata/emails/'+filename,a2) + a = MessageAttachment(message=m,document=a2[6:]) + a.save() + + m = Message(mailbox=workoutsbox, + from_header = u.email, + subject = "3x(5min/2min)/r2 \r2", + body = """ +workout water + """) + m.save() + a2 = 'media/mailbox_attachments/colin2.csv' + copyfile('rowers/tests/testdata/emails/colin.csv',a2) + a = MessageAttachment(message=m,document=a2[6:]) + a.save() + + m = Message(mailbox=workoutsbox, + from_header = self.theadmin.email, + subject = "johnsworkout", + body = """ +user john +race 1 + """) + m.save() + + def tearDown(self): + for filename in os.listdir('media/mailbox_attachments'): + path = os.path.join('media/mailbox_attachments/',filename) + if not os.path.isdir(path): + try: + os.remove(path) + except (IOError,WindowsError): + pass + + @patch('rowers.dataprep.create_engine') + @patch('rowers.polarstuff.get_polar_notifications') + @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) + @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) + def test_emailprocessing( + self, mocked_sqlalchemy,mocked_polar_notifications, mock_get, mock_post): + out = StringIO() + call_command('processemail', stdout=out,testing=True) + self.assertIn('Successfully processed email attachments',out.getvalue()) + + + +class EmailAdminUpload(TestCase): + def setUp(self): + redis_connection.publish('tasks','KILL') + u = User.objects.create_user('john', + 'sander@ds.ds', + 'koeinsloot') + r = Rower.objects.create(user=u,gdproptin=True, + gdproptindate=timezone.now() + ) + + self.theadmin = UserFactory(is_staff=True) + self.rtheadmin = Rower.objects.create(user=self.theadmin, + birthdate = faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach') + + nu = datetime.datetime.now() + workoutsbox = Mailbox.objects.create(name='workouts') + workoutsbox.save() + failbox = Mailbox.objects.create(name='Failed') + failbox.save() + + m = Message(mailbox=workoutsbox, + from_header = self.theadmin.email, + subject = "johnsworkout", + body = """ +user john +race 1 + """) + m.save() + a2 = 'media/mailbox_attachments/minute.csv' + copyfile('rowers/tests/testdata/minute.csv',a2) + a = MessageAttachment(message=m,document=a2[6:]) + a.save() + + def tearDown(self): + for filename in os.listdir('media/mailbox_attachments'): + path = os.path.join('media/mailbox_attachments/',filename) + if not os.path.isdir(path): + try: + os.remove(path) + except (IOError,WindowsError): + pass + + @patch('rowers.dataprep.create_engine') + @patch('rowers.polarstuff.get_polar_notifications') + @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) + @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) + def test_email_admin_upload( + self, mocked_sqlalchemy,mocked_polar_notifications, mock_get, mock_post): + out = StringIO() + call_command('processemail', stdout=out,testing=True) + self.assertIn('Successfully processed email attachments',out.getvalue()) + + ws = Workout.objects.filter(name="johnsworkout") + if not len(ws): + for w in Workout.objects.all(): + print w + + self.assertEqual(len(ws),1) + + w = ws[0] + self.assertEqual(w.user.user.username,u'john') + + diff --git a/rowers/tests/test_zemails.py b/rowers/tests/test_zemails.py deleted file mode 100644 index 2d79f37f..00000000 --- a/rowers/tests/test_zemails.py +++ /dev/null @@ -1,164 +0,0 @@ -#from __future__ import print_function -import pytest - -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.core.management import call_command -from django.utils.six import StringIO -from django.test.client import RequestFactory -from rowers.views import checkworkoutuser,c2_open -from rowers.models import Workout, User, Rower, WorkoutForm,RowerForm,GraphImage -from rowers.forms import DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail -import rowers.plots as plots -import rowers.interactiveplots as iplots -import datetime -from rowingdata import rowingdata as rdata -from rowingdata import rower as rrower -from django.utils import timezone -from rowers.rows import handle_uploaded_file -from django.core.files.uploadedfile import SimpleUploadedFile -from time import strftime,strptime,mktime,time,daylight -import os -from rowers.tasks import handle_makeplot -from rowers.utils import serialize_list,deserialize_list -from rowers.utils import NoTokenError -from shutil import copyfile -from nose.tools import assert_true -from mock import Mock, patch -from minimocktest import MockTestCase -import pandas as pd -import rowers.c2stuff as c2stuff - -import json -import numpy as np - -from rowers import urls -from rowers.views import error500_view,error404_view,error400_view,error403_view - -from rowers.dataprep import delete_strokedata - -from redis import StrictRedis -redis_connection = StrictRedis() - -from rowers.tests.test_imports import mocked_requests - - -from django_mailbox.models import Mailbox,MessageAttachment,Message - -from rowers.tests.mocks import mocked_sqlalchemy - - -@pytest.mark.django_db -class UploadTests(TestCase): - def setUp(self): - redis_connection.publish('tasks','KILL') - u = User.objects.create_user('john', - 'sander@ds.ds', - 'koeinsloot') - r = Rower.objects.create(user=u,gdproptin=True, - gdproptindate=timezone.now(), - getemailnotifications = False, - ) - - nu = datetime.datetime.now() - workoutsbox = Mailbox.objects.create(name='workouts') - workoutsbox.save() - failbox = Mailbox.objects.create(name='Failed') - failbox.save() - m = Message(mailbox=workoutsbox, - from_header = u.email, - subject = "3x(5min/2min)/r2 \r2", - body = """ -workout run - """) - m.save() - a2 = 'media/mailbox_attachments/colin2.csv' - copyfile('rowers/tests/testdata/emails/colin.csv',a2) - a = MessageAttachment(message=m,document=a2[6:]) - a.save() - - def tearDown(self): - for filename in os.listdir('media/mailbox_attachments'): - path = os.path.join('media/mailbox_attachments/',filename) - if not os.path.isdir(path): - try: - os.remove(path) - except (IOError,WindowsError): - pass - - @patch('requests.get', side_effect=mocked_requests) - def test_email_workouttype(self, mock_get): - out = StringIO() - call_command('processemail', stdout=out, testing=True) - w = Workout.objects.get(id=1) - self.assertEqual(w.workouttype,'Run') - -#@pytest.mark.django_db -class EmailTests(TestCase): - def setUp(self): - redis_connection.publish('tasks','KILL') - u = User.objects.create_user('john', - 'sander@ds.ds', - 'koeinsloot') - r = Rower.objects.create(user=u,gdproptin=True, - gdproptindate=timezone.now() - ) - - nu = datetime.datetime.now() - workoutsbox = Mailbox.objects.create(name='workouts') - workoutsbox.save() - failbox = Mailbox.objects.create(name='Failed') - failbox.save() - - for filename in os.listdir(u'rowers/tests/testdata/emails'): - m = Message(mailbox=workoutsbox, - from_header = u.email, - subject = filename, - body=""" ---- -workouttype: water -boattype: 4x -... - """) - m.save() - a2 = 'media/mailbox_attachments/'+filename - copyfile(u'rowers/tests/testdata/emails/'+filename,a2) - a = MessageAttachment(message=m,document=a2[6:]) - a.save() - - m = Message(mailbox=workoutsbox, - from_header = u.email, - subject = "3x(5min/2min)/r2 \r2", - body = """ -workout water - """) - m.save() - a2 = 'media/mailbox_attachments/colin2.csv' - copyfile('rowers/tests/testdata/emails/colin.csv',a2) - a = MessageAttachment(message=m,document=a2[6:]) - a.save() - - - def tearDown(self): - for filename in os.listdir('media/mailbox_attachments'): - path = os.path.join('media/mailbox_attachments/',filename) - if not os.path.isdir(path): - try: - os.remove(path) - except (IOError,WindowsError): - pass - - @patch('rowers.dataprep.create_engine') - @patch('rowers.polarstuff.get_polar_notifications') - @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) - @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) - def test_emailprocessing( - self, mocked_sqlalchemy,mocked_polar_notifications, mock_get, mock_post): - out = StringIO() - call_command('processemail', stdout=out,testing=True) - self.assertIn('Successfully processed email attachments',out.getvalue()) - diff --git a/rowers/tests/testdata/minute.csv b/rowers/tests/testdata/minute.csv new file mode 100644 index 00000000..9bbf31bb --- /dev/null +++ b/rowers/tests/testdata/minute.csv @@ -0,0 +1,18 @@ +index,TimeStamp (sec), activityIdx, lapIdx, pointIdx, ElapsedTime (sec), Horizontal (meters), Stroke500mPace (sec/500m), Cadence (strokes/min), HRCur (bpm), Power (watts), Calories (kCal), Speed (m/sec), StrokeCount, StrokeDistance (meters), DriveLength (meters), DriveTime (ms), StrokeRecoveryTime (ms), WorkPerStroke (joules), AverageDriveForce (lbs), PeakDriveForce (lbs), DragFactor, ElapsedTimeAtDrive (sec), HorizontalAtDrive (meters), WorkoutType, IntervalType, WorkoutState, RowingState, WorkoutDurationType, WorkoutIntervalCount, Cadence (stokes/min), AverageBoatSpeed (m/s), AverageDriveForce (N), PeakDriveForce (N), Stroke Number,cum_dist,originalvelo +0,1548096824.0,0,0,0,4.18,20.3,93.3506356168139,48,86,436.5048883104004,1,5.3820000000000014,4,6.79,1.36,500,560,0,142.4,222.0,115,0.0,0.0,5,0,1,1,0,0,48.0,5.353892279687333,633.4265280000002,987.50484,2,20.3,5.353892279687333 +1,1548096826.7910905,0,0,1,6.94,35.9,89.62484388832563,45,87,496.4816892895996,2,5.6179999999999986,6,8.15,1.42,490,730,0,142.3,238.8,113,4.18,20.3,5,0,1,1,0,0,45.0,5.587840858292355,632.9817059999998,1062.2349359999996,4,35.9,5.587840858292355 +2,1548096837.108201,0,0,2,17.27,94.5,88.81577825856567,41,96,504.2099300644,8,5.647,13,8.19,1.36,480,770,0,144.0,242.9,112,6.94,35.9,5,0,1,1,0,0,41.0,5.616084465910367,640.54368,1080.4726380000004,11,94.5,5.616084465910367 +3,1548096839.086601,0,0,3,19.25,105.7,88.96490450858349,41,99,504.2099300644,8,5.647,14,8.19,1.39,480,750,0,142.0,244.6,112,17.27,94.5,5,0,1,1,0,0,41.0,5.616084465910367,631.64724,1088.034612,12,105.7,5.616084465910367 +4,1548096842.8994308,0,0,4,23.07,127.2,89.27586762584984,41,104,501.8029914016,11,5.638,17,8.12,1.36,470,760,0,143.6,251.4,112,19.25,105.7,5,0,1,1,0,0,41.0,5.607267018055401,638.7643919999998,1118.282508,15,127.2,5.607267018055401 +5,1548096847.161281,0,0,5,27.31,151.1,89.89298681607487,41,110,489.62041712640007,14,5.5920000000000005,20,8.11,1.36,490,760,0,133.6,231.0,111,23.07,127.2,5,0,1,1,0,0,41.0,5.561116672227786,594.282192,1027.53882,18,151.1,5.561116672227786 +6,1548096850.1555116,0,0,6,30.31,167.8,90.29743877919012,41,112,480.4843223404,15,5.557,22,8.47,1.39,490,820,0,143.9,234.4,111,27.31,151.1,5,0,1,1,0,0,41.0,5.526693931690064,640.0988580000002,1042.662768,20,167.8,5.526693931690064 +7,1548096853.1276512,0,0,7,33.28,184.3,90.39988760767656,40,113,484.1249963508004,17,5.5710000000000015,24,8.24,1.36,490,800,0,138.4,254.1,111,30.31,167.8,5,0,1,1,0,0,40.0,5.540780141843972,615.633648,1130.292702,22,184.3,5.540780141843972 +8,1548096856.0643613,0,0,8,36.21,200.5,90.61884542605642,41,115,477.8950465044004,18,5.5470000000000015,26,8.1,1.36,480,770,0,135.5,227.6,111,33.28,184.3,5,0,1,1,0,0,41.0,5.516936996579499,602.7338100000002,1012.4148720000001,24,200.5,5.516936996579499 +9,1548096859.0091813,0,0,9,39.17,216.8,91.12253138918642,41,116,468.9058576384001,20,5.5120000000000005,28,8.1,1.36,500,770,0,132.7,232.4,111,36.21,200.5,5,0,1,1,0,0,41.0,5.483057352779911,590.2787940000002,1033.766328,26,216.8,5.483057352779911 +10,1548096862.008181,0,0,10,42.16,233.2,91.7159092344983,40,117,462.8074479616,21,5.488,30,8.24,1.33,470,810,0,130.6,218.9,111,39.17,216.8,5,0,1,1,0,0,40.0,5.459111256687411,580.937532,973.715358,28,233.2,5.459111256687411 +11,1548096866.4157307,0,0,11,46.57,257.2,92.13100908526968,41,118,452.5120589444,24,5.447,33,7.89,1.33,470,760,0,133.0,227.5,111,42.16,233.2,5,0,1,1,0,0,41.0,5.417705060136527,591.61326,1011.97005,31,257.2,5.417705060136527 +12,1548096869.206501,0,0,12,49.36,272.4,92.30771272248859,43,118,452.7613310976001,25,5.448,35,7.6,1.3,460,710,0,131.0,208.0,111,46.57,257.2,5,0,1,1,0,0,43.0,5.418879375745096,582.71682,925.2297599999999,33,272.4,5.418879375745096 +13,1548096872.1160307,0,0,13,52.27,288.2,92.39395707918017,42,119,451.2670704864,26,5.442,37,7.96,1.33,480,770,0,132.8,222.3,111,49.36,272.4,5,0,1,1,0,0,42.0,5.413598960589,590.7236160000001,988.839306,35,288.2,5.413598960589 +14,1548096875.085701,0,0,14,55.24,304.2,92.99397114111812,41,119,442.6160316004,28,5.407,39,8.02,1.3,480,790,0,128.7,230.0,111,52.27,288.2,5,0,1,1,0,0,41.0,5.378657487091222,572.485914,1023.0906,37,304.2,5.378657487091222 +15,1548096878.0252109,0,0,15,58.2,319.9,94.06681282362852,41,119,426.8444927264001,29,5.3420000000000005,41,7.95,1.27,490,820,0,123.4,213.1,111,55.24,304.2,5,0,1,1,0,0,41.0,5.314061005420342,548.910348,947.9156820000001,39,319.9,5.314061005420342 +16,1548096880.0612912,0,0,16,60.0,329.3,95.37595742617708,40,120,409.81691239999986,30,5.27,42,8.03,1.27,490,840,0,110.4,193.6,111,58.2,319.9,5,0,10,0,0,0,40.0,5.242738806752646,491.08348800000016,861.175392,40,329.3,5.242738806752646 diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index a67f9afc..58a8c763 100644 Binary files a/rowers/tests/testdata/testdata.csv.gz and b/rowers/tests/testdata/testdata.csv.gz differ diff --git a/rowers/tests/testdata/testdata.tcx b/rowers/tests/testdata/testdata.tcx index 57cf726e..fd392944 100644 --- a/rowers/tests/testdata/testdata.tcx +++ b/rowers/tests/testdata/testdata.tcx @@ -2502,7 +2502,7 @@ - <Element 'Notes' at 0x13f67128> + <Element 'Notes' at 0x14011cc0>