From 128609968a07a76e64ada5598ad5f0264e166355 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Wed, 2 Jan 2019 20:16:08 +0100
Subject: [PATCH 01/18] working with pytest
---
.gitignore | 4 +
rowers/mailprocessing.py | 4 +-
rowers/tests/tests.py | 227 +++++++++++++++++++++++++++++++--------
3 files changed, 189 insertions(+), 46 deletions(-)
diff --git a/.gitignore b/.gitignore
index 8b1d4df3..6e393dc4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,10 @@
/htmlcov/
.coverage
+# pytest stuff
+/.pytest_cache/
+pytest.ini
+
# CSV files
/media/
diff --git a/rowers/mailprocessing.py b/rowers/mailprocessing.py
index ee8b23a1..95077670 100644
--- a/rowers/mailprocessing.py
+++ b/rowers/mailprocessing.py
@@ -9,8 +9,8 @@ from rowers.tasks import (
)
from django_mailbox.models import Message, MessageAttachment,Mailbox
-workoutmailbox = Mailbox.objects.get(name='workouts')
-failedmailbox = Mailbox.objects.get(name='Failed')
+#workoutmailbox = Mailbox.objects.get(name='workouts')
+#failedmailbox = Mailbox.objects.get(name='Failed')
from rowers.models import User, Rower, RowerForm
diff --git a/rowers/tests/tests.py b/rowers/tests/tests.py
index 43ba5ceb..11147a79 100644
--- a/rowers/tests/tests.py
+++ b/rowers/tests/tests.py
@@ -1,4 +1,8 @@
#from __future__ import print_function
+import pytest
+
+pytestmark = pytest.mark.django_db
+
from bs4 import BeautifulSoup
import re
from nose_parameterized import parameterized
@@ -40,7 +44,7 @@ from rowers.dataprep import delete_strokedata
from redis import StrictRedis
redis_connection = StrictRedis()
-
+@pytest.mark.django_db
class DjangoTestCase(TestCase, MockTestCase):
def _pre_setup(self):
MockTestCase.setUp(self)
@@ -376,7 +380,7 @@ def mocked_requests(*args, **kwargs):
return MockResponse(None,404)
-
+@pytest.mark.django_db
class C2Objects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -509,6 +513,7 @@ class C2Objects(DjangoTestCase):
res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
+@pytest.mark.django_db
class StravaObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -547,6 +552,7 @@ class StravaObjects(DjangoTestCase):
+@pytest.mark.django_db
class STObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -664,6 +670,7 @@ class STObjects(DjangoTestCase):
res = add_workout_from_data(self.u,1,data,data)
+@pytest.mark.django_db
class RunKeeperObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -755,6 +762,7 @@ class RunKeeperObjects(DjangoTestCase):
+@pytest.mark.django_db
class UAObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -855,6 +863,7 @@ class UAObjects(DjangoTestCase):
self.assertEqual(response.status_code, 200)
+@pytest.mark.django_db
class TPObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -940,6 +949,7 @@ class TPObjects(DjangoTestCase):
+@pytest.mark.django_db
class TestErrorPages(TestCase):
def test_error_handlers(self):
@@ -954,6 +964,7 @@ class TestErrorPages(TestCase):
self.assertEqual(response.status_code, 500)
self.assertIn('500 Internal Server Error', unicode(response))
+@pytest.mark.django_db
class NewUserRegistrationTest(TestCase):
def setUp(self):
self.c = Client()
@@ -1030,7 +1041,10 @@ boattype: 2x
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)
+ try:
+ os.remove(path)
+ except WindowsError:
+ pass
@patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
@patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
@@ -1072,7 +1086,7 @@ workout run
if not os.path.isdir(path):
try:
os.remove(path)
- except IOError:
+ except (IOError,WindowsError):
pass
@patch('requests.get', side_effect=mocked_requests)
@@ -1133,7 +1147,7 @@ workout water
if not os.path.isdir(path):
try:
os.remove(path)
- except IOError:
+ except (IOError,WindowsError):
pass
@patch('requests.get', side_effect=mocked_requests)
@@ -1450,7 +1464,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
@@ -1504,7 +1521,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
@@ -1539,7 +1559,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
def test_upload_view_logcard(self):
self.c.login(username='john',password='koeinsloot')
@@ -1615,7 +1638,10 @@ class ViewTest(TestCase):
self.assertEqual(response.status_code, 200)
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
def test_upload_view_TCX_SpeedCoach2a(self):
self.c.login(username='john',password='koeinsloot')
@@ -1646,7 +1672,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
def test_upload_view_TCX_SpeedCoach2b(self):
self.c.login(username='john',password='koeinsloot')
@@ -1677,7 +1706,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
@@ -1710,7 +1742,11 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
+
def test_upload_view_SpeedCoach2v127(self):
self.c.login(username='john',password='koeinsloot')
@@ -1741,7 +1777,11 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
+
def test_upload_view_SpeedCoach2v127intervals(self):
@@ -1773,7 +1813,11 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
+
def test_upload_view_TCX_NoHR(self):
@@ -1805,7 +1849,11 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
+
def test_upload_view_TCX_CN(self):
self.c.login(username='john',password='koeinsloot')
@@ -1833,7 +1881,11 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
+
def test_upload_view_RP(self):
self.c.login(username='john',password='koeinsloot')
@@ -1861,7 +1913,11 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
+
def test_upload_view_Mystery(self):
self.c.login(username='john',password='koeinsloot')
@@ -1889,7 +1945,11 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
+
def test_upload_view_RP_interval(self):
self.c.login(username='john',password='koeinsloot')
@@ -1917,7 +1977,11 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
+
def test_upload_view_sled_desktop(self):
@@ -1946,7 +2010,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
def test_upload_view_sled_ergdata(self):
self.c.login(username='john',password='koeinsloot')
@@ -1974,7 +2041,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
def test_upload_view_sled_boatcoach(self):
self.c.login(username='john',password='koeinsloot')
@@ -2002,7 +2072,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
def test_upload_view_sled_ergstick(self):
self.c.login(username='john',password='koeinsloot')
@@ -2030,7 +2103,10 @@ class ViewTest(TestCase):
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
- os.remove(f_to_be_deleted+'.gz')
+ try:
+ os.remove(f_to_be_deleted+'.gz')
+ except WindowsError:
+ pass
# def test_upload_view_FIT_SpeedCoach2a(self):
@@ -2398,7 +2474,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 1
if (w.workouttype=='water'):
@@ -2408,7 +2487,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 2
if (w.workouttype=='water'):
@@ -2418,7 +2500,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 3
if (w.workouttype=='water'):
@@ -2428,7 +2513,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 4
if (w.workouttype=='water'):
@@ -2438,7 +2526,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 5
if (w.workouttype=='water'):
@@ -2448,7 +2539,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 6
if (w.workouttype=='water'):
@@ -2458,7 +2552,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 7
if (w.workouttype=='water'):
@@ -2468,7 +2565,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 8
if (w.workouttype=='water'):
@@ -2478,7 +2578,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 13
if (w.workouttype=='water'):
@@ -2488,7 +2591,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
def test_otw_plots(self):
w = self.wotw
@@ -2505,7 +2611,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 1
if (w.workouttype=='water'):
@@ -2515,7 +2624,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 2
if (w.workouttype=='water'):
@@ -2525,7 +2637,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 3
if (w.workouttype=='water'):
@@ -2535,7 +2650,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 4
if (w.workouttype=='water'):
@@ -2545,7 +2663,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 5
if (w.workouttype=='water'):
@@ -2555,7 +2676,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 6
if (w.workouttype=='water'):
@@ -2565,7 +2689,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 7
if (w.workouttype=='water'):
@@ -2575,7 +2702,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 8
if (w.workouttype=='water'):
@@ -2585,7 +2715,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 9
if (w.workouttype=='water'):
@@ -2595,7 +2728,10 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
plotnr = 13
if (w.workouttype=='water'):
@@ -2605,4 +2741,7 @@ class PlotTests(TestCase):
w.name,self.hrdata,plotnr,imagename)
i = GraphImage(workout=w,creationdatetime=self.nu,
filename=fullpathimagename)
- os.remove(fullpathimagename)
+ try:
+ os.remove(fullpathimagename)
+ except WindowsError:
+ pass
From 76d2325797ad3a179ec3d727b4fc823047b71dd2 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Wed, 2 Jan 2019 21:54:25 +0100
Subject: [PATCH 02/18] adding tests to increase coverage
---
.gitignore | 1 +
rowers/celery.py | 6 +-
rowers/plots.py | 8 +-
rowers/tests/test_admin.py | 47 +
rowers/tests/test_admin.py,cover | 47 +
rowers/tests/test_models.py | 14 +
rowers/tests/test_user.py | 89 +
rowers/tests/test_user.py,cover | 94 +
rowers/tests/tests.py | 103 +-
rowers/tests/tests.py,cover | 2831 ++++++++++++++++++++++++++++++
10 files changed, 3224 insertions(+), 16 deletions(-)
create mode 100644 rowers/tests/test_admin.py
create mode 100644 rowers/tests/test_admin.py,cover
create mode 100644 rowers/tests/test_models.py
create mode 100644 rowers/tests/test_user.py
create mode 100644 rowers/tests/test_user.py,cover
create mode 100644 rowers/tests/tests.py,cover
diff --git a/.gitignore b/.gitignore
index 6e393dc4..665c5589 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
# pytest stuff
/.pytest_cache/
pytest.ini
+conftest.py
# CSV files
/media/
diff --git a/rowers/celery.py b/rowers/celery.py
index 8ecc91a9..77d84ba3 100644
--- a/rowers/celery.py
+++ b/rowers/celery.py
@@ -30,7 +30,7 @@ app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
database_url = 'sqlite:///db.sqlite3'
-@app.task(bind=True)
-def debug_task(self):
- print('Request: {0!r}'.format(self.request))
+#@app.task(bind=True)
+#def debug_task(self):
+# print('Request: {0!r}'.format(self.request))
diff --git a/rowers/plots.py b/rowers/plots.py
index b57d263e..948ddd94 100644
--- a/rowers/plots.py
+++ b/rowers/plots.py
@@ -6,10 +6,10 @@ from rows import format_pace_tick, format_pace, format_time, format_time_tick
# Formatting the distance tick marks
-def format_dist_tick(x,pos=None):
- km = x/1000.
- template='%6.3f'
- return template % (km)
+#def format_dist_tick(x,pos=None):
+# km = x/1000.
+# template='%6.3f'
+# return template % (km)
# Utility to select reasonable y axis range
diff --git a/rowers/tests/test_admin.py b/rowers/tests/test_admin.py
new file mode 100644
index 00000000..230c6221
--- /dev/null
+++ b/rowers/tests/test_admin.py
@@ -0,0 +1,47 @@
+#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
+import datetime
+
+import json
+import numpy as np
+
+
+from redis import StrictRedis
+redis_connection = StrictRedis()
+
+from rowers.models import User,Rower
+
+@pytest.mark.django_db
+class AdminTests(TestCase):
+ def setUp(self):
+ u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+ r = Rower.objects.create(user=u)
+ my_admin = User.objects.create_superuser('myuser',
+ 'myemail@test.com',
+ 'apensstaart')
+
+ self.c = Client()
+ self.c.login(username='myuser',password='apensstaart')
+
+ def test_admin(self):
+ response = self.c.get('/admin',follow=True)
+ self.assertEqual(response.status_code,200)
+
+
+ response = self.c.get('/admin/auth/user/',follow=True)
+ self.assertEqual(response.status_code,200)
+
+ response = self.c.get('/admin/auth/user/77/change/',follow=True)
+ self.assertEqual(response.status_code,200)
diff --git a/rowers/tests/test_admin.py,cover b/rowers/tests/test_admin.py,cover
new file mode 100644
index 00000000..083f75f0
--- /dev/null
+++ b/rowers/tests/test_admin.py,cover
@@ -0,0 +1,47 @@
+ #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
+> import datetime
+
+> import json
+> import numpy as np
+
+
+> from redis import StrictRedis
+> redis_connection = StrictRedis()
+
+> from rowers.models import User,Rower
+
+> @pytest.mark.django_db
+> class AdminTests(TestCase):
+> def setUp(self):
+> u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+> r = Rower.objects.create(user=u)
+> my_admin = User.objects.create_superuser('myuser',
+> 'myemail@test.com',
+> 'apensstaart')
+
+> self.c = Client()
+> self.c.login(username='myuser',password='apensstaart')
+
+> def test_admin(self):
+> response = self.c.get('/admin',follow=True)
+> self.assertEqual(response.status_code,200)
+
+
+> response = self.c.get('/admin/auth/user/',follow=True)
+> self.assertEqual(response.status_code,200)
+
+> response = self.c.get('/admin/auth/user/77/change/',follow=True)
+> self.assertEqual(response.status_code,200)
diff --git a/rowers/tests/test_models.py b/rowers/tests/test_models.py
new file mode 100644
index 00000000..42f9bf71
--- /dev/null
+++ b/rowers/tests/test_models.py
@@ -0,0 +1,14 @@
+from django.test import TestCase
+from rowers.models import *
+
+class FormTests(TestCase):
+ def SetUp(self):
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ r = Rower.objects.create(user=u)
+
+
+ def test_form(self):
+ form = TeamInviteForm()
diff --git a/rowers/tests/test_user.py b/rowers/tests/test_user.py
new file mode 100644
index 00000000..3a91de7d
--- /dev/null
+++ b/rowers/tests/test_user.py
@@ -0,0 +1,89 @@
+#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
+import datetime
+from django.utils import timezone
+
+import json
+import numpy as np
+import rowers.dataprep as dataprep
+
+from redis import StrictRedis
+redis_connection = StrictRedis()
+
+from rowers.models import User,Rower, Workout
+
+class UserMiddleWareTest(TestCase):
+ def setUp(self):
+ u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+ r = Rower.objects.create(user=u)
+
+ self.c = Client()
+ self.c.login(username='john',password='koeinsloot')
+ nu = datetime.datetime.now()
+
+ response = dataprep.new_workout_from_file(r,'/media/testdata.csv.gz',
+ title='sample')
+
+ newworkoutid = response[0]
+ self.w = Workout.objects.get(id=newworkoutid)
+
+
+ def test_middleware(self):
+ response = self.c.get('/rowers/list-workouts',follow=True)
+ self.assertEqual(response.status_code,200)
+
+class UserExpireTest(TestCase):
+ def setUp(self):
+ redis_connection.publish('tasks','KILL')
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ yesterday_dt = timezone.now()-datetime.timedelta(days=1)
+ yesterday = yesterday_dt.date()
+
+ r = Rower.objects.create(user=self.u,planexpires = yesterday,rowerplan='pro',
+ paymenttype='single')
+
+ self.c = Client()
+ self.c.login(username='john',password='koeinsloot')
+ nu = datetime.datetime.now()
+
+ response = dataprep.new_workout_from_file(r,'/media/testdata.csv.gz',
+ title='sample')
+
+ newworkoutid = response[0]
+ self.w = Workout.objects.get(id=newworkoutid)
+
+
+ def test_expire(self):
+ response = self.c.get('/rowers/list-workouts',follow=True)
+ self.assertEqual(response.status_code,200)
+ self.assertEqual(self.u.rower.rowerplan,'basic')
+
+class UserTestsNoRower(TestCase):
+ def setUp(self):
+ u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.c = Client()
+ self.c.login(username='john',password='koeinsloot')
+
+
+ def test_user(self):
+ response = self.c.get('/rowers/list-workouts',follow=True)
+ self.assertEqual(response.status_code,200)
+
diff --git a/rowers/tests/test_user.py,cover b/rowers/tests/test_user.py,cover
new file mode 100644
index 00000000..5ece6fa8
--- /dev/null
+++ b/rowers/tests/test_user.py,cover
@@ -0,0 +1,94 @@
+ #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
+> import datetime
+! from django.utils import timezone
+
+> import json
+! import numpy as np
+
+
+> from redis import StrictRedis
+! redis_connection = StrictRedis()
+
+! from rowers.models import User,Rower, Workout
+
+> class UserMiddleWareTest(TestCase):
+> def setUp(self):
+> u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+! r = Rower.objects.create(user=u)
+
+> self.c = Client()
+! self.c.login(username='john',password='koeinsloot')
+> nu = datetime.datetime.now()
+
+> response = dataprep.new_workout_from_file(r,'/media/testdata.csv.gz',
+> title='sample')
+
+! newworkoutid = response[0]
+! self.w = Workout.objects.get(id=newworkoutid)
+
+
+! def test_middleware(self):
+! response = self.c.get('/rowers/list-workouts',follow=True)
+! self.assertEqual(response.status_code,200)
+
+! class UserExpireTest(TestCase):
+! def setUp(self):
+! redis_connection.publish('tasks','KILL')
+! self.u = User.objects.create_user('john',
+! 'sander@ds.ds',
+! 'koeinsloot')
+
+! yesterday_dt = timezone.now()-datetime.timedelta(days=1)
+! yesterday = yesterday_dt.date()
+
+! r = Rower.objects.create(user=self.u,planexpires = yesterday,rowerplan='pro',
+! paymenttype='single')
+
+! self.c = Client()
+! self.c.login(username='john',password='koeinsloot')
+! nu = datetime.datetime.now()
+
+! response = dataprep.new_workout_from_file(r,'/media/testdata.csv.gz',
+! title='sample')
+
+! newworkoutid = response[0]
+! self.w = Workout.objects.get(id=newworkoutid)
+
+
+! def test_expire(self):
+! response = self.c.get('/rowers/list-workouts',follow=True)
+! self.assertEqual(response.status_code,200)
+! self.assertEqual(self.u.rower.rowerplan,'basic')
+
+! class UserTestsNoRower(TestCase):
+! def setUp(self):
+! u = User.objects.create_user('john',
+! 'sander@ds.ds',
+! 'koeinsloot')
+
+! self.c = Client()
+! self.c.login(username='john',password='koeinsloot')
+! nu = datetime.datetime.now()
+! self.w = Workout.objects.create(name='testworkout',
+! workouttype='water',
+! user=self.r,date=nu.strftime('%Y-%m-%d'),
+! starttime=nu.strftime('%H:%M:%S'),
+! duration="0:55:00",distance=8000)
+
+! def test_user(self):
+! response = self.c.get('/rowers/list-workouts',follow=True)
+! self.assertEqual(response.status_code,200)
+
diff --git a/rowers/tests/tests.py b/rowers/tests/tests.py
index 11147a79..ee207208 100644
--- a/rowers/tests/tests.py
+++ b/rowers/tests/tests.py
@@ -44,7 +44,7 @@ from rowers.dataprep import delete_strokedata
from redis import StrictRedis
redis_connection = StrictRedis()
-@pytest.mark.django_db
+#@pytest.mark.django_db
class DjangoTestCase(TestCase, MockTestCase):
def _pre_setup(self):
MockTestCase.setUp(self)
@@ -355,6 +355,7 @@ def mocked_requests(*args, **kwargs):
elif c2workoutlisttester.match(args[0]):
return MockResponse(c2workoutlist,200)
elif 'access_token' in args[0]:
+ print 'aap'
json_data = {
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
'expires_in': 604800,
@@ -380,7 +381,7 @@ def mocked_requests(*args, **kwargs):
return MockResponse(None,404)
-@pytest.mark.django_db
+#@pytest.mark.django_db
class C2Objects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -512,8 +513,82 @@ class C2Objects(DjangoTestCase):
res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
+class C2ObjectsTokenExpired(DjangoTestCase):
+ def setUp(self):
+ self.c = Client()
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'John'
+ self.u.last_name = 'Sander'
+ self.u.save()
+ self.r = Rower.objects.create(user=self.u,gdproptin=True,
+ gdproptindate=timezone.now()
+ )
+
+ self.r.c2token = '12'
+ self.r.c2refreshtoken = 'ab'
+ self.r.tokenexpirydate = datetime.datetime.now()-datetime.timedelta(days=1)
+ self.r.save()
+ self.c.login(username='john',password='koeinsloot')
+
+ self.nu = datetime.datetime.now()
-@pytest.mark.django_db
+ 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.c2stuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+ def test_c2_list(self, mock_get, mock_post):
+ response = self.c.get('/rowers/workout/c2list',follow=True)
+
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+ def test_c2_import(self, mock_get):
+
+ response = self.c.get('/rowers/workout/c2import/12/',follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/workout/2/edit',
+ status_code=302,target_status_code=200)
+
+ self.assertEqual(response.status_code, 200)
+
+
+
+#@pytest.mark.django_db
class StravaObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -552,7 +627,7 @@ class StravaObjects(DjangoTestCase):
-@pytest.mark.django_db
+#@pytest.mark.django_db
class STObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -670,7 +745,7 @@ class STObjects(DjangoTestCase):
res = add_workout_from_data(self.u,1,data,data)
-@pytest.mark.django_db
+#@pytest.mark.django_db
class RunKeeperObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -762,7 +837,7 @@ class RunKeeperObjects(DjangoTestCase):
-@pytest.mark.django_db
+#@pytest.mark.django_db
class UAObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -863,7 +938,7 @@ class UAObjects(DjangoTestCase):
self.assertEqual(response.status_code, 200)
-@pytest.mark.django_db
+#@pytest.mark.django_db
class TPObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -949,7 +1024,7 @@ class TPObjects(DjangoTestCase):
-@pytest.mark.django_db
+#@pytest.mark.django_db
class TestErrorPages(TestCase):
def test_error_handlers(self):
@@ -964,7 +1039,7 @@ class TestErrorPages(TestCase):
self.assertEqual(response.status_code, 500)
self.assertIn('500 Internal Server Error', unicode(response))
-@pytest.mark.django_db
+#@pytest.mark.django_db
class NewUserRegistrationTest(TestCase):
def setUp(self):
self.c = Client()
@@ -997,6 +1072,7 @@ class NewUserRegistrationTest(TestCase):
from django_mailbox.models import Mailbox,MessageAttachment,Message
+#@pytest.mark.django_db
class AutoExportTests(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -1053,6 +1129,7 @@ boattype: 2x
call_command('processemail', stdout=out, testing=True)
self.assertIn('Successfully processed email attachments',out.getvalue())
+#@pytest.mark.django_db
class UploadTests(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -1096,6 +1173,7 @@ workout run
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')
@@ -1157,6 +1235,7 @@ workout water
self.assertIn('Successfully processed email attachments',out.getvalue())
+#@pytest.mark.django_db
class WorkoutTests(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -1176,6 +1255,7 @@ class WorkoutTests(TestCase):
def test_checkworkoutuser(self):
self.assertEqual(checkworkoutuser(self.u,self.w),True)
+#@pytest.mark.django_db
class C2Tests(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -1196,6 +1276,7 @@ class C2Tests(TestCase):
# should raise NoTokenError
self.assertRaises(NoTokenError)
+#@pytest.mark.django_db
class DataTest(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -1383,6 +1464,7 @@ class DataTest(TestCase):
+#@pytest.mark.django_db
class ViewTest(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -2143,6 +2225,7 @@ class ViewTest(TestCase):
# f_to_be_deleted = w.csvfilename
# os.remove(f_to_be_deleted+'.gz')
+#@pytest.mark.django_db
class URLTests(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -2389,6 +2472,7 @@ class URLTests(TestCase):
msg=url+' response status code not 200')
+#@pytest.mark.django_db
class subroutinetests(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -2414,6 +2498,7 @@ class subroutinetests(TestCase):
+#@pytest.mark.django_db
class PlotTests(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
diff --git a/rowers/tests/tests.py,cover b/rowers/tests/tests.py,cover
new file mode 100644
index 00000000..3c9785cd
--- /dev/null
+++ b/rowers/tests/tests.py,cover
@@ -0,0 +1,2831 @@
+ #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()
+
+ #@pytest.mark.django_db
+> class DjangoTestCase(TestCase, MockTestCase):
+> def _pre_setup(self):
+> MockTestCase.setUp(self)
+> TestCase._pre_setup(self)
+> self.client = Client()
+
+> def _post_teardown(self):
+> TestCase._post_teardown(self)
+> MockTestCase.tearDown(self)
+> delete_strokedata(1)
+
+ # to be done add polar mocks (for email processing)
+> def mocked_requests(*args, **kwargs):
+> with open('rowers/tests/testdata/c2jsonworkoutdata.txt','r') as infile:
+> c2workoutdata = json.load(infile)
+
+> with open('rowers/tests/testdata/c2jsonstrokedata.txt','r') as infile:
+> c2strokedata = json.load(infile)
+
+> polar_json = {
+> 'available-user-data': []
+> }
+
+> c2workoutlist = json.load(open('rowers/tests/testdata/c2workoutlist.txt'))
+
+> c2uploadjson = {
+> "data": {
+> "id": 339,
+> "user_id": 1,
+> "date": "2015-08-05 13:15:41",
+> "timezone": "Europe/London",
+> "date_utc": "2015-08-05 12:15:41",
+> "distance": 5649,
+> "type": "rower",
+> "time": 8649,
+> "time_formatted": "14:24.9",
+> "workout_type": "JustRow",
+> "source": "ErgData",
+> "weight_class": "H",
+> "verified": True,
+> "ranked": False
+> }
+> }
+
+> stravaworkoutlist = json.load(open('rowers/tests/testdata/stravaworkoutlist.txt'))
+> sporttracksworkoutlist = json.load(open('rowers/tests/testdata/sporttracksworkouts.txt'))
+
+> rkworkoutlistjson = json.load(open('rowers/tests/testdata/rkworkoutslist.txt','r'))
+> uaworkoutlistjson = json.load(open('rowers/tests/testdata/uaworkoutlist.txt','r'))
+
+> stravasummaryjson = json.load(open('rowers/tests/testdata/stravaworkoutsummary.txt','r'))
+
+> stravatimejson = json.load(open('rowers/tests/testdata/stravatimetestdata.txt','r'))
+> stravavelojson = json.load(open('rowers/tests/testdata/stravavelotestdata.txt','r'))
+
+> stravapowerjson = json.load(open('rowers/tests/testdata/stravapowertestdata.txt','r'))
+
+> stravadistancejson = json.load(open('rowers/tests/testdata/stravadistancetestdata.txt','r'))
+> stravalatlongjson = json.load(open('rowers/tests/testdata/stravalatlongtestdata.txt','r'))
+> stravahrjson = json.load(open('rowers/tests/testdata/stravahrtestdata.txt','r'))
+> stravaspmjson = json.load(open('rowers/tests/testdata/stravaspmtestdata.txt','r'))
+
+> uapostworkoutjson = json.load(open('rowers/tests/testdata/uapostworkoutresponse.txt','r'))
+
+> tpuploadresponse = json.load(open('rowers/tests/testdata/tpuploadresponse.txt','r'))
+
+> stravastreamjson = {
+> 'time':stravatimejson,
+> 'velocity_smooth':stravavelojson,
+> 'distance':stravadistancejson,
+> 'latlng':stravalatlongjson,
+> 'heartrate':stravahrjson,
+> 'cadence':stravaspmjson,
+> 'power':stravapowerjson,
+> }
+
+> ststrokesjson = json.load(open('rowers/tests/testdata/sporttracksstrokedata.txt','r'))
+
+> rkstrokesjson = json.load(open('rowers/tests/testdata/rkstrokes.txt','r'))
+
+> uastrokesjson = json.load(open('rowers/tests/testdata/uastrokes.txt','r'))
+> uauserjson = json.load(open('rowers/tests/testdata/uauser.txt','r'))
+
+> class MockResponse:
+> def __init__(self, json_data, status_code):
+> self.json_data = json_data
+> self.status_code = status_code
+
+> def json(self):
+> return self.json_data
+
+
+> class MockHeaderResponse:
+> def __init__(self, header_data, status_code):
+> self.headers = header_data
+> self.status_code = status_code
+
+> class MockSession:
+> def send(self,prepped):
+ # prepped.url
+ # prepped.body (post data)
+ # prepped.headers
+ # prepped.method
+
+> json_data = {
+> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+> 'expires_in': 604800,
+> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+> }
+
+> return MockResponse(json_data,200)
+
+> if not args:
+> return MockSession()
+
+> polartester = re.compile('.*?polaraccesslink\.com')
+> c2tester = re.compile('.*?log\.concept2\.com')
+> stravatester = re.compile('.*?strava\.com')
+> sttester = re.compile('.*?sporttracks\.mobi')
+> rktester = re.compile('.*?runkeeper\.com')
+> uatester = re.compile('.*?mapmyfitness\.com')
+> tptester = re.compile('.*?trainingpeaks\.com')
+
+> c2importregex = '.*?concept2.com\/api\/users\/me\/results\/\d+'
+> c2importtester = re.compile(c2importregex)
+
+> c2uploadregex = '.*?concept2.com\/api\/users\/\d+\/results$'
+> c2uploadtester = re.compile(c2uploadregex)
+
+> c2strokesregex = '.*?concept2.com\/api\/users\/me\/results\/\d+\/strokes'
+> c2strokestester = re.compile(c2strokesregex)
+
+> c2workoutlistregex = '.*?concept2\.com\/api\/users\/me\/results\?page=\d'
+> c2workoutlisttester = re.compile(c2workoutlistregex)
+
+> stravaworkoutlistregex = '.*?strava\.com\/api\/v3\/athlete\/activities'
+> stravaworkoutlisttester = re.compile(stravaworkoutlistregex)
+
+> stravastreamregex = '.*?strava\.com\/api\/v3\/activities\/\d+\/streams\/(\w.*?)\?'
+> stravastreamtester = re.compile(stravastreamregex)
+
+> stravasummaryregex = '.*?strava\.com\/api\/v3\/activities\/\d+$'
+> stravasummarytester = re.compile(stravasummaryregex)
+
+> stuploadregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities.json$'
+> stuploadtester = re.compile(stuploadregex)
+
+> stworkoutlistregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities$'
+> stworkoutlisttester = re.compile(stworkoutlistregex)
+
+> ststrokesregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/\d+$'
+> ststrokestester = re.compile(ststrokesregex)
+
+> rkuploadregex = '.*?api\.runkeeper\.com\/fitnessActivities$'
+> rkuploadtester = re.compile(rkuploadregex)
+> rkuserregex = '.*?api\.runkeeper\.com\/user$'
+> rkusertester = re.compile(rkuserregex)
+> rkstrokesregex = '.*?api\.runkeeper\.com\/fitnessActivities/\d+$'
+> rkstrokestester = re.compile(rkstrokesregex)
+
+> uaapiregex = '.*?api\.ua\.com'
+> uaapitester = re.compile(uaapiregex)
+
+> uauploadregex = '.*?api\.ua\.com\/v7.1\/workout\/$'
+> uauploadtester = re.compile(uauploadregex)
+
+> uastrokesregex = '.*?api\.ua\.com\/v7.1\/workout\/\d+'
+> uastrokestester = re.compile(uastrokesregex)
+
+> ualistregex = '.*?api\.ua\.com\/v7.1\/workout\/\?user'
+> ualisttester = re.compile(ualistregex)
+
+> uauserregex = '.*?api\.ua\.com\/v7.1\/user\/self\/'
+> uausertester = re.compile(uauserregex)
+
+> tpuploadregex = '.*?trainingpeaks\.com\/v1\/file'
+> tpuploadtester = re.compile(tpuploadregex)
+
+> if polartester.match(args[0]):
+> json_data = polar_json
+> return MockResponse(json_data,200)
+
+> if tptester.match(args[0]):
+> if 'token' in args[0]:
+> json_data = {
+> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+> 'expires_in': 604800,
+> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+> }
+> return MockResponse(json_data,200)
+> elif tpuploadtester.match(args[0]):
+> return MockResponse(tpuploadresponse,200)
+
+> if uaapitester.match(args[0]):
+> if 'access_token' in args[0]:
+> json_data = {
+> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+> 'expires_in': 604800,
+> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+> }
+> return MockResponse(json_data,200)
+> elif uauploadtester.match(args[0]):
+> if 'data' in kwargs:
+> return MockResponse(uapostworkoutjson,200)
+> elif uastrokestester.match(args[0]):
+> return MockResponse(uastrokesjson,200)
+> elif ualisttester.match(args[0]):
+> return MockResponse(uaworkoutlistjson,200)
+> elif uausertester.match(args[0]):
+> return MockResponse(uauserjson,200)
+
+
+> if uatester.match(args[0]):
+! if 'access_token' in args[0]:
+! json_data = {
+! 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+! 'expires_in': 604800,
+! 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+! }
+! return MockResponse(json_data,200)
+
+
+> if rktester.match(args[0]):
+> if 'token' in args[0]:
+> json_data = {
+> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+> 'expires_in': 604800,
+> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+> }
+> return MockResponse(json_data,200)
+> elif rkuploadtester.match(args[0]):
+> if 'data' in kwargs:
+ # post
+> header_data = {
+> 'Location': '/fitnessActivities/12'
+> }
+> return MockHeaderResponse(header_data,200)
+> else:
+> json_data = rkworkoutlistjson
+> return MockResponse(json_data,200)
+> elif rkusertester.match(args[0]):
+> json_data = {
+> "userID": 1234567890,
+> "profile": "/profile",
+> "settings": "/settings",
+> "fitness_activities": "/fitnessActivities",
+> "strength_training_activities": "/strengthTrainingActivities",
+> "background_activities": "/backgroundActivities",
+> "sleep": "/sleep",
+> "nutrition": "/nutrition",
+> "weight": "/weight",
+> "general_measurements": "/generalMeasurements",
+> "diabetes": "/diabetes",
+> "records": "/records",
+> "team": "/team"
+> }
+> return MockResponse(json_data, 200)
+> elif rkstrokestester.match(args[0]):
+> return MockResponse(rkstrokesjson,200)
+
+> if sttester.match(args[0]):
+> if 'oauth2/token' in args[0]:
+> json_data = {
+> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+> 'expires_in': 604800,
+> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+> }
+> return MockResponse(json_data,200)
+> if ststrokestester.match(args[0]):
+> return MockResponse(ststrokesjson,200)
+> if stuploadtester.match(args[0]):
+> json_data = {
+> "uris": [
+> "https://api.sporttracks.mobi/api/v2/fitnessActivities/123456.json"
+> ]
+> }
+> return MockResponse(json_data, 200)
+> if stworkoutlisttester.match(args[0]):
+> return MockResponse(sporttracksworkoutlist,200)
+
+
+> if stravatester.match(args[0]):
+> if stravaworkoutlisttester.match(args[0]):
+! return MockResponse(stravaworkoutlist,200)
+> if stravastreamtester.match(args[0]):
+> metric = stravastreamtester.match(args[0]).group(1)
+> json_data = stravastreamjson[metric]
+> return MockResponse(json_data,200)
+> elif stravasummarytester.match(args[0]):
+> return MockResponse(stravasummaryjson,200)
+> elif 'token' in args[0]:
+> json_data = {
+> "token_type": "Bearer",
+> "access_token": "987654321234567898765432123456789",
+> "refresh_token": "1234567898765432112345678987654321",
+> "expires_at": 1531385304
+> }
+> return MockResponse(json_data,200)
+
+
+> if c2tester.match(args[0]):
+> if c2uploadtester.match(args[0]):
+> return MockResponse(c2uploadjson,201)
+> if c2strokestester.match(args[0]):
+> return MockResponse(c2strokedata,200)
+> elif c2importtester.match(args[0]):
+> return MockResponse(c2workoutdata,200)
+> elif c2workoutlisttester.match(args[0]):
+> return MockResponse(c2workoutlist,200)
+> elif 'access_token' in args[0]:
+! json_data = {
+! 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+! 'expires_in': 604800,
+! 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+! }
+! return MockResponse(json_data,200)
+> elif 'users/me' in args[0]:
+> json_data = {
+> 'data': {
+> 'username': 'john',
+> 'id': 1234,
+> }
+> }
+> return MockResponse(json_data,200)
+! elif 'results' in args[0]:
+! json_data = {
+! 'data': {
+! 'id': 1223,
+! }
+! }
+! else:
+! return MockResponse(c2workoutdata,200)
+
+! return MockResponse(None,404)
+
+ #@pytest.mark.django_db
+> class C2Objects(DjangoTestCase):
+> def setUp(self):
+> self.c = Client()
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+
+> self.u.first_name = 'John'
+> self.u.last_name = 'Sander'
+> self.u.save()
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+
+> self.r.c2token = '12'
+> self.r.c2refreshtoken = 'ab'
+> self.r.tokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
+> 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.c2stuff.requests.Session', side_effect=mocked_requests)
+> def test_c2_callback(self, mock_Session):
+> response = self.c.get('/call_back?code=dsdoij232s',follow=True)
+
+
+> self.assertEqual(response.status_code, 200)
+
+
+> @patch('rowers.c2stuff.Session', side_effect=mocked_requests)
+> def test_c2_token_refresh(self, mock_post):
+> response = self.c.get('/rowers/me/c2refresh/',follow=True)
+
+> self.assertEqual(response.status_code, 200)
+
+
+> @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests)
+> @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+> def test_c2_upload(self, mock_get, mock_post):
+> response = self.c.get('/rowers/workout/1/c2uploadw/')
+
+> 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.c2stuff.requests.post', side_effect=mocked_requests)
+> @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+> def test_c2_list(self, mock_get, mock_post):
+> response = self.c.get('/rowers/workout/c2list',follow=True)
+
+> self.assertEqual(response.status_code,200)
+
+> @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+> def test_c2_import(self, mock_get):
+
+> response = self.c.get('/rowers/workout/c2import/12/',follow=True)
+
+> self.assertRedirects(response,
+> expected_url='/rowers/workout/2/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+
+> def test_strokedata(self):
+> with open('rowers/tests/testdata/c2stroketestdata.txt','r') as infile:
+> res = json.load(infile)
+
+> strokedata = pd.DataFrame.from_dict(res['data'])
+
+> with open('rowers/tests/testdata/c2testdata.txt','r') as infile:
+> res = json.load(infile)
+
+> data = res['data']
+
+> from rowers.views import add_workout_from_strokedata
+
+> res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
+
+> def test_strokedatanohr(self):
+> with open('rowers/tests/testdata/c2strokedatanohr.txt','r') as infile:
+> res = json.load(infile)
+
+> strokedata = pd.DataFrame.from_dict(res['data'])
+
+> with open('rowers/tests/testdata/c2testdata.txt','r') as infile:
+> res = json.load(infile)
+
+> data = res['data']
+
+> from rowers.views import add_workout_from_strokedata
+
+
+> res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
+
+! class C2ObjectsTokenExpired(DjangoTestCase):
+! def setUp(self):
+> self.c = Client()
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+
+> self.u.first_name = 'John'
+! self.u.last_name = 'Sander'
+> self.u.save()
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+
+! self.r.c2token = '12'
+! self.r.c2refreshtoken = 'ab'
+> self.r.tokenexpirydate = datetime.datetime.now()-datetime.timedelta(days=1)
+! 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.c2stuff.requests.post', side_effect=mocked_requests)
+> @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+> def test_c2_list(self, mock_get, mock_post):
+> response = self.c.get('/rowers/workout/c2list',follow=True)
+
+! self.assertEqual(response.status_code,200)
+
+! @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+! def test_c2_import(self, mock_get):
+
+> response = self.c.get('/rowers/workout/c2import/12/',follow=True)
+
+> self.assertRedirects(response,
+> expected_url='/rowers/workout/2/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+
+
+ #@pytest.mark.django_db
+> class StravaObjects(DjangoTestCase):
+> def setUp(self):
+> self.c = Client()
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+
+! self.u.first_name = 'John'
+> self.u.last_name = 'Sander'
+> self.u.save()
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+
+> self.r.stravatoken = '12'
+
+> self.r.save()
+> self.c.login(username='john',password='koeinsloot')
+
+! @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
+! def test_strava_list(self, mock_get):
+! response = self.c.get('/rowers/workout/stravaimport/',follow=True)
+
+! self.assertEqual(response.status_code,200)
+
+> @patch('rowers.utils.requests.get', side_effect=mocked_requests)
+> def test_strava_import(self, mock_get):
+
+> response = self.c.get('/rowers/workout/stravaimport/12',follow=True)
+
+> self.assertRedirects(response,
+> expected_url='/rowers/workout/1/edit',
+> status_code=301,target_status_code=200)
+
+! self.assertEqual(response.status_code, 200)
+
+
+
+ #@pytest.mark.django_db
+! class STObjects(DjangoTestCase):
+> def setUp(self):
+> self.c = Client()
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+
+! self.u.first_name = 'John'
+> self.u.last_name = 'Sander'
+! self.u.save()
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+
+
+! self.r.sporttrackstoken = '12'
+! self.r.sporttracksrefreshtoken = '12'
+> self.r.sporttrackstokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
+! 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.sporttracksstuff.requests.post', side_effect=mocked_requests)
+> def test_sporttracks_callback(self, mock_post):
+! response = self.c.get('/sporttracks_callback?code=dsdoij232s',follow=True)
+
+
+! self.assertEqual(response.status_code, 200)
+
+
+> @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
+> def test_sporttracks_token_refresh(self, mock_post):
+> response = self.c.get('/rowers/me/sporttracksrefresh/',follow=True)
+
+> self.assertEqual(response.status_code, 200)
+
+
+> @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
+> @patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests)
+> def test_sporttracks_upload(self, mock_get, mock_post):
+> response = self.c.get('/rowers/workout/1/sporttracksuploadw/')
+
+> 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.sporttracksstuff.requests.get', side_effect=mocked_requests)
+! def test_sporttracks_list(self, mock_get):
+! response = self.c.get('/rowers/workout/sporttracksimport',follow=True)
+
+> self.assertEqual(response.status_code,200)
+
+! @patch('rowers.imports.requests.get', side_effect=mocked_requests)
+! def test_sporttracks_import(self, mock_get):
+
+> response = self.c.get('/rowers/workout/sporttracksimport/12/',follow=True)
+
+> self.assertRedirects(response,
+> expected_url='/rowers/workout/2/edit',
+> status_code=302,target_status_code=200)
+
+! self.assertEqual(response.status_code, 200)
+
+! def test_strokedata(self):
+> with open('rowers/tests/testdata/sporttrackstestdata.txt','r') as infile:
+! data = json.load(infile)
+
+! from rowers.sporttracksstuff import add_workout_from_data
+
+> res = add_workout_from_data(self.u,1,data,data)
+
+> def test_strokedatanohr(self):
+! with open('rowers/tests/testdata/sporttrackstestnohr.txt','r') as infile:
+> data = json.load(infile)
+
+> from rowers.sporttracksstuff import add_workout_from_data
+
+
+
+! res = add_workout_from_data(self.u,1,data,data)
+
+ #@pytest.mark.django_db
+> class RunKeeperObjects(DjangoTestCase):
+! def setUp(self):
+> self.c = Client()
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+
+> self.u.first_name = 'John'
+! self.u.last_name = 'Sander'
+> self.u.save()
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+
+
+! self.r.runkeepertoken = '12'
+
+! 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.runkeeperstuff.requests.post', side_effect=mocked_requests)
+> def test_runkeeper_callback(self, mock_post):
+> response = self.c.get('/runkeeper_callback?code=dsdoij232s',follow=True)
+
+> self.assertEqual(response.status_code, 200)
+
+! @patch('rowers.runkeeperstuff.requests.post', side_effect=mocked_requests)
+> @patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests)
+> def test_runkeeper_upload(self, mock_get, mock_post):
+! response = self.c.get('/rowers/workout/1/runkeeperuploadw/')
+
+> 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.runkeeperstuff.requests.get', side_effect=mocked_requests)
+! def test_runkeeper_list(self, mock_get):
+! response = self.c.get('/rowers/workout/runkeeperimport',follow=True)
+
+! self.assertEqual(response.status_code,200)
+
+> @patch('rowers.imports.requests.get', side_effect=mocked_requests)
+> def test_runkeeper_import(self, mock_get):
+
+> response = self.c.get('/rowers/workout/runkeeperimport/12/',follow=True)
+
+> self.assertRedirects(response,
+> expected_url='/rowers/workout/2/edit',
+> status_code=302,target_status_code=200)
+
+! self.assertEqual(response.status_code, 200)
+
+
+
+ #@pytest.mark.django_db
+! class UAObjects(DjangoTestCase):
+> def setUp(self):
+> self.c = Client()
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+
+! self.u.first_name = 'John'
+> self.u.last_name = 'Sander'
+! self.u.save()
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+
+
+! self.r.underarmourtoken = '12'
+! self.r.underarmourrefreshtoken = '12'
+> self.r.underarmourtokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
+! 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.imports.requests.post', side_effect=mocked_requests)
+> def test_underarmour_callback(self, mock_post):
+> response = self.c.get('/underarmour_callback?code=dsdoij232s',follow=True)
+
+
+! self.assertEqual(response.status_code, 200)
+
+
+> @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
+> def test_underarmour_token_refresh(self, mock_post):
+> response = self.c.get('/rowers/me/underarmourrefresh/',follow=True)
+
+> self.assertEqual(response.status_code, 200)
+
+
+> @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
+> @patch('rowers.underarmourstuff.requests.get', side_effect=mocked_requests)
+> def test_underarmour_upload(self, mock_get, mock_post):
+> response = self.c.get('/rowers/workout/1/underarmouruploadw/')
+
+> 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.underarmourstuff.requests.get', side_effect=mocked_requests)
+> def test_underarmour_list(self, mock_get):
+> response = self.c.get('/rowers/workout/underarmourimport',follow=True)
+
+! self.assertEqual(response.status_code,200)
+
+! @patch('rowers.imports.requests.get', side_effect=mocked_requests)
+! def test_underarmour_import(self, mock_get):
+
+! response = self.c.get('/rowers/workout/underarmourimport/12/',follow=True)
+
+> self.assertRedirects(response,
+> expected_url='/rowers/workout/2/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+
+ #@pytest.mark.django_db
+! class TPObjects(DjangoTestCase):
+> def setUp(self):
+> self.c = Client()
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+
+! self.u.first_name = 'John'
+! self.u.last_name = 'Sander'
+! self.u.save()
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+
+
+> self.r.tptoken = '12'
+> self.r.tprefreshtoken = '12'
+> self.r.tptokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
+> 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.imports.requests.post', side_effect=mocked_requests)
+> def test_tp_callback(self, mock_post):
+> response = self.c.get('/tp_callback?code=dsdoij232s',follow=True)
+
+
+> self.assertEqual(response.status_code, 200)
+
+
+> @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
+> def test_tp_token_refresh(self, mock_post):
+> response = self.c.get('/rowers/me/tprefresh/',follow=True)
+
+> self.assertEqual(response.status_code, 200)
+
+
+> @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
+> @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
+> def test_tp_upload(self, mock_get, mock_post):
+> response = self.c.get('/rowers/workout/1/tpuploadw/')
+
+> 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)
+
+
+
+
+ #@pytest.mark.django_db
+> class TestErrorPages(TestCase):
+> def test_error_handlers(self):
+
+! self.assertTrue(urls.handler404.endswith('.error404_view'))
+! self.assertTrue(urls.handler500.endswith('.error500_view'))
+! factory = RequestFactory()
+! request = factory.get('/')
+> response = error404_view(request)
+> self.assertEqual(response.status_code, 404)
+> self.assertIn('404 Page not found', unicode(response))
+> response = error500_view(request)
+> self.assertEqual(response.status_code, 500)
+> self.assertIn('500 Internal Server Error', unicode(response))
+
+ #@pytest.mark.django_db
+> class NewUserRegistrationTest(TestCase):
+> def setUp(self):
+> self.c = Client()
+! redis_connection.publish('tasks','KILL')
+
+! def test_newuser(self):
+> form_data = {
+> 'first_name':'Jan',
+> 'last_name':'Roeiert',
+> 'email':'jan@loop.nl',
+> 'username':'janderoeiert',
+> 'password1':'aapindewei2',
+> 'password2':'aapindewei2',
+> 'tos':True,
+> 'weightcategory':'hwt',
+> 'adaptiveclass': 'None',
+> 'sex':'male',
+> 'next':'/rowers/list-workouts',
+> 'birthdate':datetime.datetime(year=1970,month=4,day=2)
+> }
+
+> form = RegistrationFormUniqueEmail(form_data)
+> self.assertTrue(form.is_valid())
+
+! response = self.c.post('/rowers/register', form_data, follow=True)
+
+> self.assertRedirects(response,
+> expected_url='/rowers/me/gdpr-optin/?next=/rowers/list-workouts/',
+> status_code=302,target_status_code=200)
+
+> from django_mailbox.models import Mailbox,MessageAttachment,Message
+
+ #@pytest.mark.django_db
+> class AutoExportTests(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()
+> )
+
+> r.c2_auto_export = True
+> r.sporttracks_auto_export = True
+> r.mapmyfitness_auto_export = True
+> r.trainingpeaks_auto_export = True
+
+! r.save()
+
+! nu = datetime.datetime.now()
+! workoutsbox = Mailbox.objects.create(name='workouts')
+> workoutsbox.save()
+! failbox = Mailbox.objects.create(name='Failed')
+> failbox.save()
+
+> filename = 'testdata.csv'
+
+> m = Message(mailbox=workoutsbox,
+> from_header = u.email,
+> subject = filename,
+> body="""
+> ---
+> workouttype: water
+> boattype: 2x
+> ...
+> """)
+> m.save()
+! a2 = 'media/mailbox_attachments/'+filename
+! copyfile('rowers/tests/testdata/'+filename,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 WindowsError:
+! pass
+
+! @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
+! @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
+! def test_emailprocessing(self, mock_post, mock_get):
+> out = StringIO()
+> call_command('processemail', stdout=out, testing=True)
+> self.assertIn('Successfully processed email attachments',out.getvalue())
+
+ #@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()
+> )
+
+> 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('requests.get', side_effect=mocked_requests)
+> def test_emailprocessing(self, mock_get):
+> out = StringIO()
+> call_command('processemail', stdout=out,testing=True)
+! self.assertIn('Successfully processed email attachments',out.getvalue())
+
+
+ #@pytest.mark.django_db
+> class WorkoutTests(TestCase):
+> def setUp(self):
+> redis_connection.publish('tasks','KILL')
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+> nu = datetime.datetime.now()
+> self.w = Workout.objects.create(name='testworkout',
+> workouttype='water',
+> user=self.r,date=nu.strftime('%Y-%m-%d'),
+> starttime=nu.strftime('%H:%M:%S'),
+> duration="0:55:00",distance=8000)
+
+> def test_checkworkoutuser(self):
+> self.assertEqual(checkworkoutuser(self.u,self.w),True)
+
+ #@pytest.mark.django_db
+> class C2Tests(TestCase):
+> def setUp(self):
+! redis_connection.publish('tasks','KILL')
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now()
+> )
+> self.nu = datetime.datetime.now()
+> self.w = Workout.objects.create(name='testworkout',workouttype='water',
+> user=r,date=nu.strftime('%Y-%m-%d'),
+> starttime=nu.strftime('%H:%M:%S'),
+> duration="0:55:00",distance=8000)
+
+> def c2_notokentest(self):
+! thetoken = c2_open(self.u)
+ # should raise NoTokenError
+> self.assertRaises(NoTokenError)
+
+ #@pytest.mark.django_db
+> class DataTest(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.nu = datetime.datetime.now()
+
+
+! def test_workoutform(self):
+> form_data = {
+> 'name':'test',
+> 'date':'2016-05-01',
+> 'starttime':'07:53:00',
+> 'timezone':'UTC',
+> 'duration':'0:55:00.1',
+> 'distance':8000,
+> 'notes':'Aap noot \n mies',
+> 'weightcategory':'lwt',
+> 'adaptiveclass': 'PR1',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'private':False,
+> }
+> form = WorkoutForm(data=form_data)
+> self.assertTrue(form.is_valid())
+
+> def test_rower_form_withvalidnumbers(self):
+> form_data = {
+> 'max':192,
+> 'rest':48,
+> 'ut2':105,
+> 'ut1':148,
+> 'at':160,
+> 'tr':167,
+> 'an':180,
+> 'weightcategory':'lwt',
+> }
+> form = RowerForm(data=form_data)
+> self.assertTrue(form.is_valid())
+
+
+> def test_rower_form_twoequalvalues(self):
+> form_data = {
+> 'max':192,
+> 'rest':48,
+> 'ut2':105,
+> 'ut1':105,
+> 'at':160,
+> 'an':180,
+> 'tr':167,
+> 'weightcategory':'lwt',
+> }
+! form = RowerForm(data=form_data)
+> self.assertFalse(form.is_valid())
+
+! def test_rower_form_abovemaxallowed(self):
+> form_data = {
+> 'max':300,
+> 'rest':48,
+> 'ut2':105,
+> 'ut1':148,
+> 'at':160,
+> 'an':180,
+> 'tr':167,
+> 'weightcategory':'lwt',
+> }
+> form = RowerForm(data=form_data)
+> self.assertFalse(form.is_valid())
+
+! def test_rower_form_wrongorder(self):
+> form_data = {
+> 'max':192,
+> 'rest':48,
+> 'ut2':20,
+> 'ut1':148,
+> 'at':160,
+> 'an':180,
+> 'tr':167,
+> 'weightcategory':'lwt',
+> }
+> form = RowerForm(data=form_data)
+! self.assertFalse(form.is_valid())
+
+> def test_rower_form_belowminalloed(self):
+> form_data = {
+> 'max':192,
+> 'rest':2,
+> 'ut2':105,
+> 'ut1':148,
+> 'at':160,
+> 'an':180,
+> 'tr':167,
+> 'weightcategory':'lwt',
+> }
+> form = RowerForm(data=form_data)
+> self.assertFalse(form.is_valid())
+
+> def test_rower_form_wrongorder2(self):
+> form_data = {
+> 'max':192,
+> 'rest':48,
+> 'ut2':105,
+> 'ut1':170,
+> 'at':160,
+> 'an':180,
+> 'tr':167,
+> 'weightcategory':'lwt',
+> }
+! form = RowerForm(data=form_data)
+! self.assertFalse(form.is_valid())
+
+> def test_painsled(self):
+> filename = 'rowers/tests/testdata/testdata.csv'
+> f = open(filename,'rb')
+> file_data = {'file': SimpleUploadedFile(f.name, f.read())}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> }
+
+! form = DocumentsForm(form_data,file_data)
+> self.assertTrue(form.is_valid())
+
+! f.close()
+
+! u = User.objects.get(username='john')
+! r = Rower.objects.get(user=u)
+
+> rr = rrower(hrmax=r.max,hrut2=r.ut2,
+> hrut1=r.ut1,hrat=r.at,
+> hrtr=r.tr,hran=r.an,ftp=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')
+
+> w = Workout.objects.create(name='testworkout',workouttype='water',
+> user=r,date=self.nu.strftime('%Y-%m-%d'),
+> starttime=workoutstarttime,
+> duration=duration,distance=totaldist,
+> csvfilename=filename)
+
+
+> fig1 = plots.mkplot(row,'test')
+! res = iplots.interactive_chart(w.id)
+> res = iplots.interactive_chart(w.id,promember=1)
+> res = iplots.interactive_bar_chart(w.id)
+! res = iplots.interactive_bar_chart(w.id,promember=1)
+> res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='time',
+> yparam1='pace',yparam2='hr')
+! res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='distance',
+! yparam1='pace',yparam2='hr')
+> res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='time',
+> yparam1='pace',yparam2='spm')
+> res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='distance',
+> yparam1='pace',yparam2='spm')
+
+> res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='time',
+> yparam1='pace',yparam2='hr')
+> res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='distance',
+> yparam1='pace',yparam2='hr')
+> res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='time',
+> yparam1='pace',yparam2='spm')
+> res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='distance',
+> yparam1='pace',yparam2='spm')
+
+
+
+
+ #@pytest.mark.django_db
+> class ViewTest(TestCase):
+> def setUp(self):
+> redis_connection.publish('tasks','KILL')
+! self.c = Client()
+> self.u = User.objects.create_user('john',
+> 'sander@ds.ds',
+> 'koeinsloot')
+> self.r = Rower.objects.create(user=self.u,gdproptin=True,
+> gdproptindate=timezone.now(),
+> rowerplan='coach',
+> )
+! self.nu = datetime.datetime.now()
+
+! def test_upload_view_notloggedin(self):
+! response = self.c.post('/rowers/workout/upload/',follow=True)
+
+
+! self.assertRedirects(response, expected_url='/login/?next=/rowers/workout/upload/',
+! status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+> def test_upload_view_sled(self):
+! self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/testdata.csv'
+! f = open(filename,'rb')
+> file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+
+> f.close()
+
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+> response = self.c.get('/rowers/workout/1/', form_data, follow=True)
+! self.assertEqual(response.status_code, 200)
+
+! response = self.c.get('/rowers/workout/1/edit', form_data, follow=True)
+> self.assertEqual(response.status_code, 200)
+
+
+> response = self.c.get('/rowers/workout/1/histo', form_data, follow=True)
+! self.assertEqual(response.status_code, 200)
+
+> form_data = {
+> 'name':'aap',
+> 'date':'2016-11-05',
+> 'starttime':'09:07:14',
+> 'timezone':'Europe/Berlin',
+> 'duration':'1:00:00.5',
+> 'distance':'15000',
+> 'weightcategory':'hwt',
+> 'adaptiveclass':'PR1',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'private':True,
+> 'notes':'noot mies',
+> }
+> form = WorkoutForm(data=form_data)
+! self.assertTrue(form.is_valid())
+> response = self.c.post('/rowers/workout/1/edit', form_data, follow=True)
+> self.assertEqual(response.status_code, 200)
+
+
+> w = Workout.objects.get(id=1)
+> f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+
+
+
+> def test_upload_view_notloggedin(self):
+! response = self.c.post('/rowers/workout/upload/',follow=True)
+
+
+> self.assertRedirects(response, expected_url='/login/?next=/rowers/workout/upload/',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+> def test_upload_view_sled_negativetime(self):
+! self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/tim.csv'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_C2':False,
+> 'upload_to_Strava':False,
+> 'upload_to_SportTracks':False,
+> 'upload_to_RunKeeper':False,
+> 'upload_to_MapMyFitness':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> 'makeprivate':False,
+> 'landingpage':'workout_edit_view',
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+
+! f.close()
+
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+> response = self.c.get('/rowers/workout/1/', form_data, follow=True)
+! self.assertEqual(response.status_code, 200)
+
+
+! w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+! try:
+> os.remove(f_to_be_deleted+'.gz')
+! except WindowsError:
+! pass
+
+
+
+
+! def test_upload_view_sled_noname(self):
+! self.c.login(username='john',password='koeinsloot')
+
+! filename = 'rowers/tests/testdata/testdata.csv'
+! f = open(filename,'rb')
+! file_data = {'file': f}
+! form_data = {
+! 'title':'',
+! 'workouttype':'rower',
+! 'boattype':'1x',
+! 'notes':'aap noot mies',
+! 'make_plot':False,
+! 'upload_to_c2':False,
+! 'plottype':'timeplot',
+! 'file': f,
+! }
+
+! form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+
+! f.close()
+
+! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+! status_code=302,target_status_code=200)
+
+! self.assertEqual(response.status_code, 200)
+
+! w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+! try:
+! os.remove(f_to_be_deleted+'.gz')
+! except WindowsError:
+! pass
+
+! def test_upload_view_logcard(self):
+! self.c.login(username='john',password='koeinsloot')
+
+! filename = 'rowers/tests/testdata/logcard.csv'
+! f = open(filename,'rb')
+> file_data = {'file': f}
+> form_data = {
+> 'title':'',
+> 'workouttype':'rower',
+> 'boattype': '1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+
+! f.close()
+
+> self.assertRedirects(response,
+> expected_url='/rowers/workout/upload/',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+
+
+
+> def test_upload_view_TCX_CN(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/crewnerddata.tcx'
+! f = open(filename,'rb')
+! file_data = {'file': f}
+
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+> f.close()
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+> filename = 'rowers/tests/testdata/crewnerddata.CSV'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+> form_data = {}
+! form = CNsummaryForm(form_data,file_data)
+
+> response = self.c.post('rowers/workout/1/crewnerdsummary',
+> form_data,
+> follow=True)
+
+> f.close()
+
+! self.assertEqual(response.status_code, 200)
+! w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+! try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+! pass
+
+> def test_upload_view_TCX_SpeedCoach2a(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/Speedcoach2example.csv'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+> f.close()
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+! w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+! try:
+! os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+> def test_upload_view_TCX_SpeedCoach2b(self):
+> self.c.login(username='john',password='koeinsloot')
+
+! filename = 'rowers/tests/testdata/Speedcoach2example.csv'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! f.close()
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+> w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+! try:
+! os.remove(f_to_be_deleted+'.gz')
+! except WindowsError:
+! pass
+
+
+
+> def test_upload_view_TCX_SpeedCoach2c(self):
+> self.c.login(username='john',password='koeinsloot')
+
+! filename = 'rowers/tests/testdata/speedcoach3test3.csv'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! f.close()
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+> w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+! try:
+! os.remove(f_to_be_deleted+'.gz')
+! except WindowsError:
+! pass
+
+
+! def test_upload_view_SpeedCoach2v127(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/SpeedCoach2Linkv1.27.csv'
+! f = open(filename,'rb')
+> file_data = {'file': f}
+
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+> f.close()
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+> w = Workout.objects.get(id=1)
+> f_to_be_deleted = w.csvfilename
+! try:
+! os.remove(f_to_be_deleted+'.gz')
+! except WindowsError:
+! pass
+
+
+
+> def test_upload_view_SpeedCoach2v127intervals(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/SpeedCoach2Link_interval.csv'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+> f.close()
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+
+! self.assertEqual(response.status_code, 200)
+
+! w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+! except WindowsError:
+> pass
+
+
+
+> def test_upload_view_TCX_NoHR(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/NoHR.tcx'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! f.close()
+! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+! status_code=302,target_status_code=200)
+
+> self.assertEqual(response.status_code, 200)
+
+! w = Workout.objects.get(id=1)
+> f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+
+> def test_upload_view_TCX_CN(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/rowinginmotionexample.tcx'
+> f = open(filename,'rb')
+! file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'water',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+! status_code=302,target_status_code=200)
+> self.assertEqual(response.status_code, 200)
+
+! w = Workout.objects.get(id=1)
+> f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+
+> def test_upload_view_RP(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/RP_testdata.csv'
+> f = open(filename,'rb')
+! file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+! status_code=302,target_status_code=200)
+! self.assertEqual(response.status_code, 200)
+
+> w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+
+> def test_upload_view_Mystery(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/mystery.csv'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+! status_code=302,target_status_code=200)
+> self.assertEqual(response.status_code, 200)
+
+! w = Workout.objects.get(id=1)
+> f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+
+> def test_upload_view_RP_interval(self):
+> self.c.login(username='john',password='koeinsloot')
+
+> filename = 'rowers/tests/testdata/RP_interval.csv'
+> f = open(filename,'rb')
+! file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+> self.assertEqual(response.status_code, 200)
+
+> w = Workout.objects.get(id=1)
+> f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+
+
+> def test_upload_view_sled_desktop(self):
+> self.c.login(username='john',password='koeinsloot')
+
+! filename = 'rowers/tests/testdata/painsled_desktop_example.csv'
+! f = open(filename,'rb')
+> file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+! form = DocumentsForm(form_data,file_data)
+
+> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+> status_code=302,target_status_code=200)
+> self.assertEqual(response.status_code, 200)
+
+> w = Workout.objects.get(id=1)
+> f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+> def test_upload_view_sled_ergdata(self):
+> self.c.login(username='john',password='koeinsloot')
+
+! filename = 'rowers/tests/testdata/ergdata_example.csv'
+! f = open(filename,'rb')
+> file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+! form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+! status_code=302,target_status_code=200)
+! self.assertEqual(response.status_code, 200)
+
+! w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+! try:
+! os.remove(f_to_be_deleted+'.gz')
+! except WindowsError:
+! pass
+
+! def test_upload_view_sled_boatcoach(self):
+! self.c.login(username='john',password='koeinsloot')
+
+! filename = 'rowers/tests/testdata/boatcoach.csv'
+! f = open(filename,'rb')
+! file_data = {'file': f}
+! form_data = {
+! 'title':'test',
+! 'workouttype':'rower',
+! 'boattype':'1x',
+! 'notes':'aap noot mies',
+! 'make_plot':False,
+! 'upload_to_c2':False,
+! 'plottype':'timeplot',
+! 'file': f,
+! }
+
+! form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+! status_code=302,target_status_code=200)
+! self.assertEqual(response.status_code, 200)
+
+> w = Workout.objects.get(id=1)
+> f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+> def test_upload_view_sled_ergstick(self):
+> self.c.login(username='john',password='koeinsloot')
+
+! filename = 'rowers/tests/testdata/ergstick.csv'
+> f = open(filename,'rb')
+> file_data = {'file': f}
+> form_data = {
+> 'title':'test',
+> 'workouttype':'rower',
+> 'boattype':'1x',
+> 'notes':'aap noot mies',
+> 'make_plot':False,
+> 'upload_to_c2':False,
+> 'plottype':'timeplot',
+> 'file': f,
+> }
+
+> form = DocumentsForm(form_data,file_data)
+
+! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
+! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+! status_code=302,target_status_code=200)
+! self.assertEqual(response.status_code, 200)
+
+! w = Workout.objects.get(id=1)
+! f_to_be_deleted = w.csvfilename
+> try:
+> os.remove(f_to_be_deleted+'.gz')
+> except WindowsError:
+> pass
+
+
+ # def test_upload_view_FIT_SpeedCoach2a(self):
+ # self.c.login(username='john',password='koeinsloot')
+
+ # filename = 'rowers/tests/testdata/3x250m.fit'
+ # with open(filename,'rb') as f:
+
+ # file_data = {'file': f}
+
+ # form_data = {
+ # 'title':'test',
+ # 'workouttype':'water',
+ # 'boattype':'1x',
+ # 'notes':'aap noot mies',
+ # 'make_plot':False,
+ # 'upload_to_c2':False,
+ # 'plottype':'timeplot',
+ # 'file': f,
+ # }
+
+ # form = DocumentsForm(form_data,file_data)
+
+ # response = self.c.post('/rowers/workout/upload/',
+ # form_data, follow=True,
+ # format='multipart')
+ # f.close()
+ # self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
+ # status_code=302,target_status_code=200)
+
+ # self.assertEqual(response.status_code, 200)
+
+ # w = Workout.objects.get(id=1)
+ # f_to_be_deleted = w.csvfilename
+ # os.remove(f_to_be_deleted+'.gz')
+
+ #@pytest.mark.django_db
+> class URLTests(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,rowerplan='coach')
+> self.c = Client()
+> self.c.login(username='john',password='koeinsloot')
+
+> self.nu = datetime.datetime.now()
+> filename = 'rowers/tests/testdata/testdata.csv'
+> self.wotw = Workout.objects.create(name='testworkout',
+> workouttype='water',
+> user=r,date=self.nu.strftime('%Y-%m-%d'),
+> starttime=self.nu.strftime('%H:%M:%S'),
+> duration="0:55:00",distance=8000,
+> csvfilename=filename)
+
+> self.wote = Workout.objects.create(name='testworkout',
+> workouttype='Indoor Rower',
+> user=r,date=self.nu.strftime('%Y-%m-%d'),
+> starttime=self.nu.strftime('%H:%M:%S'),
+> duration="0:55:00",distance=8000,
+> csvfilename=filename)
+
+> powerperc = 100*np.array([r.pw_ut2,
+> r.pw_ut1,
+> r.pw_at,
+> r.pw_tr,r.pw_an])/r.ftp
+
+
+> self.hrdata = {
+> 'hrmax':r.max,
+> 'hrut2':r.ut2,
+> 'hrut1':r.ut1,
+> 'hrat':r.at,
+> 'hrtr':r.tr,
+> 'hran':r.an,
+> 'ftp':r.ftp,
+> 'powerperc':serialize_list(powerperc),
+> 'powerzones':serialize_list(r.powerzones),
+> }
+
+> urlstotest = [
+> '/rowers/400/',
+> '/rowers/403/',
+> '/rowers/404/',
+> '/rowers/500/',
+> '/rowers/502/',
+> '/rowers/1/list-workouts/',
+> '/rowers/1/list-workouts/2016-01-01/2016-12-31',
+> '/rowers/1/ote-bests/',
+> '/rowers/1/ote-bests2/2016-01-01/2016-12-31',
+> '/rowers/about',
+> '/rowers/addmanual/',
+> '/rowers/agegroupcp/30',
+> '/rowers/agegroupcp/30/1',
+> '/rowers/agegrouprecords/male/hwt',
+> '/rowers/agegrouprecords/male/hwt/2000m',
+> '/rowers/agegrouprecords/male/hwt/2000min',
+> '/rowers/ajax_agegroup/45/hwt/male/1',
+> '/rowers/analysis/',
+> '/rowers/analysis/user/1',
+> '/rowers/brochure',
+> '/rowers/courses/upload',
+> '/rowers/createplan/',
+> '/rowers/createplan/user/1/',
+> '/rowers/cumstats/',
+> '/rowers/cumstats/2016-01-01/2016-12-31',
+> '/rowers/cumstats/user/1',
+> '/rowers/cumstats/user/1/2016-01-01/2016-12-31',
+> '/rowers/developers',
+> '/rowers/email/',
+> '/rowers/email/thankyou/',
+> '/rowers/fitness-progress/',
+> '/rowers/fitness-progress/user/1',
+> '/rowers/fitness-progress/user/1/rower',
+> '/rowers/flexall/',
+> '/rowers/flexall/spm/hr/None/',
+> '/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/',
+> '/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/user/1',
+> '/rowers/flexall/user/1/',
+> '/rowers/flexalldata/',
+> '/rowers/help',
+> '/rowers/histo/',
+> '/rowers/histo/user/1',
+> '/rowers/histo/user/1/2016-01-01/2016-12-31',
+> '/rowers/histodata',
+> '/rowers/job-kill/1',
+> '/rowers/jobs-status/',
+> '/rowers/laboratory/',
+> '/rowers/laboratory/user/1',
+> '/rowers/legal',
+> '/rowers/list-courses/',
+> '/rowers/list-graphs/',
+> '/rowers/list-jobs/',
+> '/rowers/list-workouts/',
+> '/rowers/list-workouts/2016-01-01/2016-12-31',
+> '/rowers/list-workouts/2016-01-01/2016-12-31/user/1/',
+> '/rowers/list-workouts/ranking',
+> '/rowers/list-workouts/user/1/',
+> '/rowers/me/calcdps/',
+> '/rowers/me/edit/',
+> '/rowers/me/edit/user/1',
+> '/rowers/me/exportsettings/',
+> '/rowers/me/exportsettings/user/1',
+> '/rowers/me/favoritecharts/',
+> '/rowers/me/favoritecharts/user/1',
+> '/rowers/me/invitation/',
+> '/rowers/me/preferences/',
+> '/rowers/me/preferences/user/1',
+> '/rowers/me/request/',
+> '/rowers/me/teams/',
+> '/rowers/me/workflowconfig2/',
+> '/rowers/me/workflowconfig2/user/1',
+> '/rowers/me/workflowdefault',
+> '/rowers/multi-compare',
+> '/rowers/ote-bests/',
+> '/rowers/ote-bests/2016-01-01/2016-12-31',
+> '/rowers/ote-bests/user/1',
+> '/rowers/ote-bests/user/1/2016-01-01/2016-12-31',
+> '/rowers/ote-bests2/',
+> '/rowers/ote-bests2/2016-01-01/2016-12-31',
+> '/rowers/ote-bests2/user/1',
+> '/rowers/ote-ranking/',
+> '/rowers/ote-ranking/2016-01-01/2016-12-31',
+> '/rowers/ote-ranking/user/1/',
+> '/rowers/ote-ranking/user/1/2016-01-01/2016-12-31',
+> '/rowers/otw-bests/',
+> '/rowers/otw-bests/2016-01-01/2016-12-31',
+> '/rowers/otw-bests/user/1/2016-01-01/2016-12-31',
+> '/rowers/partners',
+> '/rowers/physics',
+> '/rowers/planrequired',
+> '/rowers/promembership',
+> '/rowers/register',
+> '/rowers/register/thankyou/',
+> '/rowers/sessions/',
+> '/rowers/sessions/2016-01-01/2016-12-31',
+> '/rowers/sessions/2016-01-01/2016-12-31/user/1',
+> '/rowers/sessions/coach/',
+> '/rowers/sessions/coach/user/1/',
+> '/rowers/sessions/create/',
+> '/rowers/sessions/create/user/1',
+> '/rowers/sessions/manage/',
+> '/rowers/sessions/manage/user/1/',
+> '/rowers/sessions/multiclone/',
+> '/rowers/sessions/multiclone/user/1/',
+> '/rowers/sessions/multicreate/',
+> '/rowers/sessions/multicreate/user/1/',
+> '/rowers/sessions/print/',
+> '/rowers/sessions/print/user/1',
+> '/rowers/sessions/teamcreate/',
+> '/rowers/sessions/user/1',
+> '/rowers/team-compare-select/',
+> '/rowers/team-compare-select/workout/1',
+> '/rowers/team-compare-select/2016-01-01/2016-12-31',
+> '/rowers/test-job/2',
+> '/rowers/test-job2/2',
+> '/rowers/test_callback',
+> '/rowers/updatefitness',
+> '/rowers/updatefitness/rower',
+> '/rowers/updatefitness/rower/50',
+> '/rowers/user-boxplot',
+> '/rowers/user-boxplot-data',
+> '/rowers/user-boxplot-select/',
+> '/rowers/user-boxplot-select/user/1/',
+> '/rowers/user-boxplot/user/1',
+> '/rowers/user-multiflex-data',
+> '/rowers/user-multiflex-select/',
+> '/rowers/user-multiflex-select/2016-01-01/2016-12-31',
+> '/rowers/user-multiflex-select/user/1/',
+> '/rowers/user-multiflex-select/user/1/2016-01-01/2016-12-31',
+> '/rowers/user-multiflex/',
+> '/rowers/user-multiflex/user/1',
+> '/rowers/workout/1/',
+> '/rowers/workout/1/adddistanceplot',
+> '/rowers/workout/1/adddistanceplot2',
+> '/rowers/workout/1/addotwpowerplot',
+> '/rowers/workout/1/addpiechart',
+> '/rowers/workout/1/addpowerpiechart',
+> '/rowers/workout/1/addstatic',
+> '/rowers/workout/1/addstatic/3',
+> '/rowers/workout/1/addtimeplot',
+> '/rowers/workout/1/addtimeplot2',
+> '/rowers/workout/1/comment',
+> '/rowers/workout/1/darkskywind',
+> '/rowers/workout/1/data',
+> '/rowers/workout/1/edit',
+> '/rowers/workout/1/editintervals',
+> '/rowers/workout/1/flexchart',
+> '/rowers/workout/1/flexchart/spm/hr/None',
+> '/rowers/workout/1/flexchart/spm/hr/None/scatter',
+> '/rowers/workout/1/flexchart/spm/hr/None/scatter/',
+> '/rowers/workout/1/forcecurve',
+> '/rowers/workout/1/get-testscript',
+> '/rowers/workout/1/get-thumbnails',
+> '/rowers/workout/1/histo',
+> '/rowers/workout/1/image',
+> '/rowers/workout/1/instroke',
+> '/rowers/workout/1/interactiveotwplot',
+> '/rowers/workout/1/map',
+> '/rowers/workout/1/otwsetpower',
+> '/rowers/workout/1/recalcsummary/',
+> '/rowers/workout/1/restore',
+> '/rowers/workout/1/smoothenpace',
+> '/rowers/workout/1/split',
+> '/rowers/workout/1/stats',
+> '/rowers/workout/1/stream',
+> '/rowers/workout/1/task',
+> '/rowers/workout/1/test_strokedata',
+> '/rowers/workout/1/toggle-ranking',
+> '/rowers/workout/1/undosmoothenpace',
+> '/rowers/workout/1/unsubscribe',
+> '/rowers/workout/1/updatecp',
+> '/rowers/workout/1/view',
+> '/rowers/workout/1/wind',
+> '/rowers/workout/1/workflow',
+> '/rowers/workout/compare/1/2016-01-01/2016-12-31',
+> '/rowers/workout/fusion/1/',
+> '/rowers/workout/fusion/1/2016-01-01/2016-12-31',
+> '/rowers/workout/upload/',
+> '/rowers/workout/upload/team/',
+> '/rowers/workouts-join',
+> '/rowers/workouts-join-select/',
+> '/rowers/workouts-join-select/2016-01-01/2016-12-31',
+> ]
+
+! lijst = []
+> for url in urlstotest:
+> lijst.append(
+> (url,200)
+> )
+
+> @parameterized.expand(lijst)
+> def test_url_generator(self,url,expected):
+> response = self.c.get(url,follow=True)
+> if response.status_code != expected:
+> print response.status_code
+! self.assertEqual(response.status_code,
+! expected,
+! msg=url+' response status code not 200')
+
+
+ #@pytest.mark.django_db
+> class subroutinetests(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)
+! nu = datetime.datetime.now()
+> filename = 'rowers/tests/testdata/testdata.csv'
+> self.w = Workout.objects.create(name='testworkout',
+> workouttype='water',
+> user=r,date=nu.strftime('%Y-%m-%d'),
+> starttime=nu.strftime('%H:%M:%S'),
+> duration="0:55:00",distance=8000,
+> csvfilename=filename)
+
+
+> def c2stuff(self):
+> data = c2stuff.createc2workoutdata(self.w)
+! jsond = json.dumps(data)
+! data = c2stuff.createc2workoutdata_as_splits(w)
+> jsond = json.dumps(data)
+
+
+
+ #@pytest.mark.django_db
+> class PlotTests(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)
+! self.nu = datetime.datetime.now()
+> filename = 'rowers/tests/testdata/testdata.csv'
+> self.wotw = Workout.objects.create(name='testworkout',
+> workouttype='water',
+> user=r,date=self.nu.strftime('%Y-%m-%d'),
+> starttime=self.nu.strftime('%H:%M:%S'),
+> duration="0:55:00",distance=8000,
+> csvfilename=filename)
+
+> self.wote = Workout.objects.create(name='testworkout',
+> workouttype='Indoor Rower',
+> user=r,date=self.nu.strftime('%Y-%m-%d'),
+> starttime=self.nu.strftime('%H:%M:%S'),
+> duration="0:55:00",distance=8000,
+> csvfilename=filename)
+
+ # timestr = strftime("%Y%m%d-%H%M%S")
+ # imagename = f1+timestr+'.png'
+ # fullpathimagename = 'static/plots/'+imagename
+> powerperc = 100*np.array([r.pw_ut2,
+> r.pw_ut1,
+> r.pw_at,
+> r.pw_tr,r.pw_an])/r.ftp
+
+
+> self.hrdata = {
+> 'hrmax':r.max,
+> 'hrut2':r.ut2,
+> 'hrut1':r.ut1,
+> 'hrat':r.at,
+> 'hrtr':r.tr,
+> 'hran':r.an,
+> 'ftp':r.ftp,
+> 'powerperc':serialize_list(powerperc),
+> 'powerzones':serialize_list(r.powerzones),
+> }
+
+
+! def test_ote_plots(self):
+! w = self.wote
+> f1 = 'testdata.csv'[:-4]
+> timestr = strftime("%Y%m%d-%H%M%S")
+> imagename = f1+timestr+'.png'
+> fullpathimagename = 'static/plots/'+imagename
+ # make plot - asynchronous task
+> plotnr = 1
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 1
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 2
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 3
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 4
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+! except WindowsError:
+> pass
+
+> plotnr = 5
+! if (w.workouttype=='water'):
+> plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+> pass
+
+> plotnr = 6
+! if (w.workouttype=='water'):
+> plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+> pass
+
+> plotnr = 7
+! if (w.workouttype=='water'):
+> plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+> pass
+
+> plotnr = 8
+! if (w.workouttype=='water'):
+> plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+> pass
+
+> plotnr = 13
+! if (w.workouttype=='water'):
+> plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+> pass
+
+> def test_otw_plots(self):
+! w = self.wotw
+> f1 = 'testdata.csv'[:-4]
+> timestr = strftime("%Y%m%d-%H%M%S")
+> imagename = f1+timestr+'.png'
+> fullpathimagename = 'static/plots/'+imagename
+ # make plot - asynchronous task
+> plotnr = 1
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 1
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 2
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 3
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 4
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+> res = handle_makeplot(f1,w.csvfilename,
+> w.name,self.hrdata,plotnr,imagename)
+> i = GraphImage(workout=w,creationdatetime=self.nu,
+> filename=fullpathimagename)
+> try:
+> os.remove(fullpathimagename)
+> except WindowsError:
+> pass
+
+> plotnr = 5
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+! res = handle_makeplot(f1,w.csvfilename,
+! w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+! pass
+
+! plotnr = 6
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+! res = handle_makeplot(f1,w.csvfilename,
+! w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+! pass
+
+! plotnr = 7
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+! res = handle_makeplot(f1,w.csvfilename,
+! w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+! pass
+
+! plotnr = 8
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+! res = handle_makeplot(f1,w.csvfilename,
+! w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+! pass
+
+! plotnr = 9
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+! res = handle_makeplot(f1,w.csvfilename,
+! w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+! pass
+
+! plotnr = 13
+! if (w.workouttype=='water'):
+! plotnr = plotnr+3
+
+! res = handle_makeplot(f1,w.csvfilename,
+! w.name,self.hrdata,plotnr,imagename)
+! i = GraphImage(workout=w,creationdatetime=self.nu,
+! filename=fullpathimagename)
+! try:
+! os.remove(fullpathimagename)
+! except WindowsError:
+! pass
From 670d2fc722911bdaceca2fdb0294f00a54d614b9 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Wed, 2 Jan 2019 23:54:37 +0100
Subject: [PATCH 03/18] additional tests defined
---
rowers/tests/__init__.py | 28 +-
rowers/tests/test_emails.py | 157 ++++
rowers/tests/test_imports.py | 1083 ++++++++++++++++++++++++++
rowers/tests/test_models.py | 38 +-
rowers/tests/test_urls.py | 294 +++++++
rowers/tests/test_user.py | 67 +-
rowers/tests/tests.py | 1388 ----------------------------------
rowers/views.py | 8 +
8 files changed, 1625 insertions(+), 1438 deletions(-)
create mode 100644 rowers/tests/test_emails.py
create mode 100644 rowers/tests/test_imports.py
create mode 100644 rowers/tests/test_urls.py
diff --git a/rowers/tests/__init__.py b/rowers/tests/__init__.py
index 613de3e3..8fd9adf2 100644
--- a/rowers/tests/__init__.py
+++ b/rowers/tests/__init__.py
@@ -1,21 +1,21 @@
pkg_mox = None
-def setUpPackage():
- global pkg_mox
- import urllib
- import urllib2
- import mox
- import requests
- pkg_mox = mox.Mox()
- pkg_mox.StubOutWithMock(requests.api.sessions.Session, 'send')
- pkg_mox.StubOutWithMock(urllib.URLopener, 'open')
- pkg_mox.StubOutWithMock(urllib2.OpenerDirector, 'open')
- pkg_mox.ReplayAll()
+# def setUpPackage():
+# global pkg_mox
+# import urllib
+# import urllib2
+# import mox
+# import requests
+# pkg_mox = mox.Mox()
+# pkg_mox.StubOutWithMock(requests.api.sessions.Session, 'send')
+# pkg_mox.StubOutWithMock(urllib.URLopener, 'open')
+# pkg_mox.StubOutWithMock(urllib2.OpenerDirector, 'open')
+# pkg_mox.ReplayAll()
-def tearDownPackage():
- pkg_mox.VerifyAll()
- pkg_mox.UnsetStubs()
+#def tearDownPackage():
+# pkg_mox.VerifyAll()
+# pkg_mox.UnsetStubs()
from tests import *
diff --git a/rowers/tests/test_emails.py b/rowers/tests/test_emails.py
new file mode 100644
index 00000000..ed0d5530
--- /dev/null
+++ b/rowers/tests/test_emails.py
@@ -0,0 +1,157 @@
+#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
+
+
+#@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()
+ )
+
+ 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('requests.get', side_effect=mocked_requests)
+ def test_emailprocessing(self, mock_get):
+ out = StringIO()
+ call_command('processemail', stdout=out,testing=True)
+ self.assertIn('Successfully processed email attachments',out.getvalue())
+
diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py
new file mode 100644
index 00000000..b550cb71
--- /dev/null
+++ b/rowers/tests/test_imports.py
@@ -0,0 +1,1083 @@
+#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 django_mailbox.models import Mailbox,MessageAttachment,Message
+
+#@pytest.mark.django_db
+class DjangoTestCase(TestCase, MockTestCase):
+ def _pre_setup(self):
+ MockTestCase.setUp(self)
+ TestCase._pre_setup(self)
+ self.client = Client()
+
+ def _post_teardown(self):
+ TestCase._post_teardown(self)
+ MockTestCase.tearDown(self)
+ delete_strokedata(1)
+
+# to be done add polar mocks (for email processing)
+def mocked_requests(*args, **kwargs):
+ with open('rowers/tests/testdata/c2jsonworkoutdata.txt','r') as infile:
+ c2workoutdata = json.load(infile)
+
+ with open('rowers/tests/testdata/c2jsonstrokedata.txt','r') as infile:
+ c2strokedata = json.load(infile)
+
+ polar_json = {
+ 'available-user-data': []
+ }
+
+ c2workoutlist = json.load(open('rowers/tests/testdata/c2workoutlist.txt'))
+
+ c2uploadjson = {
+ "data": {
+ "id": 339,
+ "user_id": 1,
+ "date": "2015-08-05 13:15:41",
+ "timezone": "Europe/London",
+ "date_utc": "2015-08-05 12:15:41",
+ "distance": 5649,
+ "type": "rower",
+ "time": 8649,
+ "time_formatted": "14:24.9",
+ "workout_type": "JustRow",
+ "source": "ErgData",
+ "weight_class": "H",
+ "verified": True,
+ "ranked": False
+ }
+ }
+
+ stravaworkoutlist = json.load(open('rowers/tests/testdata/stravaworkoutlist.txt'))
+ sporttracksworkoutlist = json.load(open('rowers/tests/testdata/sporttracksworkouts.txt'))
+
+ rkworkoutlistjson = json.load(open('rowers/tests/testdata/rkworkoutslist.txt','r'))
+ uaworkoutlistjson = json.load(open('rowers/tests/testdata/uaworkoutlist.txt','r'))
+
+ stravasummaryjson = json.load(open('rowers/tests/testdata/stravaworkoutsummary.txt','r'))
+
+ stravatimejson = json.load(open('rowers/tests/testdata/stravatimetestdata.txt','r'))
+ stravavelojson = json.load(open('rowers/tests/testdata/stravavelotestdata.txt','r'))
+
+ stravapowerjson = json.load(open('rowers/tests/testdata/stravapowertestdata.txt','r'))
+
+ stravadistancejson = json.load(open('rowers/tests/testdata/stravadistancetestdata.txt','r'))
+ stravalatlongjson = json.load(open('rowers/tests/testdata/stravalatlongtestdata.txt','r'))
+ stravahrjson = json.load(open('rowers/tests/testdata/stravahrtestdata.txt','r'))
+ stravaspmjson = json.load(open('rowers/tests/testdata/stravaspmtestdata.txt','r'))
+
+ uapostworkoutjson = json.load(open('rowers/tests/testdata/uapostworkoutresponse.txt','r'))
+
+ tpuploadresponse = json.load(open('rowers/tests/testdata/tpuploadresponse.txt','r'))
+
+ stravastreamjson = {
+ 'time':stravatimejson,
+ 'velocity_smooth':stravavelojson,
+ 'distance':stravadistancejson,
+ 'latlng':stravalatlongjson,
+ 'heartrate':stravahrjson,
+ 'cadence':stravaspmjson,
+ 'power':stravapowerjson,
+ }
+
+ ststrokesjson = json.load(open('rowers/tests/testdata/sporttracksstrokedata.txt','r'))
+
+ rkstrokesjson = json.load(open('rowers/tests/testdata/rkstrokes.txt','r'))
+
+ uastrokesjson = json.load(open('rowers/tests/testdata/uastrokes.txt','r'))
+ uauserjson = json.load(open('rowers/tests/testdata/uauser.txt','r'))
+
+ class MockResponse:
+ def __init__(self, json_data, status_code):
+ self.json_data = json_data
+ self.status_code = status_code
+
+ def json(self):
+ return self.json_data
+
+
+ class MockHeaderResponse:
+ def __init__(self, header_data, status_code):
+ self.headers = header_data
+ self.status_code = status_code
+
+ class MockSession:
+ def send(self,prepped):
+ # prepped.url
+ # prepped.body (post data)
+ # prepped.headers
+ # prepped.method
+
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+
+ return MockResponse(json_data,200)
+
+ if not args:
+ return MockSession()
+
+ print args[0],'aap'
+
+ polartester = re.compile('.*?polaraccesslink\.com')
+ c2tester = re.compile('.*?log\.concept2\.com')
+ stravatester = re.compile('.*?strava\.com')
+ sttester = re.compile('.*?sporttracks\.mobi')
+ rktester = re.compile('.*?runkeeper\.com')
+ uatester = re.compile('.*?mapmyfitness\.com')
+ tptester = re.compile('.*?trainingpeaks\.com')
+
+ c2importregex = '.*?concept2.com\/api\/users\/me\/results\/\d+'
+ c2importtester = re.compile(c2importregex)
+
+ c2uploadregex = '.*?concept2.com\/api\/users\/\d+\/results$'
+ c2uploadtester = re.compile(c2uploadregex)
+
+ c2strokesregex = '.*?concept2.com\/api\/users\/me\/results\/\d+\/strokes'
+ c2strokestester = re.compile(c2strokesregex)
+
+ c2workoutlistregex = '.*?concept2\.com\/api\/users\/me\/results\?page=\d'
+ c2workoutlisttester = re.compile(c2workoutlistregex)
+
+ stravaworkoutlistregex = '.*?strava\.com\/api\/v3\/athlete\/activities'
+ stravaworkoutlisttester = re.compile(stravaworkoutlistregex)
+
+ stravastreamregex = '.*?strava\.com\/api\/v3\/activities\/\d+\/streams\/(\w.*?)\?'
+ stravastreamtester = re.compile(stravastreamregex)
+
+ stravasummaryregex = '.*?strava\.com\/api\/v3\/activities\/\d+$'
+ stravasummarytester = re.compile(stravasummaryregex)
+
+ stuploadregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities.json$'
+ stuploadtester = re.compile(stuploadregex)
+
+ stworkoutlistregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities$'
+ stworkoutlisttester = re.compile(stworkoutlistregex)
+
+ ststrokesregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/\d+$'
+ ststrokestester = re.compile(ststrokesregex)
+
+ rkuploadregex = '.*?api\.runkeeper\.com\/fitnessActivities$'
+ rkuploadtester = re.compile(rkuploadregex)
+ rkuserregex = '.*?api\.runkeeper\.com\/user$'
+ rkusertester = re.compile(rkuserregex)
+ rkstrokesregex = '.*?api\.runkeeper\.com\/fitnessActivities/\d+$'
+ rkstrokestester = re.compile(rkstrokesregex)
+
+ uaapiregex = '.*?api\.ua\.com'
+ uaapitester = re.compile(uaapiregex)
+
+ uauploadregex = '.*?api\.ua\.com\/v7.1\/workout\/$'
+ uauploadtester = re.compile(uauploadregex)
+
+ uastrokesregex = '.*?api\.ua\.com\/v7.1\/workout\/\d+'
+ uastrokestester = re.compile(uastrokesregex)
+
+ ualistregex = '.*?api\.ua\.com\/v7.1\/workout\/\?user'
+ ualisttester = re.compile(ualistregex)
+
+ uauserregex = '.*?api\.ua\.com\/v7.1\/user\/self\/'
+ uausertester = re.compile(uauserregex)
+
+ tpuploadregex = '.*?trainingpeaks\.com\/v1\/file'
+ tpuploadtester = re.compile(tpuploadregex)
+
+ if polartester.match(args[0]):
+ json_data = polar_json
+ return MockResponse(json_data,200)
+
+ if tptester.match(args[0]):
+ if 'token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ elif tpuploadtester.match(args[0]):
+ return MockResponse(tpuploadresponse,200)
+
+ if uaapitester.match(args[0]):
+ if 'access_token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ elif uauploadtester.match(args[0]):
+ if 'data' in kwargs:
+ return MockResponse(uapostworkoutjson,200)
+ elif uastrokestester.match(args[0]):
+ return MockResponse(uastrokesjson,200)
+ elif ualisttester.match(args[0]):
+ return MockResponse(uaworkoutlistjson,200)
+ elif uausertester.match(args[0]):
+ return MockResponse(uauserjson,200)
+
+
+ if uatester.match(args[0]):
+ if 'access_token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+
+
+ if rktester.match(args[0]):
+ if 'token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ elif rkuploadtester.match(args[0]):
+ if 'data' in kwargs:
+ # post
+ header_data = {
+ 'Location': '/fitnessActivities/12'
+ }
+ return MockHeaderResponse(header_data,200)
+ else:
+ json_data = rkworkoutlistjson
+ return MockResponse(json_data,200)
+ elif rkusertester.match(args[0]):
+ json_data = {
+ "userID": 1234567890,
+ "profile": "/profile",
+ "settings": "/settings",
+ "fitness_activities": "/fitnessActivities",
+ "strength_training_activities": "/strengthTrainingActivities",
+ "background_activities": "/backgroundActivities",
+ "sleep": "/sleep",
+ "nutrition": "/nutrition",
+ "weight": "/weight",
+ "general_measurements": "/generalMeasurements",
+ "diabetes": "/diabetes",
+ "records": "/records",
+ "team": "/team"
+ }
+ return MockResponse(json_data, 200)
+ elif rkstrokestester.match(args[0]):
+ return MockResponse(rkstrokesjson,200)
+
+ if sttester.match(args[0]):
+ if 'oauth2/token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ if ststrokestester.match(args[0]):
+ return MockResponse(ststrokesjson,200)
+ if stuploadtester.match(args[0]):
+ json_data = {
+ "uris": [
+ "https://api.sporttracks.mobi/api/v2/fitnessActivities/123456.json"
+ ]
+ }
+ return MockResponse(json_data, 200)
+ if stworkoutlisttester.match(args[0]):
+ return MockResponse(sporttracksworkoutlist,200)
+
+
+ if stravatester.match(args[0]):
+ if stravaworkoutlisttester.match(args[0]):
+ return MockResponse(stravaworkoutlist,200)
+ if stravastreamtester.match(args[0]):
+ metric = stravastreamtester.match(args[0]).group(1)
+ json_data = stravastreamjson[metric]
+ return MockResponse(json_data,200)
+ elif stravasummarytester.match(args[0]):
+ return MockResponse(stravasummaryjson,200)
+ elif 'token' in args[0]:
+ json_data = {
+ "token_type": "Bearer",
+ "access_token": "987654321234567898765432123456789",
+ "refresh_token": "1234567898765432112345678987654321",
+ "expires_at": 1531385304
+ }
+ return MockResponse(json_data,200)
+
+
+ if c2tester.match(args[0]):
+ if c2uploadtester.match(args[0]):
+ return MockResponse(c2uploadjson,201)
+ if c2strokestester.match(args[0]):
+ return MockResponse(c2strokedata,200)
+ elif c2importtester.match(args[0]):
+ return MockResponse(c2workoutdata,200)
+ elif c2workoutlisttester.match(args[0]):
+ return MockResponse(c2workoutlist,200)
+ elif 'access_token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ elif 'users/me' in args[0]:
+ json_data = {
+ 'data': {
+ 'username': 'john',
+ 'id': 1234,
+ }
+ }
+ return MockResponse(json_data,200)
+ elif 'results' in args[0]:
+ json_data = {
+ 'data': {
+ 'id': 1223,
+ }
+ }
+ else:
+ return MockResponse(c2workoutdata,200)
+
+ return MockResponse(None,412)
+
+#@pytest.mark.django_db
+class C2Objects(DjangoTestCase):
+ def setUp(self):
+ self.c = Client()
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'John'
+ self.u.last_name = 'Sander'
+ self.u.save()
+ self.r = Rower.objects.create(user=self.u,gdproptin=True,
+ gdproptindate=timezone.now()
+ )
+
+ self.r.c2token = '12'
+ self.r.c2refreshtoken = 'ab'
+ self.r.tokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
+ 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.c2stuff.requests.Session', side_effect=mocked_requests)
+ def test_c2_callback(self, mock_Session):
+ response = self.c.get('/call_back?code=dsdoij232s',follow=True)
+
+
+ self.assertEqual(response.status_code, 200)
+
+
+ @patch('rowers.c2stuff.Session', side_effect=mocked_requests)
+ def test_c2_token_refresh(self, mock_post):
+ response = self.c.get('/rowers/me/c2refresh/',follow=True)
+
+ self.assertEqual(response.status_code, 200)
+
+
+ @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+ def test_c2_upload(self, mock_get, mock_post):
+ response = self.c.get('/rowers/workout/1/c2uploadw/')
+
+ 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.c2stuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+ def test_c2_list(self, mock_get, mock_post):
+ response = self.c.get('/rowers/workout/c2list',follow=True)
+
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+ def test_c2_import(self, mock_get):
+
+ response = self.c.get('/rowers/workout/c2import/12/',follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/workout/2/edit',
+ status_code=302,target_status_code=200)
+
+ self.assertEqual(response.status_code, 200)
+
+
+ def test_strokedata(self):
+ with open('rowers/tests/testdata/c2stroketestdata.txt','r') as infile:
+ res = json.load(infile)
+
+ strokedata = pd.DataFrame.from_dict(res['data'])
+
+ with open('rowers/tests/testdata/c2testdata.txt','r') as infile:
+ res = json.load(infile)
+
+ data = res['data']
+
+ from rowers.views import add_workout_from_strokedata
+
+ res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
+
+ def test_strokedatanohr(self):
+ with open('rowers/tests/testdata/c2strokedatanohr.txt','r') as infile:
+ res = json.load(infile)
+
+ strokedata = pd.DataFrame.from_dict(res['data'])
+
+ with open('rowers/tests/testdata/c2testdata.txt','r') as infile:
+ res = json.load(infile)
+
+ data = res['data']
+
+ from rowers.views import add_workout_from_strokedata
+
+
+ res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
+
+class C2ObjectsTokenExpired(DjangoTestCase):
+ def setUp(self):
+ self.c = Client()
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'John'
+ self.u.last_name = 'Sander'
+ self.u.save()
+ self.r = Rower.objects.create(user=self.u,gdproptin=True,
+ gdproptindate=timezone.now()
+ )
+
+ self.r.c2token = '12'
+ self.r.c2refreshtoken = 'ab'
+ self.r.tokenexpirydate = datetime.datetime.now()-datetime.timedelta(days=1)
+ 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.c2stuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+ def test_c2_list(self, mock_get, mock_post):
+ response = self.c.get('/rowers/workout/c2list',follow=True)
+
+ self.assertEqual(response.status_code,404)
+
+ @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
+ def test_c2_import(self, mock_get):
+
+ response = self.c.get('/rowers/workout/c2import/12/',follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/list-workouts/',
+ status_code=302,target_status_code=200)
+
+ self.assertEqual(response.status_code, 200)
+
+
+
+#@pytest.mark.django_db
+class StravaObjects(DjangoTestCase):
+ def setUp(self):
+ self.c = Client()
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'John'
+ self.u.last_name = 'Sander'
+ self.u.save()
+ self.r = Rower.objects.create(user=self.u,gdproptin=True,
+ gdproptindate=timezone.now()
+ )
+
+ self.r.stravatoken = '12'
+
+ self.r.save()
+ self.c.login(username='john',password='koeinsloot')
+
+ @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
+ def test_strava_list(self, mock_get):
+ response = self.c.get('/rowers/workout/stravaimport/',follow=True)
+
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.utils.requests.get', side_effect=mocked_requests)
+ def test_strava_import(self, mock_get):
+
+ response = self.c.get('/rowers/workout/stravaimport/12',follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/workout/1/edit',
+ status_code=301,target_status_code=200)
+
+ self.assertEqual(response.status_code, 200)
+
+
+
+#@pytest.mark.django_db
+class STObjects(DjangoTestCase):
+ def setUp(self):
+ self.c = Client()
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'John'
+ self.u.last_name = 'Sander'
+ self.u.save()
+ self.r = Rower.objects.create(user=self.u,gdproptin=True,
+ gdproptindate=timezone.now()
+ )
+
+
+ self.r.sporttrackstoken = '12'
+ self.r.sporttracksrefreshtoken = '12'
+ self.r.sporttrackstokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
+ 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.sporttracksstuff.requests.post', side_effect=mocked_requests)
+ def test_sporttracks_callback(self, mock_post):
+ response = self.c.get('/sporttracks_callback?code=dsdoij232s',follow=True)
+
+
+ self.assertEqual(response.status_code, 200)
+
+
+ @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
+ def test_sporttracks_token_refresh(self, mock_post):
+ response = self.c.get('/rowers/me/sporttracksrefresh/',follow=True)
+
+ self.assertEqual(response.status_code, 200)
+
+
+ @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests)
+ def test_sporttracks_upload(self, mock_get, mock_post):
+ response = self.c.get('/rowers/workout/1/sporttracksuploadw/')
+
+ 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.sporttracksstuff.requests.get', side_effect=mocked_requests)
+ def test_sporttracks_list(self, mock_get):
+ response = self.c.get('/rowers/workout/sporttracksimport',follow=True)
+
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.imports.requests.get', side_effect=mocked_requests)
+ def test_sporttracks_import(self, mock_get):
+
+ response = self.c.get('/rowers/workout/sporttracksimport/12/',follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/workout/2/edit',
+ status_code=302,target_status_code=200)
+
+ self.assertEqual(response.status_code, 200)
+
+ def test_strokedata(self):
+ with open('rowers/tests/testdata/sporttrackstestdata.txt','r') as infile:
+ data = json.load(infile)
+
+ from rowers.sporttracksstuff import add_workout_from_data
+
+ res = add_workout_from_data(self.u,1,data,data)
+
+ def test_strokedatanohr(self):
+ with open('rowers/tests/testdata/sporttrackstestnohr.txt','r') as infile:
+ data = json.load(infile)
+
+ from rowers.sporttracksstuff import add_workout_from_data
+
+
+
+ res = add_workout_from_data(self.u,1,data,data)
+
+#@pytest.mark.django_db
+class RunKeeperObjects(DjangoTestCase):
+ def setUp(self):
+ self.c = Client()
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'John'
+ self.u.last_name = 'Sander'
+ self.u.save()
+ self.r = Rower.objects.create(user=self.u,gdproptin=True,
+ gdproptindate=timezone.now()
+ )
+
+
+ self.r.runkeepertoken = '12'
+
+ 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.runkeeperstuff.requests.post', side_effect=mocked_requests)
+ def test_runkeeper_callback(self, mock_post):
+ response = self.c.get('/runkeeper_callback?code=dsdoij232s',follow=True)
+
+ self.assertEqual(response.status_code, 200)
+
+ @patch('rowers.runkeeperstuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests)
+ def test_runkeeper_upload(self, mock_get, mock_post):
+ response = self.c.get('/rowers/workout/1/runkeeperuploadw/')
+
+ 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.runkeeperstuff.requests.get', side_effect=mocked_requests)
+ def test_runkeeper_list(self, mock_get):
+ response = self.c.get('/rowers/workout/runkeeperimport',follow=True)
+
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.imports.requests.get', side_effect=mocked_requests)
+ def test_runkeeper_import(self, mock_get):
+
+ response = self.c.get('/rowers/workout/runkeeperimport/12/',follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/workout/2/edit',
+ status_code=302,target_status_code=200)
+
+ self.assertEqual(response.status_code, 200)
+
+
+
+#@pytest.mark.django_db
+class UAObjects(DjangoTestCase):
+ def setUp(self):
+ self.c = Client()
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'John'
+ self.u.last_name = 'Sander'
+ self.u.save()
+ self.r = Rower.objects.create(user=self.u,gdproptin=True,
+ gdproptindate=timezone.now()
+ )
+
+
+ self.r.underarmourtoken = '12'
+ self.r.underarmourrefreshtoken = '12'
+ self.r.underarmourtokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
+ 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.imports.requests.post', side_effect=mocked_requests)
+ def test_underarmour_callback(self, mock_post):
+ response = self.c.get('/underarmour_callback?code=dsdoij232s',follow=True)
+
+
+ self.assertEqual(response.status_code, 200)
+
+
+ @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
+ def test_underarmour_token_refresh(self, mock_post):
+ response = self.c.get('/rowers/me/underarmourrefresh/',follow=True)
+
+ self.assertEqual(response.status_code, 200)
+
+
+ @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.underarmourstuff.requests.get', side_effect=mocked_requests)
+ def test_underarmour_upload(self, mock_get, mock_post):
+ response = self.c.get('/rowers/workout/1/underarmouruploadw/')
+
+ 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.underarmourstuff.requests.get', side_effect=mocked_requests)
+ def test_underarmour_list(self, mock_get):
+ response = self.c.get('/rowers/workout/underarmourimport',follow=True)
+
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.imports.requests.get', side_effect=mocked_requests)
+ def test_underarmour_import(self, mock_get):
+
+ response = self.c.get('/rowers/workout/underarmourimport/12/',follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/workout/2/edit',
+ status_code=302,target_status_code=200)
+
+ self.assertEqual(response.status_code, 200)
+
+
+#@pytest.mark.django_db
+class TPObjects(DjangoTestCase):
+ def setUp(self):
+ self.c = Client()
+ self.u = User.objects.create_user('john',
+ 'sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'John'
+ self.u.last_name = 'Sander'
+ self.u.save()
+ self.r = Rower.objects.create(user=self.u,gdproptin=True,
+ gdproptindate=timezone.now()
+ )
+
+
+ self.r.tptoken = '12'
+ self.r.tprefreshtoken = '12'
+ self.r.tptokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
+ 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.imports.requests.post', side_effect=mocked_requests)
+ def test_tp_callback(self, mock_post):
+ response = self.c.get('/tp_callback?code=dsdoij232s',follow=True)
+
+
+ self.assertEqual(response.status_code, 200)
+
+
+ @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
+ def test_tp_token_refresh(self, mock_post):
+ response = self.c.get('/rowers/me/tprefresh/',follow=True)
+
+ self.assertEqual(response.status_code, 200)
+
+
+ @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
+ def test_tp_upload(self, mock_get, mock_post):
+ response = self.c.get('/rowers/workout/1/tpuploadw/')
+
+ 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)
+
+
+#@pytest.mark.django_db
+class AutoExportTests(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()
+ )
+
+ r.c2_auto_export = True
+ r.sporttracks_auto_export = True
+ r.mapmyfitness_auto_export = True
+ r.trainingpeaks_auto_export = True
+
+ r.save()
+
+ nu = datetime.datetime.now()
+ workoutsbox = Mailbox.objects.create(name='workouts')
+ workoutsbox.save()
+ failbox = Mailbox.objects.create(name='Failed')
+ failbox.save()
+
+ filename = 'testdata.csv'
+
+ m = Message(mailbox=workoutsbox,
+ from_header = u.email,
+ subject = filename,
+ body="""
+---
+workouttype: water
+boattype: 2x
+...
+ """)
+ m.save()
+ a2 = 'media/mailbox_attachments/'+filename
+ copyfile('rowers/tests/testdata/'+filename,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 WindowsError:
+ pass
+
+ @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
+ @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
+ def test_emailprocessing(self, mock_post, mock_get):
+ out = StringIO()
+ call_command('processemail', stdout=out, testing=True)
+ self.assertIn('Successfully processed email attachments',out.getvalue())
diff --git a/rowers/tests/test_models.py b/rowers/tests/test_models.py
index 42f9bf71..a054bbb7 100644
--- a/rowers/tests/test_models.py
+++ b/rowers/tests/test_models.py
@@ -2,13 +2,47 @@ from django.test import TestCase
from rowers.models import *
class FormTests(TestCase):
- def SetUp(self):
+ def setUp(self):
self.u = User.objects.create_user('john',
'sander@ds.ds',
'koeinsloot')
- r = Rower.objects.create(user=u)
+ r = Rower.objects.create(user=self.u)
def test_form(self):
form = TeamInviteForm()
+
+
+class ModelTests(TestCase):
+ def setUp(self):
+ self.u = User.objects.create_user('john',
+ 'Sander@ds.ds',
+ 'koeinsloot')
+
+ self.u.first_name = 'Sander'
+ self.u.last_name = 'Roosendaal'
+ self.u.save()
+
+ self.r = Rower.objects.create(user=self.u)
+
+ def create_team(self):
+ return Team.objects.create(
+ name = 'test team',
+ manager = self.u,
+ )
+
+ def create_paidplan(self):
+ return PaidPlan.objects.create(
+ name = 'test plan',
+ shortname = 'pro',
+ price = 15.0,
+ )
+
+ def test_models(self):
+ pp = self.create_paidplan()
+ team = self.create_team()
+ self.assertEqual(u'%s' % pp,u'test plan - pro at 15.00 EURO (single payment)')
+ self.assertEqual(u'%s' % self.r, u'Sander Roosendaal')
+ self.assertEqual('%s' % self.r, 'Sander Roosendaal')
+ self.assertEqual(self.r.clean_email(),'sander@ds.ds')
diff --git a/rowers/tests/test_urls.py b/rowers/tests/test_urls.py
new file mode 100644
index 00000000..012a8bc4
--- /dev/null
+++ b/rowers/tests/test_urls.py
@@ -0,0 +1,294 @@
+#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()
+
+
+#@pytest.mark.django_db
+class URLTests(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,rowerplan='coach')
+ self.c = Client()
+ self.c.login(username='john',password='koeinsloot')
+
+ self.nu = datetime.datetime.now()
+ filename = 'rowers/tests/testdata/testdata.csv'
+ self.wotw = Workout.objects.create(name='testworkout',
+ workouttype='water',
+ user=r,date=self.nu.strftime('%Y-%m-%d'),
+ starttime=self.nu.strftime('%H:%M:%S'),
+ duration="0:55:00",distance=8000,
+ csvfilename=filename)
+
+ self.wote = Workout.objects.create(name='testworkout',
+ workouttype='Indoor Rower',
+ user=r,date=self.nu.strftime('%Y-%m-%d'),
+ starttime=self.nu.strftime('%H:%M:%S'),
+ duration="0:55:00",distance=8000,
+ csvfilename=filename)
+
+ powerperc = 100*np.array([r.pw_ut2,
+ r.pw_ut1,
+ r.pw_at,
+ r.pw_tr,r.pw_an])/r.ftp
+
+
+ self.hrdata = {
+ 'hrmax':r.max,
+ 'hrut2':r.ut2,
+ 'hrut1':r.ut1,
+ 'hrat':r.at,
+ 'hrtr':r.tr,
+ 'hran':r.an,
+ 'ftp':r.ftp,
+ 'powerperc':serialize_list(powerperc),
+ 'powerzones':serialize_list(r.powerzones),
+ }
+
+ urlstotest = [
+ '/rowers/400/',
+ '/rowers/403/',
+ '/rowers/404/',
+ '/rowers/500/',
+ '/rowers/502/',
+ '/rowers/1/list-workouts/',
+ '/rowers/1/list-workouts/2016-01-01/2016-12-31',
+ '/rowers/1/ote-bests/',
+ '/rowers/1/ote-bests2/2016-01-01/2016-12-31',
+ '/rowers/about',
+ '/rowers/addmanual/',
+ '/rowers/agegroupcp/30',
+ '/rowers/agegroupcp/30/1',
+ '/rowers/agegrouprecords/male/hwt',
+ '/rowers/agegrouprecords/male/hwt/2000m',
+ '/rowers/agegrouprecords/male/hwt/2000min',
+ '/rowers/ajax_agegroup/45/hwt/male/1',
+ '/rowers/analysis/',
+ '/rowers/analysis/user/1',
+ '/rowers/brochure',
+ '/rowers/courses/upload',
+ '/rowers/createplan/',
+ '/rowers/createplan/user/1/',
+ '/rowers/cumstats/',
+ '/rowers/cumstats/2016-01-01/2016-12-31',
+ '/rowers/cumstats/user/1',
+ '/rowers/cumstats/user/1/2016-01-01/2016-12-31',
+ '/rowers/developers',
+ '/rowers/email/',
+ '/rowers/email/thankyou/',
+ '/rowers/fitness-progress/',
+ '/rowers/fitness-progress/user/1',
+ '/rowers/fitness-progress/user/1/rower',
+ '/rowers/flexall/',
+ '/rowers/flexall/spm/hr/None/',
+ '/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/',
+ '/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/user/1',
+ '/rowers/flexall/user/1/',
+ '/rowers/flexalldata/',
+ '/rowers/help',
+ '/rowers/histo/',
+ '/rowers/histo/user/1',
+ '/rowers/histo/user/1/2016-01-01/2016-12-31',
+ '/rowers/histodata',
+ '/rowers/job-kill/1',
+ '/rowers/jobs-status/',
+ '/rowers/laboratory/',
+ '/rowers/laboratory/user/1',
+ '/rowers/legal',
+ '/rowers/list-courses/',
+ '/rowers/list-graphs/',
+ '/rowers/list-jobs/',
+ '/rowers/list-workouts/',
+ '/rowers/list-workouts/2016-01-01/2016-12-31',
+ '/rowers/list-workouts/2016-01-01/2016-12-31/user/1/',
+ '/rowers/list-workouts/ranking',
+ '/rowers/list-workouts/user/1/',
+ '/rowers/me/calcdps/',
+ '/rowers/me/edit/',
+ '/rowers/me/edit/user/1',
+ '/rowers/me/exportsettings/',
+ '/rowers/me/exportsettings/user/1',
+ '/rowers/me/favoritecharts/',
+ '/rowers/me/favoritecharts/user/1',
+ '/rowers/me/invitation/',
+ '/rowers/me/preferences/',
+ '/rowers/me/preferences/user/1',
+ '/rowers/me/request/',
+ '/rowers/me/teams/',
+ '/rowers/me/workflowconfig2/',
+ '/rowers/me/workflowconfig2/user/1',
+ '/rowers/me/workflowdefault',
+ '/rowers/multi-compare',
+ '/rowers/ote-bests/',
+ '/rowers/ote-bests/2016-01-01/2016-12-31',
+ '/rowers/ote-bests/user/1',
+ '/rowers/ote-bests/user/1/2016-01-01/2016-12-31',
+ '/rowers/ote-bests2/',
+ '/rowers/ote-bests2/2016-01-01/2016-12-31',
+ '/rowers/ote-bests2/user/1',
+ '/rowers/ote-ranking/',
+ '/rowers/ote-ranking/2016-01-01/2016-12-31',
+ '/rowers/ote-ranking/user/1/',
+ '/rowers/ote-ranking/user/1/2016-01-01/2016-12-31',
+ '/rowers/otw-bests/',
+ '/rowers/otw-bests/2016-01-01/2016-12-31',
+ '/rowers/otw-bests/user/1/2016-01-01/2016-12-31',
+ '/rowers/partners',
+ '/rowers/physics',
+ '/rowers/planrequired',
+ '/rowers/promembership',
+ '/rowers/register',
+ '/rowers/register/thankyou/',
+ '/rowers/sessions/',
+ '/rowers/sessions/2016-01-01/2016-12-31',
+ '/rowers/sessions/2016-01-01/2016-12-31/user/1',
+ '/rowers/sessions/coach/',
+ '/rowers/sessions/coach/user/1/',
+ '/rowers/sessions/create/',
+ '/rowers/sessions/create/user/1',
+ '/rowers/sessions/manage/',
+ '/rowers/sessions/manage/user/1/',
+ '/rowers/sessions/multiclone/',
+ '/rowers/sessions/multiclone/user/1/',
+ '/rowers/sessions/multicreate/',
+ '/rowers/sessions/multicreate/user/1/',
+ '/rowers/sessions/print/',
+ '/rowers/sessions/print/user/1',
+ '/rowers/sessions/teamcreate/',
+ '/rowers/sessions/user/1',
+ '/rowers/team-compare-select/',
+ '/rowers/team-compare-select/workout/1',
+ '/rowers/team-compare-select/2016-01-01/2016-12-31',
+ '/rowers/test-job/2',
+ '/rowers/test-job2/2',
+ '/rowers/test_callback',
+ '/rowers/updatefitness',
+ '/rowers/updatefitness/rower',
+ '/rowers/updatefitness/rower/50',
+ '/rowers/user-boxplot',
+ '/rowers/user-boxplot-data',
+ '/rowers/user-boxplot-select/',
+ '/rowers/user-boxplot-select/user/1/',
+ '/rowers/user-boxplot/user/1',
+ '/rowers/user-multiflex-data',
+ '/rowers/user-multiflex-select/',
+ '/rowers/user-multiflex-select/2016-01-01/2016-12-31',
+ '/rowers/user-multiflex-select/user/1/',
+ '/rowers/user-multiflex-select/user/1/2016-01-01/2016-12-31',
+ '/rowers/user-multiflex/',
+ '/rowers/user-multiflex/user/1',
+ '/rowers/workout/1/',
+ '/rowers/workout/1/adddistanceplot',
+ '/rowers/workout/1/adddistanceplot2',
+ '/rowers/workout/1/addotwpowerplot',
+ '/rowers/workout/1/addpiechart',
+ '/rowers/workout/1/addpowerpiechart',
+ '/rowers/workout/1/addstatic',
+ '/rowers/workout/1/addstatic/3',
+ '/rowers/workout/1/addtimeplot',
+ '/rowers/workout/1/addtimeplot2',
+ '/rowers/workout/1/comment',
+ '/rowers/workout/1/darkskywind',
+ '/rowers/workout/1/data',
+ '/rowers/workout/1/edit',
+ '/rowers/workout/1/editintervals',
+ '/rowers/workout/1/flexchart',
+ '/rowers/workout/1/flexchart/spm/hr/None',
+ '/rowers/workout/1/flexchart/spm/hr/None/scatter',
+ '/rowers/workout/1/flexchart/spm/hr/None/scatter/',
+ '/rowers/workout/1/forcecurve',
+ '/rowers/workout/1/get-testscript',
+ '/rowers/workout/1/get-thumbnails',
+ '/rowers/workout/1/histo',
+ '/rowers/workout/1/image',
+ '/rowers/workout/1/instroke',
+ '/rowers/workout/1/interactiveotwplot',
+ '/rowers/workout/1/map',
+ '/rowers/workout/1/otwsetpower',
+ '/rowers/workout/1/recalcsummary/',
+ '/rowers/workout/1/restore',
+ '/rowers/workout/1/smoothenpace',
+ '/rowers/workout/1/split',
+ '/rowers/workout/1/stats',
+ '/rowers/workout/1/stream',
+ '/rowers/workout/1/task',
+ '/rowers/workout/1/test_strokedata',
+ '/rowers/workout/1/toggle-ranking',
+ '/rowers/workout/1/undosmoothenpace',
+ '/rowers/workout/1/unsubscribe',
+ '/rowers/workout/1/updatecp',
+ '/rowers/workout/1/view',
+ '/rowers/workout/1/wind',
+ '/rowers/workout/1/workflow',
+ '/rowers/workout/compare/1/2016-01-01/2016-12-31',
+ '/rowers/workout/fusion/1/',
+ '/rowers/workout/fusion/1/2016-01-01/2016-12-31',
+ '/rowers/workout/upload/',
+ '/rowers/workout/upload/team/',
+ '/rowers/workouts-join',
+ '/rowers/workouts-join-select/',
+ '/rowers/workouts-join-select/2016-01-01/2016-12-31',
+ ]
+
+ lijst = []
+ for url in urlstotest:
+ lijst.append(
+ (url,200)
+ )
+
+ @parameterized.expand(lijst)
+ def test_url_generator(self,url,expected):
+ response = self.c.get(url,follow=True)
+ if response.status_code != expected:
+ print response.status_code
+ self.assertEqual(response.status_code,
+ expected,
+ msg=url+' response status code not 200')
+
+
diff --git a/rowers/tests/test_user.py b/rowers/tests/test_user.py
index 3a91de7d..e7426321 100644
--- a/rowers/tests/test_user.py
+++ b/rowers/tests/test_user.py
@@ -19,6 +19,8 @@ import rowers.dataprep as dataprep
from redis import StrictRedis
redis_connection = StrictRedis()
+from rowingdata import rowingdata as rdata
+from rowingdata import rower as rrower
from rowers.models import User,Rower, Workout
@@ -27,51 +29,48 @@ class UserMiddleWareTest(TestCase):
u = User.objects.create_user('john',
'sander@ds.ds',
'koeinsloot')
- r = Rower.objects.create(user=u)
+ self.r = Rower.objects.create(user=u)
self.c = Client()
self.c.login(username='john',password='koeinsloot')
- nu = datetime.datetime.now()
+ self.nu = datetime.datetime.now()
- response = dataprep.new_workout_from_file(r,'/media/testdata.csv.gz',
- title='sample')
+ 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)']
- newworkoutid = response[0]
- self.w = Workout.objects.get(id=newworkoutid)
+
+ 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
+ )
def test_middleware(self):
response = self.c.get('/rowers/list-workouts',follow=True)
self.assertEqual(response.status_code,200)
-class UserExpireTest(TestCase):
- def setUp(self):
- redis_connection.publish('tasks','KILL')
- self.u = User.objects.create_user('john',
- 'sander@ds.ds',
- 'koeinsloot')
-
- yesterday_dt = timezone.now()-datetime.timedelta(days=1)
- yesterday = yesterday_dt.date()
-
- r = Rower.objects.create(user=self.u,planexpires = yesterday,rowerplan='pro',
- paymenttype='single')
-
- self.c = Client()
- self.c.login(username='john',password='koeinsloot')
- nu = datetime.datetime.now()
-
- response = dataprep.new_workout_from_file(r,'/media/testdata.csv.gz',
- title='sample')
-
- newworkoutid = response[0]
- self.w = Workout.objects.get(id=newworkoutid)
-
-
- def test_expire(self):
- response = self.c.get('/rowers/list-workouts',follow=True)
- self.assertEqual(response.status_code,200)
- self.assertEqual(self.u.rower.rowerplan,'basic')
class UserTestsNoRower(TestCase):
def setUp(self):
diff --git a/rowers/tests/tests.py b/rowers/tests/tests.py
index ee207208..e51b9a7f 100644
--- a/rowers/tests/tests.py
+++ b/rowers/tests/tests.py
@@ -44,984 +44,6 @@ from rowers.dataprep import delete_strokedata
from redis import StrictRedis
redis_connection = StrictRedis()
-#@pytest.mark.django_db
-class DjangoTestCase(TestCase, MockTestCase):
- def _pre_setup(self):
- MockTestCase.setUp(self)
- TestCase._pre_setup(self)
- self.client = Client()
-
- def _post_teardown(self):
- TestCase._post_teardown(self)
- MockTestCase.tearDown(self)
- delete_strokedata(1)
-
-# to be done add polar mocks (for email processing)
-def mocked_requests(*args, **kwargs):
- with open('rowers/tests/testdata/c2jsonworkoutdata.txt','r') as infile:
- c2workoutdata = json.load(infile)
-
- with open('rowers/tests/testdata/c2jsonstrokedata.txt','r') as infile:
- c2strokedata = json.load(infile)
-
- polar_json = {
- 'available-user-data': []
- }
-
- c2workoutlist = json.load(open('rowers/tests/testdata/c2workoutlist.txt'))
-
- c2uploadjson = {
- "data": {
- "id": 339,
- "user_id": 1,
- "date": "2015-08-05 13:15:41",
- "timezone": "Europe/London",
- "date_utc": "2015-08-05 12:15:41",
- "distance": 5649,
- "type": "rower",
- "time": 8649,
- "time_formatted": "14:24.9",
- "workout_type": "JustRow",
- "source": "ErgData",
- "weight_class": "H",
- "verified": True,
- "ranked": False
- }
- }
-
- stravaworkoutlist = json.load(open('rowers/tests/testdata/stravaworkoutlist.txt'))
- sporttracksworkoutlist = json.load(open('rowers/tests/testdata/sporttracksworkouts.txt'))
-
- rkworkoutlistjson = json.load(open('rowers/tests/testdata/rkworkoutslist.txt','r'))
- uaworkoutlistjson = json.load(open('rowers/tests/testdata/uaworkoutlist.txt','r'))
-
- stravasummaryjson = json.load(open('rowers/tests/testdata/stravaworkoutsummary.txt','r'))
-
- stravatimejson = json.load(open('rowers/tests/testdata/stravatimetestdata.txt','r'))
- stravavelojson = json.load(open('rowers/tests/testdata/stravavelotestdata.txt','r'))
-
- stravapowerjson = json.load(open('rowers/tests/testdata/stravapowertestdata.txt','r'))
-
- stravadistancejson = json.load(open('rowers/tests/testdata/stravadistancetestdata.txt','r'))
- stravalatlongjson = json.load(open('rowers/tests/testdata/stravalatlongtestdata.txt','r'))
- stravahrjson = json.load(open('rowers/tests/testdata/stravahrtestdata.txt','r'))
- stravaspmjson = json.load(open('rowers/tests/testdata/stravaspmtestdata.txt','r'))
-
- uapostworkoutjson = json.load(open('rowers/tests/testdata/uapostworkoutresponse.txt','r'))
-
- tpuploadresponse = json.load(open('rowers/tests/testdata/tpuploadresponse.txt','r'))
-
- stravastreamjson = {
- 'time':stravatimejson,
- 'velocity_smooth':stravavelojson,
- 'distance':stravadistancejson,
- 'latlng':stravalatlongjson,
- 'heartrate':stravahrjson,
- 'cadence':stravaspmjson,
- 'power':stravapowerjson,
- }
-
- ststrokesjson = json.load(open('rowers/tests/testdata/sporttracksstrokedata.txt','r'))
-
- rkstrokesjson = json.load(open('rowers/tests/testdata/rkstrokes.txt','r'))
-
- uastrokesjson = json.load(open('rowers/tests/testdata/uastrokes.txt','r'))
- uauserjson = json.load(open('rowers/tests/testdata/uauser.txt','r'))
-
- class MockResponse:
- def __init__(self, json_data, status_code):
- self.json_data = json_data
- self.status_code = status_code
-
- def json(self):
- return self.json_data
-
-
- class MockHeaderResponse:
- def __init__(self, header_data, status_code):
- self.headers = header_data
- self.status_code = status_code
-
- class MockSession:
- def send(self,prepped):
- # prepped.url
- # prepped.body (post data)
- # prepped.headers
- # prepped.method
-
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
-
- return MockResponse(json_data,200)
-
- if not args:
- return MockSession()
-
- polartester = re.compile('.*?polaraccesslink\.com')
- c2tester = re.compile('.*?log\.concept2\.com')
- stravatester = re.compile('.*?strava\.com')
- sttester = re.compile('.*?sporttracks\.mobi')
- rktester = re.compile('.*?runkeeper\.com')
- uatester = re.compile('.*?mapmyfitness\.com')
- tptester = re.compile('.*?trainingpeaks\.com')
-
- c2importregex = '.*?concept2.com\/api\/users\/me\/results\/\d+'
- c2importtester = re.compile(c2importregex)
-
- c2uploadregex = '.*?concept2.com\/api\/users\/\d+\/results$'
- c2uploadtester = re.compile(c2uploadregex)
-
- c2strokesregex = '.*?concept2.com\/api\/users\/me\/results\/\d+\/strokes'
- c2strokestester = re.compile(c2strokesregex)
-
- c2workoutlistregex = '.*?concept2\.com\/api\/users\/me\/results\?page=\d'
- c2workoutlisttester = re.compile(c2workoutlistregex)
-
- stravaworkoutlistregex = '.*?strava\.com\/api\/v3\/athlete\/activities'
- stravaworkoutlisttester = re.compile(stravaworkoutlistregex)
-
- stravastreamregex = '.*?strava\.com\/api\/v3\/activities\/\d+\/streams\/(\w.*?)\?'
- stravastreamtester = re.compile(stravastreamregex)
-
- stravasummaryregex = '.*?strava\.com\/api\/v3\/activities\/\d+$'
- stravasummarytester = re.compile(stravasummaryregex)
-
- stuploadregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities.json$'
- stuploadtester = re.compile(stuploadregex)
-
- stworkoutlistregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities$'
- stworkoutlisttester = re.compile(stworkoutlistregex)
-
- ststrokesregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/\d+$'
- ststrokestester = re.compile(ststrokesregex)
-
- rkuploadregex = '.*?api\.runkeeper\.com\/fitnessActivities$'
- rkuploadtester = re.compile(rkuploadregex)
- rkuserregex = '.*?api\.runkeeper\.com\/user$'
- rkusertester = re.compile(rkuserregex)
- rkstrokesregex = '.*?api\.runkeeper\.com\/fitnessActivities/\d+$'
- rkstrokestester = re.compile(rkstrokesregex)
-
- uaapiregex = '.*?api\.ua\.com'
- uaapitester = re.compile(uaapiregex)
-
- uauploadregex = '.*?api\.ua\.com\/v7.1\/workout\/$'
- uauploadtester = re.compile(uauploadregex)
-
- uastrokesregex = '.*?api\.ua\.com\/v7.1\/workout\/\d+'
- uastrokestester = re.compile(uastrokesregex)
-
- ualistregex = '.*?api\.ua\.com\/v7.1\/workout\/\?user'
- ualisttester = re.compile(ualistregex)
-
- uauserregex = '.*?api\.ua\.com\/v7.1\/user\/self\/'
- uausertester = re.compile(uauserregex)
-
- tpuploadregex = '.*?trainingpeaks\.com\/v1\/file'
- tpuploadtester = re.compile(tpuploadregex)
-
- if polartester.match(args[0]):
- json_data = polar_json
- return MockResponse(json_data,200)
-
- if tptester.match(args[0]):
- if 'token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- elif tpuploadtester.match(args[0]):
- return MockResponse(tpuploadresponse,200)
-
- if uaapitester.match(args[0]):
- if 'access_token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- elif uauploadtester.match(args[0]):
- if 'data' in kwargs:
- return MockResponse(uapostworkoutjson,200)
- elif uastrokestester.match(args[0]):
- return MockResponse(uastrokesjson,200)
- elif ualisttester.match(args[0]):
- return MockResponse(uaworkoutlistjson,200)
- elif uausertester.match(args[0]):
- return MockResponse(uauserjson,200)
-
-
- if uatester.match(args[0]):
- if 'access_token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
-
-
- if rktester.match(args[0]):
- if 'token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- elif rkuploadtester.match(args[0]):
- if 'data' in kwargs:
- # post
- header_data = {
- 'Location': '/fitnessActivities/12'
- }
- return MockHeaderResponse(header_data,200)
- else:
- json_data = rkworkoutlistjson
- return MockResponse(json_data,200)
- elif rkusertester.match(args[0]):
- json_data = {
- "userID": 1234567890,
- "profile": "/profile",
- "settings": "/settings",
- "fitness_activities": "/fitnessActivities",
- "strength_training_activities": "/strengthTrainingActivities",
- "background_activities": "/backgroundActivities",
- "sleep": "/sleep",
- "nutrition": "/nutrition",
- "weight": "/weight",
- "general_measurements": "/generalMeasurements",
- "diabetes": "/diabetes",
- "records": "/records",
- "team": "/team"
- }
- return MockResponse(json_data, 200)
- elif rkstrokestester.match(args[0]):
- return MockResponse(rkstrokesjson,200)
-
- if sttester.match(args[0]):
- if 'oauth2/token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- if ststrokestester.match(args[0]):
- return MockResponse(ststrokesjson,200)
- if stuploadtester.match(args[0]):
- json_data = {
- "uris": [
- "https://api.sporttracks.mobi/api/v2/fitnessActivities/123456.json"
- ]
- }
- return MockResponse(json_data, 200)
- if stworkoutlisttester.match(args[0]):
- return MockResponse(sporttracksworkoutlist,200)
-
-
- if stravatester.match(args[0]):
- if stravaworkoutlisttester.match(args[0]):
- return MockResponse(stravaworkoutlist,200)
- if stravastreamtester.match(args[0]):
- metric = stravastreamtester.match(args[0]).group(1)
- json_data = stravastreamjson[metric]
- return MockResponse(json_data,200)
- elif stravasummarytester.match(args[0]):
- return MockResponse(stravasummaryjson,200)
- elif 'token' in args[0]:
- json_data = {
- "token_type": "Bearer",
- "access_token": "987654321234567898765432123456789",
- "refresh_token": "1234567898765432112345678987654321",
- "expires_at": 1531385304
- }
- return MockResponse(json_data,200)
-
-
- if c2tester.match(args[0]):
- if c2uploadtester.match(args[0]):
- return MockResponse(c2uploadjson,201)
- if c2strokestester.match(args[0]):
- return MockResponse(c2strokedata,200)
- elif c2importtester.match(args[0]):
- return MockResponse(c2workoutdata,200)
- elif c2workoutlisttester.match(args[0]):
- return MockResponse(c2workoutlist,200)
- elif 'access_token' in args[0]:
- print 'aap'
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- elif 'users/me' in args[0]:
- json_data = {
- 'data': {
- 'username': 'john',
- 'id': 1234,
- }
- }
- return MockResponse(json_data,200)
- elif 'results' in args[0]:
- json_data = {
- 'data': {
- 'id': 1223,
- }
- }
- else:
- return MockResponse(c2workoutdata,200)
-
- return MockResponse(None,404)
-
-#@pytest.mark.django_db
-class C2Objects(DjangoTestCase):
- def setUp(self):
- self.c = Client()
- self.u = User.objects.create_user('john',
- 'sander@ds.ds',
- 'koeinsloot')
-
- self.u.first_name = 'John'
- self.u.last_name = 'Sander'
- self.u.save()
- self.r = Rower.objects.create(user=self.u,gdproptin=True,
- gdproptindate=timezone.now()
- )
-
- self.r.c2token = '12'
- self.r.c2refreshtoken = 'ab'
- self.r.tokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
- 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.c2stuff.requests.Session', side_effect=mocked_requests)
- def test_c2_callback(self, mock_Session):
- response = self.c.get('/call_back?code=dsdoij232s',follow=True)
-
-
- self.assertEqual(response.status_code, 200)
-
-
- @patch('rowers.c2stuff.Session', side_effect=mocked_requests)
- def test_c2_token_refresh(self, mock_post):
- response = self.c.get('/rowers/me/c2refresh/',follow=True)
-
- self.assertEqual(response.status_code, 200)
-
-
- @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests)
- @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
- def test_c2_upload(self, mock_get, mock_post):
- response = self.c.get('/rowers/workout/1/c2uploadw/')
-
- 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.c2stuff.requests.post', side_effect=mocked_requests)
- @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
- def test_c2_list(self, mock_get, mock_post):
- response = self.c.get('/rowers/workout/c2list',follow=True)
-
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
- def test_c2_import(self, mock_get):
-
- response = self.c.get('/rowers/workout/c2import/12/',follow=True)
-
- self.assertRedirects(response,
- expected_url='/rowers/workout/2/edit',
- status_code=302,target_status_code=200)
-
- self.assertEqual(response.status_code, 200)
-
-
- def test_strokedata(self):
- with open('rowers/tests/testdata/c2stroketestdata.txt','r') as infile:
- res = json.load(infile)
-
- strokedata = pd.DataFrame.from_dict(res['data'])
-
- with open('rowers/tests/testdata/c2testdata.txt','r') as infile:
- res = json.load(infile)
-
- data = res['data']
-
- from rowers.views import add_workout_from_strokedata
-
- res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
-
- def test_strokedatanohr(self):
- with open('rowers/tests/testdata/c2strokedatanohr.txt','r') as infile:
- res = json.load(infile)
-
- strokedata = pd.DataFrame.from_dict(res['data'])
-
- with open('rowers/tests/testdata/c2testdata.txt','r') as infile:
- res = json.load(infile)
-
- data = res['data']
-
- from rowers.views import add_workout_from_strokedata
-
-
- res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
-
-class C2ObjectsTokenExpired(DjangoTestCase):
- def setUp(self):
- self.c = Client()
- self.u = User.objects.create_user('john',
- 'sander@ds.ds',
- 'koeinsloot')
-
- self.u.first_name = 'John'
- self.u.last_name = 'Sander'
- self.u.save()
- self.r = Rower.objects.create(user=self.u,gdproptin=True,
- gdproptindate=timezone.now()
- )
-
- self.r.c2token = '12'
- self.r.c2refreshtoken = 'ab'
- self.r.tokenexpirydate = datetime.datetime.now()-datetime.timedelta(days=1)
- 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.c2stuff.requests.post', side_effect=mocked_requests)
- @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
- def test_c2_list(self, mock_get, mock_post):
- response = self.c.get('/rowers/workout/c2list',follow=True)
-
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
- def test_c2_import(self, mock_get):
-
- response = self.c.get('/rowers/workout/c2import/12/',follow=True)
-
- self.assertRedirects(response,
- expected_url='/rowers/workout/2/edit',
- status_code=302,target_status_code=200)
-
- self.assertEqual(response.status_code, 200)
-
-
-
-#@pytest.mark.django_db
-class StravaObjects(DjangoTestCase):
- def setUp(self):
- self.c = Client()
- self.u = User.objects.create_user('john',
- 'sander@ds.ds',
- 'koeinsloot')
-
- self.u.first_name = 'John'
- self.u.last_name = 'Sander'
- self.u.save()
- self.r = Rower.objects.create(user=self.u,gdproptin=True,
- gdproptindate=timezone.now()
- )
-
- self.r.stravatoken = '12'
-
- self.r.save()
- self.c.login(username='john',password='koeinsloot')
-
- @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
- def test_strava_list(self, mock_get):
- response = self.c.get('/rowers/workout/stravaimport/',follow=True)
-
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.utils.requests.get', side_effect=mocked_requests)
- def test_strava_import(self, mock_get):
-
- response = self.c.get('/rowers/workout/stravaimport/12',follow=True)
-
- self.assertRedirects(response,
- expected_url='/rowers/workout/1/edit',
- status_code=301,target_status_code=200)
-
- self.assertEqual(response.status_code, 200)
-
-
-
-#@pytest.mark.django_db
-class STObjects(DjangoTestCase):
- def setUp(self):
- self.c = Client()
- self.u = User.objects.create_user('john',
- 'sander@ds.ds',
- 'koeinsloot')
-
- self.u.first_name = 'John'
- self.u.last_name = 'Sander'
- self.u.save()
- self.r = Rower.objects.create(user=self.u,gdproptin=True,
- gdproptindate=timezone.now()
- )
-
-
- self.r.sporttrackstoken = '12'
- self.r.sporttracksrefreshtoken = '12'
- self.r.sporttrackstokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
- 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.sporttracksstuff.requests.post', side_effect=mocked_requests)
- def test_sporttracks_callback(self, mock_post):
- response = self.c.get('/sporttracks_callback?code=dsdoij232s',follow=True)
-
-
- self.assertEqual(response.status_code, 200)
-
-
- @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
- def test_sporttracks_token_refresh(self, mock_post):
- response = self.c.get('/rowers/me/sporttracksrefresh/',follow=True)
-
- self.assertEqual(response.status_code, 200)
-
-
- @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
- @patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests)
- def test_sporttracks_upload(self, mock_get, mock_post):
- response = self.c.get('/rowers/workout/1/sporttracksuploadw/')
-
- 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.sporttracksstuff.requests.get', side_effect=mocked_requests)
- def test_sporttracks_list(self, mock_get):
- response = self.c.get('/rowers/workout/sporttracksimport',follow=True)
-
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.imports.requests.get', side_effect=mocked_requests)
- def test_sporttracks_import(self, mock_get):
-
- response = self.c.get('/rowers/workout/sporttracksimport/12/',follow=True)
-
- self.assertRedirects(response,
- expected_url='/rowers/workout/2/edit',
- status_code=302,target_status_code=200)
-
- self.assertEqual(response.status_code, 200)
-
- def test_strokedata(self):
- with open('rowers/tests/testdata/sporttrackstestdata.txt','r') as infile:
- data = json.load(infile)
-
- from rowers.sporttracksstuff import add_workout_from_data
-
- res = add_workout_from_data(self.u,1,data,data)
-
- def test_strokedatanohr(self):
- with open('rowers/tests/testdata/sporttrackstestnohr.txt','r') as infile:
- data = json.load(infile)
-
- from rowers.sporttracksstuff import add_workout_from_data
-
-
-
- res = add_workout_from_data(self.u,1,data,data)
-
-#@pytest.mark.django_db
-class RunKeeperObjects(DjangoTestCase):
- def setUp(self):
- self.c = Client()
- self.u = User.objects.create_user('john',
- 'sander@ds.ds',
- 'koeinsloot')
-
- self.u.first_name = 'John'
- self.u.last_name = 'Sander'
- self.u.save()
- self.r = Rower.objects.create(user=self.u,gdproptin=True,
- gdproptindate=timezone.now()
- )
-
-
- self.r.runkeepertoken = '12'
-
- 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.runkeeperstuff.requests.post', side_effect=mocked_requests)
- def test_runkeeper_callback(self, mock_post):
- response = self.c.get('/runkeeper_callback?code=dsdoij232s',follow=True)
-
- self.assertEqual(response.status_code, 200)
-
- @patch('rowers.runkeeperstuff.requests.post', side_effect=mocked_requests)
- @patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests)
- def test_runkeeper_upload(self, mock_get, mock_post):
- response = self.c.get('/rowers/workout/1/runkeeperuploadw/')
-
- 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.runkeeperstuff.requests.get', side_effect=mocked_requests)
- def test_runkeeper_list(self, mock_get):
- response = self.c.get('/rowers/workout/runkeeperimport',follow=True)
-
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.imports.requests.get', side_effect=mocked_requests)
- def test_runkeeper_import(self, mock_get):
-
- response = self.c.get('/rowers/workout/runkeeperimport/12/',follow=True)
-
- self.assertRedirects(response,
- expected_url='/rowers/workout/2/edit',
- status_code=302,target_status_code=200)
-
- self.assertEqual(response.status_code, 200)
-
-
-
-#@pytest.mark.django_db
-class UAObjects(DjangoTestCase):
- def setUp(self):
- self.c = Client()
- self.u = User.objects.create_user('john',
- 'sander@ds.ds',
- 'koeinsloot')
-
- self.u.first_name = 'John'
- self.u.last_name = 'Sander'
- self.u.save()
- self.r = Rower.objects.create(user=self.u,gdproptin=True,
- gdproptindate=timezone.now()
- )
-
-
- self.r.underarmourtoken = '12'
- self.r.underarmourrefreshtoken = '12'
- self.r.underarmourtokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
- 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.imports.requests.post', side_effect=mocked_requests)
- def test_underarmour_callback(self, mock_post):
- response = self.c.get('/underarmour_callback?code=dsdoij232s',follow=True)
-
-
- self.assertEqual(response.status_code, 200)
-
-
- @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
- def test_underarmour_token_refresh(self, mock_post):
- response = self.c.get('/rowers/me/underarmourrefresh/',follow=True)
-
- self.assertEqual(response.status_code, 200)
-
-
- @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
- @patch('rowers.underarmourstuff.requests.get', side_effect=mocked_requests)
- def test_underarmour_upload(self, mock_get, mock_post):
- response = self.c.get('/rowers/workout/1/underarmouruploadw/')
-
- 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.underarmourstuff.requests.get', side_effect=mocked_requests)
- def test_underarmour_list(self, mock_get):
- response = self.c.get('/rowers/workout/underarmourimport',follow=True)
-
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.imports.requests.get', side_effect=mocked_requests)
- def test_underarmour_import(self, mock_get):
-
- response = self.c.get('/rowers/workout/underarmourimport/12/',follow=True)
-
- self.assertRedirects(response,
- expected_url='/rowers/workout/2/edit',
- status_code=302,target_status_code=200)
-
- self.assertEqual(response.status_code, 200)
-
-
-#@pytest.mark.django_db
-class TPObjects(DjangoTestCase):
- def setUp(self):
- self.c = Client()
- self.u = User.objects.create_user('john',
- 'sander@ds.ds',
- 'koeinsloot')
-
- self.u.first_name = 'John'
- self.u.last_name = 'Sander'
- self.u.save()
- self.r = Rower.objects.create(user=self.u,gdproptin=True,
- gdproptindate=timezone.now()
- )
-
-
- self.r.tptoken = '12'
- self.r.tprefreshtoken = '12'
- self.r.tptokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
- 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.imports.requests.post', side_effect=mocked_requests)
- def test_tp_callback(self, mock_post):
- response = self.c.get('/tp_callback?code=dsdoij232s',follow=True)
-
-
- self.assertEqual(response.status_code, 200)
-
-
- @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
- def test_tp_token_refresh(self, mock_post):
- response = self.c.get('/rowers/me/tprefresh/',follow=True)
-
- self.assertEqual(response.status_code, 200)
-
-
- @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
- @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
- def test_tp_upload(self, mock_get, mock_post):
- response = self.c.get('/rowers/workout/1/tpuploadw/')
-
- 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)
-
-
#@pytest.mark.django_db
@@ -1070,170 +92,6 @@ class NewUserRegistrationTest(TestCase):
expected_url='/rowers/me/gdpr-optin/?next=/rowers/list-workouts/',
status_code=302,target_status_code=200)
-from django_mailbox.models import Mailbox,MessageAttachment,Message
-
-#@pytest.mark.django_db
-class AutoExportTests(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()
- )
-
- r.c2_auto_export = True
- r.sporttracks_auto_export = True
- r.mapmyfitness_auto_export = True
- r.trainingpeaks_auto_export = True
-
- r.save()
-
- nu = datetime.datetime.now()
- workoutsbox = Mailbox.objects.create(name='workouts')
- workoutsbox.save()
- failbox = Mailbox.objects.create(name='Failed')
- failbox.save()
-
- filename = 'testdata.csv'
-
- m = Message(mailbox=workoutsbox,
- from_header = u.email,
- subject = filename,
- body="""
----
-workouttype: water
-boattype: 2x
-...
- """)
- m.save()
- a2 = 'media/mailbox_attachments/'+filename
- copyfile('rowers/tests/testdata/'+filename,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 WindowsError:
- pass
-
- @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
- @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
- def test_emailprocessing(self, mock_post, mock_get):
- out = StringIO()
- call_command('processemail', stdout=out, testing=True)
- self.assertIn('Successfully processed email attachments',out.getvalue())
-
-#@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()
- )
-
- 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('requests.get', side_effect=mocked_requests)
- def test_emailprocessing(self, mock_get):
- out = StringIO()
- call_command('processemail', stdout=out,testing=True)
- self.assertIn('Successfully processed email attachments',out.getvalue())
-
#@pytest.mark.django_db
class WorkoutTests(TestCase):
@@ -2225,252 +1083,6 @@ class ViewTest(TestCase):
# f_to_be_deleted = w.csvfilename
# os.remove(f_to_be_deleted+'.gz')
-#@pytest.mark.django_db
-class URLTests(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,rowerplan='coach')
- self.c = Client()
- self.c.login(username='john',password='koeinsloot')
-
- self.nu = datetime.datetime.now()
- filename = 'rowers/tests/testdata/testdata.csv'
- self.wotw = Workout.objects.create(name='testworkout',
- workouttype='water',
- user=r,date=self.nu.strftime('%Y-%m-%d'),
- starttime=self.nu.strftime('%H:%M:%S'),
- duration="0:55:00",distance=8000,
- csvfilename=filename)
-
- self.wote = Workout.objects.create(name='testworkout',
- workouttype='Indoor Rower',
- user=r,date=self.nu.strftime('%Y-%m-%d'),
- starttime=self.nu.strftime('%H:%M:%S'),
- duration="0:55:00",distance=8000,
- csvfilename=filename)
-
- powerperc = 100*np.array([r.pw_ut2,
- r.pw_ut1,
- r.pw_at,
- r.pw_tr,r.pw_an])/r.ftp
-
-
- self.hrdata = {
- 'hrmax':r.max,
- 'hrut2':r.ut2,
- 'hrut1':r.ut1,
- 'hrat':r.at,
- 'hrtr':r.tr,
- 'hran':r.an,
- 'ftp':r.ftp,
- 'powerperc':serialize_list(powerperc),
- 'powerzones':serialize_list(r.powerzones),
- }
-
- urlstotest = [
- '/rowers/400/',
- '/rowers/403/',
- '/rowers/404/',
- '/rowers/500/',
- '/rowers/502/',
- '/rowers/1/list-workouts/',
- '/rowers/1/list-workouts/2016-01-01/2016-12-31',
- '/rowers/1/ote-bests/',
- '/rowers/1/ote-bests2/2016-01-01/2016-12-31',
- '/rowers/about',
- '/rowers/addmanual/',
- '/rowers/agegroupcp/30',
- '/rowers/agegroupcp/30/1',
- '/rowers/agegrouprecords/male/hwt',
- '/rowers/agegrouprecords/male/hwt/2000m',
- '/rowers/agegrouprecords/male/hwt/2000min',
- '/rowers/ajax_agegroup/45/hwt/male/1',
- '/rowers/analysis/',
- '/rowers/analysis/user/1',
- '/rowers/brochure',
- '/rowers/courses/upload',
- '/rowers/createplan/',
- '/rowers/createplan/user/1/',
- '/rowers/cumstats/',
- '/rowers/cumstats/2016-01-01/2016-12-31',
- '/rowers/cumstats/user/1',
- '/rowers/cumstats/user/1/2016-01-01/2016-12-31',
- '/rowers/developers',
- '/rowers/email/',
- '/rowers/email/thankyou/',
- '/rowers/fitness-progress/',
- '/rowers/fitness-progress/user/1',
- '/rowers/fitness-progress/user/1/rower',
- '/rowers/flexall/',
- '/rowers/flexall/spm/hr/None/',
- '/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/',
- '/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/user/1',
- '/rowers/flexall/user/1/',
- '/rowers/flexalldata/',
- '/rowers/help',
- '/rowers/histo/',
- '/rowers/histo/user/1',
- '/rowers/histo/user/1/2016-01-01/2016-12-31',
- '/rowers/histodata',
- '/rowers/job-kill/1',
- '/rowers/jobs-status/',
- '/rowers/laboratory/',
- '/rowers/laboratory/user/1',
- '/rowers/legal',
- '/rowers/list-courses/',
- '/rowers/list-graphs/',
- '/rowers/list-jobs/',
- '/rowers/list-workouts/',
- '/rowers/list-workouts/2016-01-01/2016-12-31',
- '/rowers/list-workouts/2016-01-01/2016-12-31/user/1/',
- '/rowers/list-workouts/ranking',
- '/rowers/list-workouts/user/1/',
- '/rowers/me/calcdps/',
- '/rowers/me/edit/',
- '/rowers/me/edit/user/1',
- '/rowers/me/exportsettings/',
- '/rowers/me/exportsettings/user/1',
- '/rowers/me/favoritecharts/',
- '/rowers/me/favoritecharts/user/1',
- '/rowers/me/invitation/',
- '/rowers/me/preferences/',
- '/rowers/me/preferences/user/1',
- '/rowers/me/request/',
- '/rowers/me/teams/',
- '/rowers/me/workflowconfig2/',
- '/rowers/me/workflowconfig2/user/1',
- '/rowers/me/workflowdefault',
- '/rowers/multi-compare',
- '/rowers/ote-bests/',
- '/rowers/ote-bests/2016-01-01/2016-12-31',
- '/rowers/ote-bests/user/1',
- '/rowers/ote-bests/user/1/2016-01-01/2016-12-31',
- '/rowers/ote-bests2/',
- '/rowers/ote-bests2/2016-01-01/2016-12-31',
- '/rowers/ote-bests2/user/1',
- '/rowers/ote-ranking/',
- '/rowers/ote-ranking/2016-01-01/2016-12-31',
- '/rowers/ote-ranking/user/1/',
- '/rowers/ote-ranking/user/1/2016-01-01/2016-12-31',
- '/rowers/otw-bests/',
- '/rowers/otw-bests/2016-01-01/2016-12-31',
- '/rowers/otw-bests/user/1/2016-01-01/2016-12-31',
- '/rowers/partners',
- '/rowers/physics',
- '/rowers/planrequired',
- '/rowers/promembership',
- '/rowers/register',
- '/rowers/register/thankyou/',
- '/rowers/sessions/',
- '/rowers/sessions/2016-01-01/2016-12-31',
- '/rowers/sessions/2016-01-01/2016-12-31/user/1',
- '/rowers/sessions/coach/',
- '/rowers/sessions/coach/user/1/',
- '/rowers/sessions/create/',
- '/rowers/sessions/create/user/1',
- '/rowers/sessions/manage/',
- '/rowers/sessions/manage/user/1/',
- '/rowers/sessions/multiclone/',
- '/rowers/sessions/multiclone/user/1/',
- '/rowers/sessions/multicreate/',
- '/rowers/sessions/multicreate/user/1/',
- '/rowers/sessions/print/',
- '/rowers/sessions/print/user/1',
- '/rowers/sessions/teamcreate/',
- '/rowers/sessions/user/1',
- '/rowers/team-compare-select/',
- '/rowers/team-compare-select/workout/1',
- '/rowers/team-compare-select/2016-01-01/2016-12-31',
- '/rowers/test-job/2',
- '/rowers/test-job2/2',
- '/rowers/test_callback',
- '/rowers/updatefitness',
- '/rowers/updatefitness/rower',
- '/rowers/updatefitness/rower/50',
- '/rowers/user-boxplot',
- '/rowers/user-boxplot-data',
- '/rowers/user-boxplot-select/',
- '/rowers/user-boxplot-select/user/1/',
- '/rowers/user-boxplot/user/1',
- '/rowers/user-multiflex-data',
- '/rowers/user-multiflex-select/',
- '/rowers/user-multiflex-select/2016-01-01/2016-12-31',
- '/rowers/user-multiflex-select/user/1/',
- '/rowers/user-multiflex-select/user/1/2016-01-01/2016-12-31',
- '/rowers/user-multiflex/',
- '/rowers/user-multiflex/user/1',
- '/rowers/workout/1/',
- '/rowers/workout/1/adddistanceplot',
- '/rowers/workout/1/adddistanceplot2',
- '/rowers/workout/1/addotwpowerplot',
- '/rowers/workout/1/addpiechart',
- '/rowers/workout/1/addpowerpiechart',
- '/rowers/workout/1/addstatic',
- '/rowers/workout/1/addstatic/3',
- '/rowers/workout/1/addtimeplot',
- '/rowers/workout/1/addtimeplot2',
- '/rowers/workout/1/comment',
- '/rowers/workout/1/darkskywind',
- '/rowers/workout/1/data',
- '/rowers/workout/1/edit',
- '/rowers/workout/1/editintervals',
- '/rowers/workout/1/flexchart',
- '/rowers/workout/1/flexchart/spm/hr/None',
- '/rowers/workout/1/flexchart/spm/hr/None/scatter',
- '/rowers/workout/1/flexchart/spm/hr/None/scatter/',
- '/rowers/workout/1/forcecurve',
- '/rowers/workout/1/get-testscript',
- '/rowers/workout/1/get-thumbnails',
- '/rowers/workout/1/histo',
- '/rowers/workout/1/image',
- '/rowers/workout/1/instroke',
- '/rowers/workout/1/interactiveotwplot',
- '/rowers/workout/1/map',
- '/rowers/workout/1/otwsetpower',
- '/rowers/workout/1/recalcsummary/',
- '/rowers/workout/1/restore',
- '/rowers/workout/1/smoothenpace',
- '/rowers/workout/1/split',
- '/rowers/workout/1/stats',
- '/rowers/workout/1/stream',
- '/rowers/workout/1/task',
- '/rowers/workout/1/test_strokedata',
- '/rowers/workout/1/toggle-ranking',
- '/rowers/workout/1/undosmoothenpace',
- '/rowers/workout/1/unsubscribe',
- '/rowers/workout/1/updatecp',
- '/rowers/workout/1/view',
- '/rowers/workout/1/wind',
- '/rowers/workout/1/workflow',
- '/rowers/workout/compare/1/2016-01-01/2016-12-31',
- '/rowers/workout/fusion/1/',
- '/rowers/workout/fusion/1/2016-01-01/2016-12-31',
- '/rowers/workout/upload/',
- '/rowers/workout/upload/team/',
- '/rowers/workouts-join',
- '/rowers/workouts-join-select/',
- '/rowers/workouts-join-select/2016-01-01/2016-12-31',
- ]
-
- lijst = []
- for url in urlstotest:
- lijst.append(
- (url,200)
- )
-
- @parameterized.expand(lijst)
- def test_url_generator(self,url,expected):
- response = self.c.get(url,follow=True)
- if response.status_code != expected:
- print response.status_code
- self.assertEqual(response.status_code,
- expected,
- msg=url+' response status code not 200')
-
#@pytest.mark.django_db
class subroutinetests(TestCase):
diff --git a/rowers/views.py b/rowers/views.py
index 63c691da..77299f11 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -11812,6 +11812,14 @@ def workout_getimportview(request,externalid,source = 'c2'):
# Now works only for C2
+ try:
+ if strokedata == 0:
+ messages.error(request,'An error occurred importing the workout from Concept2')
+ url = reverse(workouts_view)
+ return HttpResponseRedirect(url)
+ except ValueError:
+ pass
+
if strokedata.empty:
distance = data['distance']
c2id = data['id']
From f442e179baeebdf85f07bfde8b086e4c060c6e1e Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Thu, 3 Jan 2019 00:18:59 +0100
Subject: [PATCH 04/18] renamed emails
---
rowers/management/commands/processemail.py | 2 +-
rowers/tests/test_imports.py | 9 ++++-----
rowers/tests/test_emails.py => test_zemails.py | 3 ++-
3 files changed, 7 insertions(+), 7 deletions(-)
rename rowers/tests/test_emails.py => test_zemails.py (97%)
diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py
index 36f3553c..8a891e60 100644
--- a/rowers/management/commands/processemail.py
+++ b/rowers/management/commands/processemail.py
@@ -98,7 +98,7 @@ def processattachment(rower, fileobj, title, uploadoptions,testing=False):
imagename=imagename
)
try:
- if workoutid:
+ if workoutid and not testing:
if rower.getemailnotifications and not rower.emailbounced:
email_sent = send_confirm(
rower.user, title, link,
diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py
index b550cb71..7b0afb3d 100644
--- a/rowers/tests/test_imports.py
+++ b/rowers/tests/test_imports.py
@@ -162,8 +162,6 @@ def mocked_requests(*args, **kwargs):
if not args:
return MockSession()
- print args[0],'aap'
-
polartester = re.compile('.*?polaraccesslink\.com')
c2tester = re.compile('.*?log\.concept2\.com')
stravatester = re.compile('.*?strava\.com')
@@ -439,7 +437,7 @@ class C2Objects(DjangoTestCase):
)
- @patch('rowers.c2stuff.requests.Session', side_effect=mocked_requests)
+ @patch('rowers.c2stuff.Session', side_effect=mocked_requests)
def test_c2_callback(self, mock_Session):
response = self.c.get('/call_back?code=dsdoij232s',follow=True)
@@ -448,7 +446,7 @@ class C2Objects(DjangoTestCase):
@patch('rowers.c2stuff.Session', side_effect=mocked_requests)
- def test_c2_token_refresh(self, mock_post):
+ def test_c2_token_refresh(self, mock_Session):
response = self.c.get('/rowers/me/c2refresh/',follow=True)
self.assertEqual(response.status_code, 200)
@@ -573,7 +571,8 @@ class C2ObjectsTokenExpired(DjangoTestCase):
@patch('rowers.c2stuff.requests.post', side_effect=mocked_requests)
@patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
- def test_c2_list(self, mock_get, mock_post):
+ @patch('rowers.c2stuff.Session',side_effect=mocked_requests)
+ def test_c2_list(self, mock_get, mock_post, mock_Session):
response = self.c.get('/rowers/workout/c2list',follow=True)
self.assertEqual(response.status_code,404)
diff --git a/rowers/tests/test_emails.py b/test_zemails.py
similarity index 97%
rename from rowers/tests/test_emails.py
rename to test_zemails.py
index ed0d5530..d339236d 100644
--- a/rowers/tests/test_emails.py
+++ b/test_zemails.py
@@ -58,7 +58,8 @@ class UploadTests(TestCase):
'sander@ds.ds',
'koeinsloot')
r = Rower.objects.create(user=u,gdproptin=True,
- gdproptindate=timezone.now()
+ gdproptindate=timezone.now(),
+ getemailnotifications = False,
)
nu = datetime.datetime.now()
From c7a293b35bb47fb90e983497bf49ce0747fdb28d Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Thu, 3 Jan 2019 00:22:22 +0100
Subject: [PATCH 05/18] test_zemails moved to tests folder
---
test_zemails.py => rowers/tests/test_zemails.py | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename test_zemails.py => rowers/tests/test_zemails.py (100%)
diff --git a/test_zemails.py b/rowers/tests/test_zemails.py
similarity index 100%
rename from test_zemails.py
rename to rowers/tests/test_zemails.py
From d86329ad2e4d2589e25f3c129ebd6cf5c56adf90 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Thu, 3 Jan 2019 00:25:32 +0100
Subject: [PATCH 06/18] token refresh test
---
rowers/tests/test_imports.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py
index 7b0afb3d..091663d1 100644
--- a/rowers/tests/test_imports.py
+++ b/rowers/tests/test_imports.py
@@ -380,7 +380,7 @@ def mocked_requests(*args, **kwargs):
else:
return MockResponse(c2workoutdata,200)
- return MockResponse(None,412)
+ return MockResponse(None,404)
#@pytest.mark.django_db
class C2Objects(DjangoTestCase):
@@ -575,7 +575,7 @@ class C2ObjectsTokenExpired(DjangoTestCase):
def test_c2_list(self, mock_get, mock_post, mock_Session):
response = self.c.get('/rowers/workout/c2list',follow=True)
- self.assertEqual(response.status_code,404)
+ self.assertEqual(response.status_code,200)
@patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
def test_c2_import(self, mock_get):
From c006c0599a8c3ea9773958676b7fb8ade2b1ff7b Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Thu, 3 Jan 2019 09:03:50 +0100
Subject: [PATCH 07/18] patching sqlalchemy to make tests work
---
rowers/tests/mocks.py | 418 +++++++++++++++++++++++++++++++++++
rowers/tests/test_imports.py | 353 +----------------------------
rowers/tests/test_zemails.py | 7 +-
3 files changed, 435 insertions(+), 343 deletions(-)
create mode 100644 rowers/tests/mocks.py
diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py
new file mode 100644
index 00000000..afd73bb1
--- /dev/null
+++ b/rowers/tests/mocks.py
@@ -0,0 +1,418 @@
+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 django_mailbox.models import Mailbox,MessageAttachment,Message
+
+def mocked_sqlalchemy(*args, **kwargs):
+ # return object with method
+
+ class MockEngine:
+ def connect(self):
+ return MockConnection()
+
+ def dispose(self):
+ return True
+
+ def raw_connection(self):
+ return True
+
+ class MockConnection:
+ def begin(self):
+ return True
+
+ def execute(self):
+ return True
+
+ def execute(self):
+ return True
+
+ def close(self):
+ return True
+
+ def __exit__(self, *args, **kwargs):
+ return True
+
+ def __enter__(self, *args, **kwargs):
+ return True
+
+ return MockEngine()
+
+#@pytest.mark.django_db
+class DjangoTestCase(TestCase, MockTestCase):
+ def _pre_setup(self):
+ MockTestCase.setUp(self)
+ TestCase._pre_setup(self)
+ self.client = Client()
+
+ def _post_teardown(self):
+ TestCase._post_teardown(self)
+ MockTestCase.tearDown(self)
+ delete_strokedata(1)
+
+# to be done add polar mocks (for email processing)
+def mocked_requests(*args, **kwargs):
+ with open('rowers/tests/testdata/c2jsonworkoutdata.txt','r') as infile:
+ c2workoutdata = json.load(infile)
+
+ with open('rowers/tests/testdata/c2jsonstrokedata.txt','r') as infile:
+ c2strokedata = json.load(infile)
+
+ polar_json = {
+ 'available-user-data': []
+ }
+
+ c2workoutlist = json.load(open('rowers/tests/testdata/c2workoutlist.txt'))
+
+ c2uploadjson = {
+ "data": {
+ "id": 339,
+ "user_id": 1,
+ "date": "2015-08-05 13:15:41",
+ "timezone": "Europe/London",
+ "date_utc": "2015-08-05 12:15:41",
+ "distance": 5649,
+ "type": "rower",
+ "time": 8649,
+ "time_formatted": "14:24.9",
+ "workout_type": "JustRow",
+ "source": "ErgData",
+ "weight_class": "H",
+ "verified": True,
+ "ranked": False
+ }
+ }
+
+ stravaworkoutlist = json.load(open('rowers/tests/testdata/stravaworkoutlist.txt'))
+ sporttracksworkoutlist = json.load(open('rowers/tests/testdata/sporttracksworkouts.txt'))
+
+ rkworkoutlistjson = json.load(open('rowers/tests/testdata/rkworkoutslist.txt','r'))
+ uaworkoutlistjson = json.load(open('rowers/tests/testdata/uaworkoutlist.txt','r'))
+
+ stravasummaryjson = json.load(open('rowers/tests/testdata/stravaworkoutsummary.txt','r'))
+
+ stravatimejson = json.load(open('rowers/tests/testdata/stravatimetestdata.txt','r'))
+ stravavelojson = json.load(open('rowers/tests/testdata/stravavelotestdata.txt','r'))
+
+ stravapowerjson = json.load(open('rowers/tests/testdata/stravapowertestdata.txt','r'))
+
+ stravadistancejson = json.load(open('rowers/tests/testdata/stravadistancetestdata.txt','r'))
+ stravalatlongjson = json.load(open('rowers/tests/testdata/stravalatlongtestdata.txt','r'))
+ stravahrjson = json.load(open('rowers/tests/testdata/stravahrtestdata.txt','r'))
+ stravaspmjson = json.load(open('rowers/tests/testdata/stravaspmtestdata.txt','r'))
+
+ uapostworkoutjson = json.load(open('rowers/tests/testdata/uapostworkoutresponse.txt','r'))
+
+ tpuploadresponse = json.load(open('rowers/tests/testdata/tpuploadresponse.txt','r'))
+
+ stravastreamjson = {
+ 'time':stravatimejson,
+ 'velocity_smooth':stravavelojson,
+ 'distance':stravadistancejson,
+ 'latlng':stravalatlongjson,
+ 'heartrate':stravahrjson,
+ 'cadence':stravaspmjson,
+ 'power':stravapowerjson,
+ }
+
+ ststrokesjson = json.load(open('rowers/tests/testdata/sporttracksstrokedata.txt','r'))
+
+ rkstrokesjson = json.load(open('rowers/tests/testdata/rkstrokes.txt','r'))
+
+ uastrokesjson = json.load(open('rowers/tests/testdata/uastrokes.txt','r'))
+ uauserjson = json.load(open('rowers/tests/testdata/uauser.txt','r'))
+
+ class MockResponse:
+ def __init__(self, json_data, status_code):
+ self.json_data = json_data
+ self.status_code = status_code
+
+ def json(self):
+ return self.json_data
+
+
+ class MockHeaderResponse:
+ def __init__(self, header_data, status_code):
+ self.headers = header_data
+ self.status_code = status_code
+
+ class MockSession:
+ def send(self,prepped):
+ # prepped.url
+ # prepped.body (post data)
+ # prepped.headers
+ # prepped.method
+
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+
+ return MockResponse(json_data,200)
+
+ if not args:
+ return MockSession()
+
+ polartester = re.compile('.*?polaraccesslink\.com')
+ c2tester = re.compile('.*?log\.concept2\.com')
+ stravatester = re.compile('.*?strava\.com')
+ sttester = re.compile('.*?sporttracks\.mobi')
+ rktester = re.compile('.*?runkeeper\.com')
+ uatester = re.compile('.*?mapmyfitness\.com')
+ tptester = re.compile('.*?trainingpeaks\.com')
+
+ c2importregex = '.*?concept2.com\/api\/users\/me\/results\/\d+'
+ c2importtester = re.compile(c2importregex)
+
+ c2uploadregex = '.*?concept2.com\/api\/users\/\d+\/results$'
+ c2uploadtester = re.compile(c2uploadregex)
+
+ c2strokesregex = '.*?concept2.com\/api\/users\/me\/results\/\d+\/strokes'
+ c2strokestester = re.compile(c2strokesregex)
+
+ c2workoutlistregex = '.*?concept2\.com\/api\/users\/me\/results\?page=\d'
+ c2workoutlisttester = re.compile(c2workoutlistregex)
+
+ stravaworkoutlistregex = '.*?strava\.com\/api\/v3\/athlete\/activities'
+ stravaworkoutlisttester = re.compile(stravaworkoutlistregex)
+
+ stravastreamregex = '.*?strava\.com\/api\/v3\/activities\/\d+\/streams\/(\w.*?)\?'
+ stravastreamtester = re.compile(stravastreamregex)
+
+ stravasummaryregex = '.*?strava\.com\/api\/v3\/activities\/\d+$'
+ stravasummarytester = re.compile(stravasummaryregex)
+
+ stuploadregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities.json$'
+ stuploadtester = re.compile(stuploadregex)
+
+ stworkoutlistregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities$'
+ stworkoutlisttester = re.compile(stworkoutlistregex)
+
+ ststrokesregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/\d+$'
+ ststrokestester = re.compile(ststrokesregex)
+
+ rkuploadregex = '.*?api\.runkeeper\.com\/fitnessActivities$'
+ rkuploadtester = re.compile(rkuploadregex)
+ rkuserregex = '.*?api\.runkeeper\.com\/user$'
+ rkusertester = re.compile(rkuserregex)
+ rkstrokesregex = '.*?api\.runkeeper\.com\/fitnessActivities/\d+$'
+ rkstrokestester = re.compile(rkstrokesregex)
+
+ uaapiregex = '.*?api\.ua\.com'
+ uaapitester = re.compile(uaapiregex)
+
+ uauploadregex = '.*?api\.ua\.com\/v7.1\/workout\/$'
+ uauploadtester = re.compile(uauploadregex)
+
+ uastrokesregex = '.*?api\.ua\.com\/v7.1\/workout\/\d+'
+ uastrokestester = re.compile(uastrokesregex)
+
+ ualistregex = '.*?api\.ua\.com\/v7.1\/workout\/\?user'
+ ualisttester = re.compile(ualistregex)
+
+ uauserregex = '.*?api\.ua\.com\/v7.1\/user\/self\/'
+ uausertester = re.compile(uauserregex)
+
+ tpuploadregex = '.*?trainingpeaks\.com\/v1\/file'
+ tpuploadtester = re.compile(tpuploadregex)
+
+ if polartester.match(args[0]):
+ json_data = polar_json
+ return MockResponse(json_data,200)
+
+ if tptester.match(args[0]):
+ if 'token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ elif tpuploadtester.match(args[0]):
+ return MockResponse(tpuploadresponse,200)
+
+ if uaapitester.match(args[0]):
+ if 'access_token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ elif uauploadtester.match(args[0]):
+ if 'data' in kwargs:
+ return MockResponse(uapostworkoutjson,200)
+ elif uastrokestester.match(args[0]):
+ return MockResponse(uastrokesjson,200)
+ elif ualisttester.match(args[0]):
+ return MockResponse(uaworkoutlistjson,200)
+ elif uausertester.match(args[0]):
+ return MockResponse(uauserjson,200)
+
+
+ if uatester.match(args[0]):
+ if 'access_token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+
+
+ if rktester.match(args[0]):
+ if 'token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ elif rkuploadtester.match(args[0]):
+ if 'data' in kwargs:
+ # post
+ header_data = {
+ 'Location': '/fitnessActivities/12'
+ }
+ return MockHeaderResponse(header_data,200)
+ else:
+ json_data = rkworkoutlistjson
+ return MockResponse(json_data,200)
+ elif rkusertester.match(args[0]):
+ json_data = {
+ "userID": 1234567890,
+ "profile": "/profile",
+ "settings": "/settings",
+ "fitness_activities": "/fitnessActivities",
+ "strength_training_activities": "/strengthTrainingActivities",
+ "background_activities": "/backgroundActivities",
+ "sleep": "/sleep",
+ "nutrition": "/nutrition",
+ "weight": "/weight",
+ "general_measurements": "/generalMeasurements",
+ "diabetes": "/diabetes",
+ "records": "/records",
+ "team": "/team"
+ }
+ return MockResponse(json_data, 200)
+ elif rkstrokestester.match(args[0]):
+ return MockResponse(rkstrokesjson,200)
+
+ if sttester.match(args[0]):
+ if 'oauth2/token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ if ststrokestester.match(args[0]):
+ return MockResponse(ststrokesjson,200)
+ if stuploadtester.match(args[0]):
+ json_data = {
+ "uris": [
+ "https://api.sporttracks.mobi/api/v2/fitnessActivities/123456.json"
+ ]
+ }
+ return MockResponse(json_data, 200)
+ if stworkoutlisttester.match(args[0]):
+ return MockResponse(sporttracksworkoutlist,200)
+
+
+ if stravatester.match(args[0]):
+ if stravaworkoutlisttester.match(args[0]):
+ return MockResponse(stravaworkoutlist,200)
+ if stravastreamtester.match(args[0]):
+ metric = stravastreamtester.match(args[0]).group(1)
+ json_data = stravastreamjson[metric]
+ return MockResponse(json_data,200)
+ elif stravasummarytester.match(args[0]):
+ return MockResponse(stravasummaryjson,200)
+ elif 'token' in args[0]:
+ json_data = {
+ "token_type": "Bearer",
+ "access_token": "987654321234567898765432123456789",
+ "refresh_token": "1234567898765432112345678987654321",
+ "expires_at": 1531385304
+ }
+ return MockResponse(json_data,200)
+
+
+ if c2tester.match(args[0]):
+ if c2uploadtester.match(args[0]):
+ return MockResponse(c2uploadjson,201)
+ if c2strokestester.match(args[0]):
+ return MockResponse(c2strokedata,200)
+ elif c2importtester.match(args[0]):
+ return MockResponse(c2workoutdata,200)
+ elif c2workoutlisttester.match(args[0]):
+ return MockResponse(c2workoutlist,200)
+ elif 'access_token' in args[0]:
+ json_data = {
+ 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
+ 'expires_in': 604800,
+ 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
+ }
+ return MockResponse(json_data,200)
+ elif 'users/me' in args[0]:
+ json_data = {
+ 'data': {
+ 'username': 'john',
+ 'id': 1234,
+ }
+ }
+ return MockResponse(json_data,200)
+ elif 'results' in args[0]:
+ json_data = {
+ 'data': {
+ 'id': 1223,
+ }
+ }
+ else:
+ return MockResponse(c2workoutdata,200)
+
+ return MockResponse(None,404)
diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py
index 091663d1..1e84168c 100644
--- a/rowers/tests/test_imports.py
+++ b/rowers/tests/test_imports.py
@@ -37,7 +37,9 @@ import json
import numpy as np
from rowers import urls
-from rowers.views import error500_view,error404_view,error400_view,error403_view
+from rowers.views import (
+ error500_view,error404_view,error400_view,error403_view
+ )
from rowers.dataprep import delete_strokedata
@@ -46,343 +48,9 @@ redis_connection = StrictRedis()
from django_mailbox.models import Mailbox,MessageAttachment,Message
-#@pytest.mark.django_db
-class DjangoTestCase(TestCase, MockTestCase):
- def _pre_setup(self):
- MockTestCase.setUp(self)
- TestCase._pre_setup(self)
- self.client = Client()
+from rowers.tests.mocks import *
- def _post_teardown(self):
- TestCase._post_teardown(self)
- MockTestCase.tearDown(self)
- delete_strokedata(1)
-
-# to be done add polar mocks (for email processing)
-def mocked_requests(*args, **kwargs):
- with open('rowers/tests/testdata/c2jsonworkoutdata.txt','r') as infile:
- c2workoutdata = json.load(infile)
-
- with open('rowers/tests/testdata/c2jsonstrokedata.txt','r') as infile:
- c2strokedata = json.load(infile)
-
- polar_json = {
- 'available-user-data': []
- }
-
- c2workoutlist = json.load(open('rowers/tests/testdata/c2workoutlist.txt'))
-
- c2uploadjson = {
- "data": {
- "id": 339,
- "user_id": 1,
- "date": "2015-08-05 13:15:41",
- "timezone": "Europe/London",
- "date_utc": "2015-08-05 12:15:41",
- "distance": 5649,
- "type": "rower",
- "time": 8649,
- "time_formatted": "14:24.9",
- "workout_type": "JustRow",
- "source": "ErgData",
- "weight_class": "H",
- "verified": True,
- "ranked": False
- }
- }
-
- stravaworkoutlist = json.load(open('rowers/tests/testdata/stravaworkoutlist.txt'))
- sporttracksworkoutlist = json.load(open('rowers/tests/testdata/sporttracksworkouts.txt'))
-
- rkworkoutlistjson = json.load(open('rowers/tests/testdata/rkworkoutslist.txt','r'))
- uaworkoutlistjson = json.load(open('rowers/tests/testdata/uaworkoutlist.txt','r'))
-
- stravasummaryjson = json.load(open('rowers/tests/testdata/stravaworkoutsummary.txt','r'))
-
- stravatimejson = json.load(open('rowers/tests/testdata/stravatimetestdata.txt','r'))
- stravavelojson = json.load(open('rowers/tests/testdata/stravavelotestdata.txt','r'))
-
- stravapowerjson = json.load(open('rowers/tests/testdata/stravapowertestdata.txt','r'))
-
- stravadistancejson = json.load(open('rowers/tests/testdata/stravadistancetestdata.txt','r'))
- stravalatlongjson = json.load(open('rowers/tests/testdata/stravalatlongtestdata.txt','r'))
- stravahrjson = json.load(open('rowers/tests/testdata/stravahrtestdata.txt','r'))
- stravaspmjson = json.load(open('rowers/tests/testdata/stravaspmtestdata.txt','r'))
-
- uapostworkoutjson = json.load(open('rowers/tests/testdata/uapostworkoutresponse.txt','r'))
-
- tpuploadresponse = json.load(open('rowers/tests/testdata/tpuploadresponse.txt','r'))
-
- stravastreamjson = {
- 'time':stravatimejson,
- 'velocity_smooth':stravavelojson,
- 'distance':stravadistancejson,
- 'latlng':stravalatlongjson,
- 'heartrate':stravahrjson,
- 'cadence':stravaspmjson,
- 'power':stravapowerjson,
- }
-
- ststrokesjson = json.load(open('rowers/tests/testdata/sporttracksstrokedata.txt','r'))
-
- rkstrokesjson = json.load(open('rowers/tests/testdata/rkstrokes.txt','r'))
-
- uastrokesjson = json.load(open('rowers/tests/testdata/uastrokes.txt','r'))
- uauserjson = json.load(open('rowers/tests/testdata/uauser.txt','r'))
-
- class MockResponse:
- def __init__(self, json_data, status_code):
- self.json_data = json_data
- self.status_code = status_code
-
- def json(self):
- return self.json_data
-
-
- class MockHeaderResponse:
- def __init__(self, header_data, status_code):
- self.headers = header_data
- self.status_code = status_code
-
- class MockSession:
- def send(self,prepped):
- # prepped.url
- # prepped.body (post data)
- # prepped.headers
- # prepped.method
-
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
-
- return MockResponse(json_data,200)
-
- if not args:
- return MockSession()
-
- polartester = re.compile('.*?polaraccesslink\.com')
- c2tester = re.compile('.*?log\.concept2\.com')
- stravatester = re.compile('.*?strava\.com')
- sttester = re.compile('.*?sporttracks\.mobi')
- rktester = re.compile('.*?runkeeper\.com')
- uatester = re.compile('.*?mapmyfitness\.com')
- tptester = re.compile('.*?trainingpeaks\.com')
-
- c2importregex = '.*?concept2.com\/api\/users\/me\/results\/\d+'
- c2importtester = re.compile(c2importregex)
-
- c2uploadregex = '.*?concept2.com\/api\/users\/\d+\/results$'
- c2uploadtester = re.compile(c2uploadregex)
-
- c2strokesregex = '.*?concept2.com\/api\/users\/me\/results\/\d+\/strokes'
- c2strokestester = re.compile(c2strokesregex)
-
- c2workoutlistregex = '.*?concept2\.com\/api\/users\/me\/results\?page=\d'
- c2workoutlisttester = re.compile(c2workoutlistregex)
-
- stravaworkoutlistregex = '.*?strava\.com\/api\/v3\/athlete\/activities'
- stravaworkoutlisttester = re.compile(stravaworkoutlistregex)
-
- stravastreamregex = '.*?strava\.com\/api\/v3\/activities\/\d+\/streams\/(\w.*?)\?'
- stravastreamtester = re.compile(stravastreamregex)
-
- stravasummaryregex = '.*?strava\.com\/api\/v3\/activities\/\d+$'
- stravasummarytester = re.compile(stravasummaryregex)
-
- stuploadregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities.json$'
- stuploadtester = re.compile(stuploadregex)
-
- stworkoutlistregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities$'
- stworkoutlisttester = re.compile(stworkoutlistregex)
-
- ststrokesregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/\d+$'
- ststrokestester = re.compile(ststrokesregex)
-
- rkuploadregex = '.*?api\.runkeeper\.com\/fitnessActivities$'
- rkuploadtester = re.compile(rkuploadregex)
- rkuserregex = '.*?api\.runkeeper\.com\/user$'
- rkusertester = re.compile(rkuserregex)
- rkstrokesregex = '.*?api\.runkeeper\.com\/fitnessActivities/\d+$'
- rkstrokestester = re.compile(rkstrokesregex)
-
- uaapiregex = '.*?api\.ua\.com'
- uaapitester = re.compile(uaapiregex)
-
- uauploadregex = '.*?api\.ua\.com\/v7.1\/workout\/$'
- uauploadtester = re.compile(uauploadregex)
-
- uastrokesregex = '.*?api\.ua\.com\/v7.1\/workout\/\d+'
- uastrokestester = re.compile(uastrokesregex)
-
- ualistregex = '.*?api\.ua\.com\/v7.1\/workout\/\?user'
- ualisttester = re.compile(ualistregex)
-
- uauserregex = '.*?api\.ua\.com\/v7.1\/user\/self\/'
- uausertester = re.compile(uauserregex)
-
- tpuploadregex = '.*?trainingpeaks\.com\/v1\/file'
- tpuploadtester = re.compile(tpuploadregex)
-
- if polartester.match(args[0]):
- json_data = polar_json
- return MockResponse(json_data,200)
-
- if tptester.match(args[0]):
- if 'token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- elif tpuploadtester.match(args[0]):
- return MockResponse(tpuploadresponse,200)
-
- if uaapitester.match(args[0]):
- if 'access_token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- elif uauploadtester.match(args[0]):
- if 'data' in kwargs:
- return MockResponse(uapostworkoutjson,200)
- elif uastrokestester.match(args[0]):
- return MockResponse(uastrokesjson,200)
- elif ualisttester.match(args[0]):
- return MockResponse(uaworkoutlistjson,200)
- elif uausertester.match(args[0]):
- return MockResponse(uauserjson,200)
-
-
- if uatester.match(args[0]):
- if 'access_token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
-
-
- if rktester.match(args[0]):
- if 'token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- elif rkuploadtester.match(args[0]):
- if 'data' in kwargs:
- # post
- header_data = {
- 'Location': '/fitnessActivities/12'
- }
- return MockHeaderResponse(header_data,200)
- else:
- json_data = rkworkoutlistjson
- return MockResponse(json_data,200)
- elif rkusertester.match(args[0]):
- json_data = {
- "userID": 1234567890,
- "profile": "/profile",
- "settings": "/settings",
- "fitness_activities": "/fitnessActivities",
- "strength_training_activities": "/strengthTrainingActivities",
- "background_activities": "/backgroundActivities",
- "sleep": "/sleep",
- "nutrition": "/nutrition",
- "weight": "/weight",
- "general_measurements": "/generalMeasurements",
- "diabetes": "/diabetes",
- "records": "/records",
- "team": "/team"
- }
- return MockResponse(json_data, 200)
- elif rkstrokestester.match(args[0]):
- return MockResponse(rkstrokesjson,200)
-
- if sttester.match(args[0]):
- if 'oauth2/token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- if ststrokestester.match(args[0]):
- return MockResponse(ststrokesjson,200)
- if stuploadtester.match(args[0]):
- json_data = {
- "uris": [
- "https://api.sporttracks.mobi/api/v2/fitnessActivities/123456.json"
- ]
- }
- return MockResponse(json_data, 200)
- if stworkoutlisttester.match(args[0]):
- return MockResponse(sporttracksworkoutlist,200)
-
-
- if stravatester.match(args[0]):
- if stravaworkoutlisttester.match(args[0]):
- return MockResponse(stravaworkoutlist,200)
- if stravastreamtester.match(args[0]):
- metric = stravastreamtester.match(args[0]).group(1)
- json_data = stravastreamjson[metric]
- return MockResponse(json_data,200)
- elif stravasummarytester.match(args[0]):
- return MockResponse(stravasummaryjson,200)
- elif 'token' in args[0]:
- json_data = {
- "token_type": "Bearer",
- "access_token": "987654321234567898765432123456789",
- "refresh_token": "1234567898765432112345678987654321",
- "expires_at": 1531385304
- }
- return MockResponse(json_data,200)
-
-
- if c2tester.match(args[0]):
- if c2uploadtester.match(args[0]):
- return MockResponse(c2uploadjson,201)
- if c2strokestester.match(args[0]):
- return MockResponse(c2strokedata,200)
- elif c2importtester.match(args[0]):
- return MockResponse(c2workoutdata,200)
- elif c2workoutlisttester.match(args[0]):
- return MockResponse(c2workoutlist,200)
- elif 'access_token' in args[0]:
- json_data = {
- 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
- 'expires_in': 604800,
- 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
- }
- return MockResponse(json_data,200)
- elif 'users/me' in args[0]:
- json_data = {
- 'data': {
- 'username': 'john',
- 'id': 1234,
- }
- }
- return MockResponse(json_data,200)
- elif 'results' in args[0]:
- json_data = {
- 'data': {
- 'id': 1223,
- }
- }
- else:
- return MockResponse(c2workoutdata,200)
-
- return MockResponse(None,404)
-
-#@pytest.mark.django_db
+@pytest.mark.django_db
class C2Objects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -472,7 +140,8 @@ class C2Objects(DjangoTestCase):
self.assertEqual(response.status_code,200)
@patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
- def test_c2_import(self, mock_get):
+ @patch('rowers.dataprep.create_engine')
+ def test_c2_import(self, mock_get, mocked_sqlalchemy):
response = self.c.get('/rowers/workout/c2import/12/',follow=True)
@@ -578,7 +247,8 @@ class C2ObjectsTokenExpired(DjangoTestCase):
self.assertEqual(response.status_code,200)
@patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
- def test_c2_import(self, mock_get):
+ @patch('rowers.dataprep.create_engine')
+ def test_c2_import(self, mock_get, mocked_sqlalchemy):
response = self.c.get('/rowers/workout/c2import/12/',follow=True)
@@ -839,7 +509,7 @@ class RunKeeperObjects(DjangoTestCase):
-#@pytest.mark.django_db
+@pytest.mark.django_db
class UAObjects(DjangoTestCase):
def setUp(self):
self.c = Client()
@@ -929,7 +599,8 @@ class UAObjects(DjangoTestCase):
self.assertEqual(response.status_code,200)
@patch('rowers.imports.requests.get', side_effect=mocked_requests)
- def test_underarmour_import(self, mock_get):
+ @patch('rowers.dataprep.create_engine')
+ def test_underarmour_import(self, mock_get, mocked_sqlalchemy):
response = self.c.get('/rowers/workout/underarmourimport/12/',follow=True)
diff --git a/rowers/tests/test_zemails.py b/rowers/tests/test_zemails.py
index d339236d..3d17c8ce 100644
--- a/rowers/tests/test_zemails.py
+++ b/rowers/tests/test_zemails.py
@@ -49,8 +49,10 @@ 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
+
+@pytest.mark.django_db
class UploadTests(TestCase):
def setUp(self):
redis_connection.publish('tasks','KILL')
@@ -151,7 +153,8 @@ workout water
pass
@patch('requests.get', side_effect=mocked_requests)
- def test_emailprocessing(self, mock_get):
+ @patch('rowers.dataprep.create_engine')
+ def test_emailprocessing(self, mock_get, mocked_sqlalchemy):
out = StringIO()
call_command('processemail', stdout=out,testing=True)
self.assertIn('Successfully processed email attachments',out.getvalue())
From 331b6c0049ef8db375376310b88c9deb46a45176 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Thu, 3 Jan 2019 12:32:24 +0100
Subject: [PATCH 08/18] mocking sqlalchemy
---
rowers/management/commands/processemail.py | 27 ++++++----
rowers/tests/mocks.py | 5 +-
rowers/tests/test_zemails.py | 4 +-
rowers/tests/tests.py | 58 ++++++++++++++--------
4 files changed, 61 insertions(+), 33 deletions(-)
diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py
index 8a891e60..23b640b7 100644
--- a/rowers/management/commands/processemail.py
+++ b/rowers/management/commands/processemail.py
@@ -196,18 +196,23 @@ class Command(BaseCommand):
rowers = []
for rower in rowers:
if extension == 'zip':
- zip_file = zipfile.ZipFile(attachment.document)
- for id,filename in enumerate(zip_file.namelist()):
- datafile = zip_file.extract(filename, path='media/')
- if id>0:
- title = name+' ('+str(id+1)+')'
- else:
- title = name
+ try:
+ zip_file = zipfile.ZipFile(attachment.document)
+ for id,filename in enumerate(zip_file.namelist()):
+ datafile = zip_file.extract(
+ filename, path='media/')
+ if id>0:
+ title = name+' ('+str(id+1)+')'
+ else:
+ title = name
- workoutid = processattachment(
- rower, datafile, title, uploadoptions,
- testing=testing
- )
+ workoutid = processattachment(
+ rower, datafile, title, uploadoptions,
+ testing=testing
+ )
+ except:
+ print "Bad ZIP file"
+ print attachment.document.name
else:
# move attachment and make workout
if testing:
diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py
index afd73bb1..3f445c1b 100644
--- a/rowers/tests/mocks.py
+++ b/rowers/tests/mocks.py
@@ -91,8 +91,11 @@ class DjangoTestCase(TestCase, MockTestCase):
def _post_teardown(self):
TestCase._post_teardown(self)
MockTestCase.tearDown(self)
- delete_strokedata(1)
+ # delete_strokedata(1)
+def mocked_polar_notifications(*args, **kwargs):
+ return []
+
# to be done add polar mocks (for email processing)
def mocked_requests(*args, **kwargs):
with open('rowers/tests/testdata/c2jsonworkoutdata.txt','r') as infile:
diff --git a/rowers/tests/test_zemails.py b/rowers/tests/test_zemails.py
index 3d17c8ce..bed7a8ec 100644
--- a/rowers/tests/test_zemails.py
+++ b/rowers/tests/test_zemails.py
@@ -154,7 +154,9 @@ workout water
@patch('requests.get', side_effect=mocked_requests)
@patch('rowers.dataprep.create_engine')
- def test_emailprocessing(self, mock_get, mocked_sqlalchemy):
+ @patch('rowers.polarstuff.get_polar_notifications')
+ def test_emailprocessing(
+ self, mock_get, mocked_sqlalchemy,mocked_polar_notifications):
out = StringIO()
call_command('processemail', stdout=out,testing=True)
self.assertIn('Successfully processed email attachments',out.getvalue())
diff --git a/rowers/tests/tests.py b/rowers/tests/tests.py
index e51b9a7f..b1ad33b0 100644
--- a/rowers/tests/tests.py
+++ b/rowers/tests/tests.py
@@ -345,7 +345,8 @@ class ViewTest(TestCase):
self.assertEqual(response.status_code, 200)
- def test_upload_view_sled(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_sled(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/testdata.csv'
@@ -421,7 +422,8 @@ class ViewTest(TestCase):
self.assertEqual(response.status_code, 200)
- def test_upload_view_sled_negativetime(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_sled_negativetime(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/tim.csv'
@@ -468,8 +470,8 @@ class ViewTest(TestCase):
-
- def test_upload_view_sled_noname(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_sled_noname(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/testdata.csv'
@@ -504,7 +506,8 @@ class ViewTest(TestCase):
except WindowsError:
pass
- def test_upload_view_logcard(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_logcard(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/logcard.csv'
@@ -536,7 +539,8 @@ class ViewTest(TestCase):
- def test_upload_view_TCX_CN(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_TCX_CN(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/crewnerddata.tcx'
@@ -583,7 +587,8 @@ class ViewTest(TestCase):
except WindowsError:
pass
- def test_upload_view_TCX_SpeedCoach2a(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_TCX_SpeedCoach2a(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/Speedcoach2example.csv'
@@ -617,7 +622,8 @@ class ViewTest(TestCase):
except WindowsError:
pass
- def test_upload_view_TCX_SpeedCoach2b(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_TCX_SpeedCoach2b(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/Speedcoach2example.csv'
@@ -653,7 +659,8 @@ class ViewTest(TestCase):
- def test_upload_view_TCX_SpeedCoach2c(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_TCX_SpeedCoach2c(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/speedcoach3test3.csv'
@@ -688,7 +695,8 @@ class ViewTest(TestCase):
pass
- def test_upload_view_SpeedCoach2v127(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_SpeedCoach2v127(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/SpeedCoach2Linkv1.27.csv'
@@ -724,7 +732,8 @@ class ViewTest(TestCase):
- def test_upload_view_SpeedCoach2v127intervals(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_SpeedCoach2v127intervals(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/SpeedCoach2Link_interval.csv'
@@ -760,7 +769,8 @@ class ViewTest(TestCase):
- def test_upload_view_TCX_NoHR(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_TCX_NoHR(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/NoHR.tcx'
@@ -795,7 +805,8 @@ class ViewTest(TestCase):
pass
- def test_upload_view_TCX_CN(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_TCX_CN(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/rowinginmotionexample.tcx'
@@ -827,7 +838,8 @@ class ViewTest(TestCase):
pass
- def test_upload_view_RP(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_RP(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/RP_testdata.csv'
@@ -859,7 +871,8 @@ class ViewTest(TestCase):
pass
- def test_upload_view_Mystery(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_Mystery(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/mystery.csv'
@@ -891,7 +904,8 @@ class ViewTest(TestCase):
pass
- def test_upload_view_RP_interval(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_RP_interval(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/RP_interval.csv'
@@ -924,7 +938,8 @@ class ViewTest(TestCase):
- def test_upload_view_sled_desktop(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_sled_desktop(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/painsled_desktop_example.csv'
@@ -955,7 +970,8 @@ class ViewTest(TestCase):
except WindowsError:
pass
- def test_upload_view_sled_ergdata(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_sled_ergdata(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/ergdata_example.csv'
@@ -986,7 +1002,8 @@ class ViewTest(TestCase):
except WindowsError:
pass
- def test_upload_view_sled_boatcoach(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_sled_boatcoach(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/boatcoach.csv'
@@ -1017,7 +1034,8 @@ class ViewTest(TestCase):
except WindowsError:
pass
- def test_upload_view_sled_ergstick(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_upload_view_sled_ergstick(self, mocked_sqlalchemy):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/ergstick.csv'
From 8ff24d3fae4f6034a0019a9ceaff8da165b31ab9 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Thu, 3 Jan 2019 16:06:47 +0100
Subject: [PATCH 09/18] faking some more sql calls
---
rowers/tests/mocks.py | 64 ++++++++
rowers/tests/testdata/fake_strokedata.csv | 192 ++++++++++++++++++++++
rowers/tests/tests.py | 185 ++++++++++++++-------
3 files changed, 386 insertions(+), 55 deletions(-)
create mode 100644 rowers/tests/testdata/fake_strokedata.csv
diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py
index 3f445c1b..2436af15 100644
--- a/rowers/tests/mocks.py
+++ b/rowers/tests/mocks.py
@@ -34,6 +34,7 @@ import rowers.c2stuff as c2stuff
import json
import numpy as np
+from rowingdata import rowingdata, figure
from rowers import urls
from rowers.views import (
@@ -93,8 +94,71 @@ class DjangoTestCase(TestCase, MockTestCase):
MockTestCase.tearDown(self)
# delete_strokedata(1)
+def mocked_tcx_parser(*args, **kwargs):
+ df = pd.read_csv('rowers/tests/testdata/fake_strokedata.csv')
+
+ return rowingdata(df=df)
+
def mocked_polar_notifications(*args, **kwargs):
return []
+
+
+class mocked_canvas():
+ def print_figure(*args, **kwargs):
+ return True
+
+import pandas as pd
+def mocked_read_df_sql(id):
+ df = pd.read_csv('rowers/tests/testdata/fake_strokedata.csv')
+
+ return df
+
+
+
+class mocked_rowingdata(rowingdata):
+ def __init__(self, *args, **kwargs):
+ super(mocked_rowingdata).__init__(*args, **kwargs)
+
+ def get_metersplot_erg(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_timeplot_erg(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_piechart(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_timeplot_otwempower(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_timeplot_otw(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_metersplot_otwempower(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_metersplot_erg2(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_timeplot_erg2(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_time_otwpower(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
+ def get_power_piechart(self, title):
+ fig1 = figure.Figure(figsize(12,10))
+ return fig1
+
# to be done add polar mocks (for email processing)
def mocked_requests(*args, **kwargs):
diff --git a/rowers/tests/testdata/fake_strokedata.csv b/rowers/tests/testdata/fake_strokedata.csv
new file mode 100644
index 00000000..558cb86c
--- /dev/null
+++ b/rowers/tests/testdata/fake_strokedata.csv
@@ -0,0 +1,192 @@
+,id,time,hr,pace,spm,cumdist,ftime,fpace,driveenergy,power,averageforce,drivelength,peakforce,forceratio,distance,drivespeed,workoutid,equivergpower,ergpace,fergpace,fnowindpace,hr_an,hr_at,hr_bottom,hr_max,hr_tr,hr_ut1,hr_ut2,nowindpace,x_right,workoutstate,catch,finish,peakforceangle,wash,slip,rhythm,effectiveangle,totalangle,efficiency,distanceperstroke,velo
+0,39799136,0.0,126.976190476,267517.544209,1.33333333333,5.4,05:50.0,04:27.5,88.1806760867,19.35721935,102.30906,0.826870748299,209.06634,0.499922562048,5.4,0.85119047619,3252,50.0,191293.118277,03:11.2,04:27.5,0,0,0,0,0,127,0,267517.544209,3.5326e+11,4,0.0,0.0,0.0,0.0,0.0,37.7952755906,0.0,0.0,94.4426720529,84.1066333294,1.86903629621
+1,39799137,3240.00000954,127.095238095,230263.518558,15.5714285714,13.1,00:03.2,03:50.2,220.103927167,25.6355755264,188.604528,1.21267573696,299.810028,0.600977358387,13.1,0.8736913205,3252,50.0,191293.118277,03:11.2,03:50.2,0,0,0,0,0,127,0,230263.518558,6500000000.0,4,0.0,0.0,0.0,0.0,0.0,44.6202531646,0.0,0.0,111.827743719,8.36695937183,2.17142517031
+2,39799138,6150.00009537,127.880952381,201258.643579,21.4285714286,21.0,00:06.1,03:21.2,273.846587402,44.6485827564,195.276858,1.36636621315,310.485756,0.641492073477,21.0,1.29492362983,3252,50.0,191293.118277,03:11.2,03:21.2,0,0,0,0,0,128,0,201258.643579,9020000000.0,4,0.0,0.0,0.0,0.0,0.0,37.7224199288,0.0,0.0,96.1605065241,6.95622297311,2.48436534754
+3,39799139,9269.99998093,129.0,180582.4977,21.9047619048,30.3,00:09.2,03:00.5,278.525981193,64.2054260988,201.059544,1.37036281179,322.49595,0.643049698939,30.3,1.38929798724,3252,50.0,191293.118277,03:11.2,03:00.5,0,0,0,0,0,129,0,180582.4977,12420000000.0,4,0.0,0.0,0.0,0.0,0.0,34.1549295775,0.0,0.0,92.5698041753,7.58415258861,2.76881761171
+4,39799140,12150.0000954,129.952380952,168216.324384,20.380952381,39.0,00:12.1,02:48.2,271.853383897,73.72570625,206.84223,1.32583900227,323.830416,0.627589324063,39.0,1.40372670807,3252,50.0,191293.118277,03:11.2,02:48.2,0,0,0,0,0,130,0,168216.324384,15020000000.0,4,0.0,0.0,0.0,0.0,0.0,33.9483394834,0.0,0.0,99.7343324777,8.75041481387,2.97236312725
+5,39799141,15150.0000954,130.761904762,163348.980307,20.2380952381,48.2,00:15.1,02:43.3,271.598579567,80.0701191136,201.949188,1.29342403628,323.385594,0.628837587302,48.2,1.40838509317,3252,50.0,191293.118277,03:11.2,02:43.3,0,0,0,0,0,131,0,163348.980307,18130000000.0,4,0.0,0.0,0.0,0.0,0.0,32.7402135231,0.0,0.0,100.287842053,9.07476090999,3.06093125932
+6,39799142,18150.0000954,131.380952381,161595.916202,20.4285714286,57.6,00:18.1,02:41.5,272.398664053,82.9313928352,221.521356,1.28757369615,354.967956,0.633692860915,57.6,1.4380952381,3252,50.0,191293.118277,03:11.2,02:41.5,0,0,0,0,0,131,0,161595.916202,21140000000.0,4,0.0,0.0,0.0,0.0,0.0,32.1428571429,0.0,0.0,100.013342349,9.08767686119,3.09413759798
+7,39799143,20910.0000858,131.761904762,160946.930227,20.3333333333,66.4,00:20.9,02:40.9,269.06750204,86.6028089332,214.404204,1.29693877551,334.950966,0.632028077529,66.4,1.50830564784,3252,50.0,191293.118277,03:11.2,02:40.9,0,0,0,0,0,132,0,160946.930227,23710000000.0,4,0.0,0.0,0.0,0.0,0.0,31.1594202899,0.0,0.0,96.9366423557,9.16705794878,3.10661408264
+8,39799144,23819.9999332,131.857142857,160556.046845,20.1904761905,75.5,00:23.8,02:40.5,301.07501704,85.9423518548,215.293848,1.31319727891,337.619898,0.630773850875,75.5,1.48376623377,3252,50.0,191293.118277,03:11.2,02:40.5,0,0,0,0,0,132,0,160556.046845,26730000000.0,4,0.0,0.0,0.0,0.0,0.0,32.1167883212,0.0,0.0,98.396762766,9.25439487206,3.11417732203
+9,39799145,26940.0000572,132.047619048,156621.552107,20.7619047619,85.1,00:26.9,02:36.6,346.52959188,87.8502695392,234.866016,1.34163265306,381.657276,0.623563414808,85.1,1.50240770465,3252,50.0,191293.118277,03:11.2,02:36.6,0,0,0,0,0,132,0,156621.552107,29930000000.0,4,0.0,0.0,0.0,0.0,0.0,32.962962963,0.0,0.0,103.69799887,9.22576815896,3.19240866453
+10,39799146,29640.0001049,132.285714286,150480.356059,21.0952380952,95.0,00:29.6,02:30.4,395.87381738,99.6207143932,324.72006,1.37176870748,532.007112,0.612977608416,95.0,1.60465116279,3252,50.0,191293.118277,03:11.2,02:30.4,0,0,0,0,0,132,0,150480.356059,32470000000.0,4,0.0,0.0,0.0,0.0,0.0,32.5757575758,0.0,0.0,103.104818509,9.45054845301,3.32269282911
+11,39799147,32369.9998856,132.952380952,143847.653479,21.1904761905,105.0,00:32.3,02:23.8,441.03471892,126.436932947,314.044332,1.39544217687,521.331384,0.594869267431,105.0,1.70731707317,3252,50.0,191293.118277,03:11.2,02:23.8,0,0,0,0,0,133,0,143847.653479,35110000000.0,4,0.0,0.0,0.0,0.0,0.0,31.5384615385,0.0,0.0,93.0005991502,9.84187300133,3.47589959174
+12,39799148,35190.0000572,133.904761905,138421.986347,21.2857142857,115.3,00:35.1,02:18.4,462.78370054,134.706308388,312.709866,1.40442176871,529.783002,0.585113064034,115.3,1.773960217,3252,50.0,191293.118277,03:11.2,02:18.4,0,0,0,0,0,134,0,138421.986347,38010000000.0,4,0.0,0.0,0.0,0.0,0.0,30.0380228137,0.0,0.0,97.9636321096,10.1818794134,3.61214293477
+13,39799149,38009.9999905,134.904761905,135418.044204,21.1904761905,125.8,00:38.0,02:15.4,462.60068806,138.97288125,338.06472,1.40095238095,608.961318,0.572328332569,125.8,1.7967032967,3252,50.0,191293.118277,03:11.2,02:15.4,0,0,0,0,0,135,0,135418.044204,40820000000.0,4,0.0,0.0,0.0,0.0,0.0,30.0,0.0,0.0,101.416442286,10.4545176782,3.69227013238
+14,39799150,40890.0001049,136.047619048,134197.799472,21.3333333333,136.6,00:40.8,02:14.1,467.18302038,146.360682773,335.395788,1.39530612245,576.04449,0.573372604334,136.6,1.8107606679,3252,50.0,191293.118277,03:11.2,02:14.1,0,0,0,0,0,136,0,134197.799472,43770000000.0,4,0.0,0.0,0.0,0.0,0.0,29.8449612403,0.0,0.0,98.9480942562,10.4789348673,3.72584350838
+15,39799151,43680.0000668,137.428571429,133465.452616,21.5238095238,147.2,00:43.6,02:13.4,462.1348051,149.79272233,342.068118,1.38816326531,601.844166,0.577043192957,147.2,1.77838827839,3252,50.0,191293.118277,03:11.2,02:13.4,0,0,0,0,0,137,0,133465.452616,46480000000.0,4,0.0,0.0,0.0,0.0,0.0,29.8850574713,0.0,0.0,98.2812654729,10.4431917205,3.74628782355
+16,39799152,46470.0000286,138.619047619,133276.640695,21.7619047619,157.6,00:46.4,02:13.2,463.22873436,152.311202593,319.382196,1.37918367347,535.120866,0.577917524111,157.6,1.84380952381,3252,50.0,191293.118277,03:11.2,02:13.2,0,0,0,0,0,139,0,133276.640695,49260000000.0,4,0.0,0.0,0.0,0.0,0.0,28.8461538462,0.0,0.0,97.0675536464,10.3435665207,3.75159515871
+17,39799153,49200.0000477,139.714285714,133039.90291,21.7142857143,167.8,00:49.2,02:13.0,461.2763289,145.54018967,332.726856,1.37448979592,587.609862,0.573139687516,167.8,1.82857142857,3252,50.0,191293.118277,03:11.2,02:13.0,0,0,0,0,0,140,0,133039.90291,51900000000.0,4,0.0,0.0,0.0,0.0,0.0,29.8804780876,0.0,0.0,102.126712018,10.3846959983,3.75827093273
+18,39799154,51960.0000381,140.380952381,133170.997419,21.2857142857,178.5,00:51.9,02:13.1,461.2964518,149.554325469,360.30582,1.37319727891,644.102256,0.573214309195,178.5,1.8007518797,3252,50.0,191293.118277,03:11.2,02:13.1,0,0,0,0,0,140,0,133170.997419,54760000000.0,4,0.0,0.0,0.0,0.0,0.0,29.0076335878,0.0,0.0,99.0923455439,10.5833552385,3.75457126319
+19,39799155,54660.0000858,140.80952381,133152.931686,21.2380952381,188.5,00:54.6,02:13.1,467.16277644,154.735851561,320.716662,1.37183673469,551.134458,0.566265126248,188.5,1.83619047619,3252,50.0,191293.118277,03:11.2,02:13.1,0,0,0,0,0,141,0,133152.931686,57340000000.0,4,0.0,0.0,0.0,0.0,0.0,28.7356321839,0.0,0.0,95.8131009692,10.6085238675,3.75508067055
+20,39799156,57539.9999619,141.19047619,132699.130953,21.4761904762,199.3,00:57.5,02:12.6,460.85166006,147.538156497,338.06472,1.37285714286,587.16504,0.580181755545,199.3,1.78478664193,3252,50.0,191293.118277,03:11.2,02:12.6,0,0,0,0,0,141,0,132699.130953,60400000000.0,4,0.0,0.0,0.0,0.0,0.0,29.8449612403,0.0,0.0,101.521834232,10.5267892646,3.76792218917
+21,39799157,60269.9999809,141.714285714,132964.959531,21.5714285714,209.4,01:00.2,02:12.9,451.775748,150.748843213,337.619898,1.37,588.054684,0.586801841858,209.4,1.84555984556,3252,50.0,191293.118277,03:11.2,02:12.9,0,0,0,0,0,142,0,132964.959531,62950000000.0,4,0.0,0.0,0.0,0.0,0.0,29.718875502,0.0,0.0,98.7648569306,10.4593607348,3.76038921655
+22,39799158,62849.9999046,142.238095238,133493.269817,21.8571428571,219.4,01:02.8,02:13.4,456.8960426,150.868643612,327.833814,1.36394557823,537.344976,0.590718880399,219.4,1.82285714286,3252,50.0,191293.118277,03:11.2,02:13.4,0,0,0,0,0,142,0,133493.269817,65500000000.0,4,0.0,0.0,0.0,0.0,0.0,30.0,0.0,0.0,97.5193832126,10.2817844037,3.74550717565
+23,39799159,65730.0000191,143.142857143,133423.241182,22.1428571429,230.2,01:05.7,02:13.4,450.13396144,148.010908576,332.726856,1.3562585034,574.265202,0.587126683943,230.2,1.80761904762,3252,50.0,191293.118277,03:11.2,02:13.4,0,0,0,0,0,143,0,133423.241182,68620000000.0,4,0.0,0.0,0.0,0.0,0.0,28.9575289575,0.0,0.0,99.5588474118,10.1544430916,3.7474730457
+24,39799160,68400.0000954,143.952380952,133559.338288,22.3333333333,240.2,01:08.4,02:13.5,451.23542544,147.06641215,336.730254,1.34823129252,572.485914,0.581344675244,240.2,1.8,3252,50.0,191293.118277,03:11.2,02:13.5,0,0,0,0,0,144,0,133559.338288,71060000000.0,4,0.0,0.0,0.0,0.0,0.0,30.487804878,0.0,0.0,99.8922443414,10.0575788957,3.74365436675
+25,39799161,71039.9999619,144.714285714,133228.128188,22.7619047619,250.1,01:11.0,02:13.2,448.59990048,150.0313724,332.726856,1.34,596.951124,0.572068554427,250.1,1.83170254403,3252,50.0,191293.118277,03:11.2,02:13.2,0,0,0,0,0,145,0,133228.128188,73670000000.0,4,0.0,0.0,0.0,0.0,0.0,29.9180327869,0.0,0.0,98.650248521,9.89274299446,3.75296123123
+26,39799162,73500.0,145.142857143,132852.649371,22.9047619048,259.6,01:13.5,02:12.8,447.82781658,151.46859775,340.733652,1.33578231293,588.054684,0.573409353633,259.6,1.85515873016,3252,50.0,191293.118277,03:11.2,02:12.8,0,0,0,0,0,145,0,132852.649371,75990000000.0,4,0.0,0.0,0.0,0.0,0.0,29.6296296296,0.0,0.0,98.5450423905,9.85882717413,3.76356815139
+27,39799163,76349.9999046,144.952380952,132705.854989,22.6666666667,270.3,01:16.3,02:12.7,445.93296564,152.311202593,325.609704,1.33557823129,566.258406,0.568538870911,270.3,1.82974559687,3252,50.0,191293.118277,03:11.2,02:12.7,0,0,0,0,0,145,0,132705.854989,79190000000.0,4,0.0,0.0,0.0,0.0,0.0,28.8537549407,0.0,0.0,98.3254503049,9.97340631186,3.76773127337
+28,39799164,79079.9999237,144.714285714,133013.725151,22.4761904762,280.6,01:19.0,02:13.0,446.46711516,149.43522195,341.623296,1.33843537415,600.954522,0.574029662749,280.6,1.80694980695,3252,50.0,191293.118277,03:11.2,02:13.0,0,0,0,0,0,145,0,133013.725151,81820000000.0,4,0.0,0.0,0.0,0.0,0.0,29.0196078431,0.0,0.0,99.5235141066,10.0346468847,3.75901057903
+29,39799165,81750.0,144.666666667,133278.99447,22.3333333333,290.7,01:21.7,02:13.2,453.9702032,149.79272233,332.282034,1.33891156463,593.392548,0.562905554475,290.7,1.83953033268,3252,50.0,191293.118277,03:11.2,02:13.2,0,0,0,0,0,144,0,133278.99447,84420000000.0,4,0.0,0.0,0.0,0.0,0.0,29.5546558704,0.0,0.0,98.6943311289,10.0787343679,3.75152890362
+30,39799166,84450.0000477,144.714285714,132845.542123,22.3333333333,300.8,01:24.4,02:12.8,461.67512544,149.316181683,341.623296,1.34027210884,594.727014,0.561184618018,300.8,1.83561643836,3252,50.0,191293.118277,03:11.2,02:12.8,0,0,0,0,0,145,0,132845.542123,87140000000.0,4,0.0,0.0,0.0,0.0,0.0,29.0836653386,0.0,0.0,99.9816299192,10.1116195592,3.76376950261
+31,39799167,87180.0000668,144.761904762,132433.757101,22.1428571429,311.1,01:27.1,02:12.4,462.93860148,152.070140328,357.636888,1.34319727891,661.450314,0.558028598825,311.1,1.80888030888,3252,50.0,191293.118277,03:11.2,02:12.4,0,0,0,0,0,145,0,132433.757101,89860000000.0,4,0.0,0.0,0.0,0.0,0.0,29.6,0.0,0.0,99.0895822785,10.2303124168,3.77547243954
+32,39799168,89789.9999619,145.142857143,132296.93032,21.8571428571,321.2,01:29.7,02:12.2,463.39797854,156.571128627,336.730254,1.34659863946,588.499506,0.560523315593,321.2,1.87301587302,3252,50.0,191293.118277,03:11.2,02:12.2,0,0,0,0,0,145,0,132296.93032,92460000000.0,4,0.0,0.0,0.0,0.0,0.0,29.0322580645,0.0,0.0,96.5399478842,10.374760898,3.77937718428
+33,39799169,92670.0000763,145.333333333,132417.814657,21.5714285714,331.9,01:32.6,02:12.4,459.09860748,150.150792431,340.28883,1.35204081633,612.075072,0.565722937216,331.9,1.83011583012,3252,50.0,191293.118277,03:11.2,02:12.4,0,0,0,0,0,145,0,132417.814657,95510000000.0,4,0.0,0.0,0.0,0.0,0.0,29.1338582677,0.0,0.0,100.39247635,10.502578376,3.77592698757
+34,39799170,95339.9999142,145.571428571,132644.156173,21.7142857143,342.0,01:35.3,02:12.6,457.32419134,150.988507466,334.950966,1.35741496599,579.158244,0.570439059313,342.0,1.83204633205,3252,50.0,191293.118277,03:11.2,02:12.6,0,0,0,0,0,146,0,132644.156173,98030000000.0,4,0.0,0.0,0.0,0.0,0.0,29.718875502,0.0,0.0,99.3252778037,10.4156789656,3.76948381613
+35,39799171,98069.9999332,146.0,132824.170064,21.8571428571,352.4,01:38.0,02:12.8,465.83169956,150.868643612,341.178474,1.35972789116,592.058082,0.573613897901,352.4,1.83783783784,3252,50.0,191293.118277,03:11.2,02:12.8,0,0,0,0,0,146,0,132824.170064,1.008e+11,4,0.0,0.0,0.0,0.0,0.0,29.1338582677,0.0,0.0,99.0005769733,10.3335787375,3.76437511153
+36,39799172,100859.999895,146.428571429,132399.04606,22.0952380952,363.0,01:40.8,02:12.3,469.36640042,153.399135658,346.96116,1.36340136054,621.416334,0.570446901224,363.0,1.84362934363,3252,50.0,191293.118277,03:11.2,02:12.3,0,0,0,0,0,146,0,132399.04606,1.0364e+11,4,0.0,0.0,0.0,0.0,0.0,28.5714285714,0.0,0.0,98.3083854908,10.255048364,3.77646225467
+37,39799173,103619.999886,146.666666667,132245.976211,22.0952380952,373.4,01:43.6,02:12.2,468.9419434,152.4318292,347.405982,1.36897959184,592.502904,0.567916935654,373.4,1.84555984556,3252,50.0,191293.118277,03:11.2,02:12.2,0,147,0,0,0,0,0,132245.976211,1.0637e+11,4,0.0,0.0,0.0,0.0,0.0,28.90625,0.0,0.0,99.2761628163,10.266918205,3.78083337072
+38,39799174,106380.000114,146.857142857,132500.471593,21.8571428571,383.9,01:46.3,02:12.5,470.1816956,152.914972515,337.619898,1.37258503401,619.192224,0.565878523172,383.9,1.80827067669,3252,50.0,191293.118277,03:11.2,02:12.5,0,147,0,0,0,0,0,132500.471593,1.0915e+11,4,0.0,0.0,0.0,0.0,0.0,29.4573643411,0.0,0.0,98.3933531887,10.3588236563,3.7735714748
+39,39799175,109230.000019,147.142857143,132775.418655,21.7142857143,394.6,01:49.2,02:12.7,466.5370299,151.46859775,334.061322,1.37394557823,574.265202,0.565880568251,394.6,1.83619047619,3252,50.0,191293.118277,03:11.2,02:12.7,0,147,0,0,0,0,0,132775.418655,1.121e+11,4,0.0,0.0,0.0,0.0,0.0,28.1954887218,0.0,0.0,98.7171028208,10.4053819703,3.76575728448
+40,39799176,111960.000038,147.333333333,132878.01379,21.7619047619,405.0,01:51.9,02:12.8,468.16105384,148.603267434,350.519736,1.37340136054,627.643842,0.56601972006,405.0,1.8045112782,3252,50.0,191293.118277,03:11.2,02:12.8,0,147,0,0,0,0,0,132878.01379,1.1469e+11,4,0.0,0.0,0.0,0.0,0.0,29.6875,0.0,0.0,100.38765333,10.3745966648,3.7628497427
+41,39799177,114690.000057,147.666666667,133014.526935,21.5714285714,415.3,01:54.6,02:13.0,461.97357982,151.82933255,334.061322,1.37108843537,586.275396,0.572604512571,415.3,1.85135135135,3252,50.0,191293.118277,03:11.2,02:13.0,0,148,0,0,0,0,0,133014.526935,1.1741e+11,4,0.0,0.0,0.0,0.0,0.0,29.2490118577,0.0,0.0,97.9524129494,10.4554630901,3.7589879205
+42,39799178,117630.000114,147.857142857,133297.852527,21.5714285714,426.0,01:57.6,02:13.2,467.13796324,150.509432707,343.402584,1.36891156463,590.723616,0.576219283059,426.0,1.85135135135,3252,50.0,191293.118277,03:11.2,02:13.2,0,148,0,0,0,0,0,133297.852527,1.2046e+11,4,0.0,0.0,0.0,0.0,0.0,28.0303030303,0.0,0.0,98.182676506,10.4332399244,3.75099816329
+43,39799179,120329.999924,148.142857143,133012.600446,21.7619047619,436.5,02:00.3,02:13.0,468.43324254,149.316181683,326.054526,1.37163265306,572.485914,0.574708892977,436.5,1.78107606679,3252,50.0,191293.118277,03:11.2,02:13.0,0,148,0,0,0,0,0,133012.600446,1.2316e+11,4,0.0,0.0,0.0,0.0,0.0,29.5019157088,0.0,0.0,99.605384492,10.3640992963,3.75904236383
+44,39799180,123150.000095,148.238095238,132741.318404,21.7142857143,446.9,02:03.1,02:12.7,473.53595608,148.603267434,365.643684,1.37421768707,627.19902,0.56297996655,446.9,1.85328185328,3252,50.0,191293.118277,03:11.2,02:12.7,0,148,0,0,0,0,0,132741.318404,1.2586e+11,4,0.0,0.0,0.0,0.0,0.0,29.1338582677,0.0,0.0,100.698106743,10.408055035,3.76672467933
+45,39799181,125670.000076,148.714285714,132116.286996,21.9523809524,456.9,02:05.6,02:12.1,480.02140032,156.448327748,339.399186,1.37891156463,636.985104,0.552002776041,456.9,1.84380952381,3252,50.0,191293.118277,03:11.2,02:12.1,0,149,0,0,0,0,0,132116.286996,1.2827e+11,4,0.0,0.0,0.0,0.0,0.0,29.4117647059,0.0,0.0,97.0125766755,10.3438750147,3.78454474744
+46,39799182,128490.00001,149.285714286,131446.06373,22.0476190476,467.6,02:08.4,02:11.4,480.97186692,155.223848632,342.068118,1.38394557823,624.97491,0.553015355989,467.6,1.86486486486,3252,50.0,191293.118277,03:11.2,02:11.4,0,149,0,0,0,0,0,131446.06373,1.3133e+11,4,0.0,0.0,0.0,0.0,0.0,29.2490118577,0.0,0.0,99.2811596511,10.3517070508,3.80384155913
+47,39799183,131369.999886,149.761904762,131579.319767,21.5714285714,478.5,02:11.3,02:11.5,468.43309124,155.590518989,351.854202,1.38789115646,628.978308,0.551216571488,478.5,1.80333951763,3252,50.0,191293.118277,03:11.2,02:11.5,0,150,0,0,0,0,0,131579.319767,1.3423e+11,4,0.0,0.0,0.0,0.0,0.0,28.624535316,0.0,0.0,98.7465666185,10.5695065097,3.79998924517
+48,39799184,134190.000057,150.047619048,132379.219894,21.380952381,489.0,02:14.1,02:12.3,470.22868938,154.370525725,329.16828,1.38278911565,575.599668,0.565640526729,489.0,1.84761904762,3252,50.0,191293.118277,03:11.2,02:12.3,0,150,0,0,0,0,0,132379.219894,1.3698e+11,4,0.0,0.0,0.0,0.0,0.0,28.9575289575,0.0,0.0,97.7336703229,10.5992318221,3.77702784771
+49,39799185,136799.999952,150.047619048,132686.986271,21.380952381,499.1,02:16.8,02:12.6,472.07330872,148.366134605,337.619898,1.37421768707,615.633648,0.55548126898,499.1,1.78849721707,3252,50.0,191293.118277,03:11.2,02:12.6,0,150,0,0,0,0,0,132686.986271,1.3944e+11,4,0.0,0.0,0.0,0.0,0.0,29.5019157088,0.0,0.0,100.983000825,10.5746469908,3.7682670626
+50,39799186,139710.000038,149.666666667,132806.105783,21.5714285714,510.0,02:19.7,02:12.8,463.49638406,150.748843213,351.854202,1.35707482993,620.971512,0.552332697655,510.0,1.82818532819,3252,50.0,191293.118277,03:11.2,02:12.8,0,150,0,0,0,0,0,132806.105783,1.4262e+11,4,0.0,0.0,0.0,0.0,0.0,28.6821705426,0.0,0.0,99.1196886936,10.47187152,3.7648871417
+51,39799187,142319.999933,149.428571429,132924.920461,21.9523809524,519.9,02:22.3,02:12.9,467.38403756,152.79409112,351.40938,1.34034013605,670.791576,0.553274143388,519.9,1.86706349206,3252,50.0,191293.118277,03:11.2,02:12.9,0,149,0,0,0,0,0,132924.920461,1.4491e+11,4,0.0,0.0,0.0,0.0,0.0,28.125,0.0,0.0,97.5309057756,10.2809492407,3.76152190474
+52,39799188,145200.000048,149.0,132760.275263,22.0952380952,530.6,02:25.2,02:12.7,452.0791045,151.2284256,329.16828,1.33054421769,567.592872,0.55928136473,530.6,1.81604696673,3252,50.0,191293.118277,03:11.2,02:12.7,0,149,0,0,0,0,0,132760.275263,1.4807e+11,4,0.0,0.0,0.0,0.0,0.0,28.6274509804,0.0,0.0,98.9077177669,10.2271452662,3.76618682818
+53,39799189,147869.999886,148.666666667,133445.996984,22.0,540.8,02:27.8,02:13.4,441.90542016,147.774406503,347.405982,1.33142857143,610.740606,0.57052466683,540.8,1.81996086106,3252,50.0,191293.118277,03:11.2,02:13.4,0,149,0,0,0,0,0,133445.996984,1.5058e+11,4,0.0,0.0,0.0,0.0,0.0,28.9682539683,0.0,0.0,99.6671795686,10.2186382092,3.74683401003
+54,39799190,150569.999933,148.285714286,133974.160675,22.0,550.8,02:30.5,02:13.9,439.90544598,148.8406528,310.930578,1.33653061224,547.575882,0.579100196408,550.8,1.81081081081,3252,50.0,191293.118277,03:11.2,02:13.9,0,148,0,0,0,0,0,133974.160675,1.5324e+11,4,0.0,0.0,0.0,0.0,0.0,29.8387096774,0.0,0.0,97.7875000321,10.1783534733,3.73206294022
+55,39799191,153210.000038,147.714285714,133996.497711,22.0,560.8,02:33.2,02:13.9,447.03488354,144.373384534,338.06472,1.34952380952,574.265202,0.563329080487,560.8,1.8,3252,50.0,191293.118277,03:11.2,02:13.9,0,148,0,0,0,0,0,133996.497711,1.5589e+11,4,0.0,0.0,0.0,0.0,0.0,30.1204819277,0.0,0.0,100.762878325,10.1766567555,3.73144081033
+56,39799192,155910.000086,147.238095238,133634.43276,22.0,571.0,02:35.9,02:13.6,445.222945,149.078290838,333.171678,1.35891156463,610.295784,0.562404477497,571.0,1.80761904762,3252,50.0,191293.118277,03:11.2,02:13.6,0,147,0,0,0,0,0,133634.43276,1.586e+11,4,0.0,0.0,0.0,0.0,0.0,30.0,0.0,0.0,98.3781192719,10.2042290708,3.74155065931
+57,39799193,158460.000038,147.047619048,133400.917518,21.9047619048,580.7,02:38.4,02:13.4,456.42734546,150.270275814,330.502746,1.36496598639,607.18203,0.554919999296,580.7,1.82666666667,3252,50.0,191293.118277,03:11.2,02:13.4,0,147,0,0,0,0,0,133400.917518,1.6102e+11,4,0.0,0.0,0.0,0.0,0.0,30.0,0.0,0.0,98.1111826798,10.2665352149,3.74810015781
+58,39799194,161250.0,146.904761905,132778.406555,22.0476190476,591.2,02:41.2,02:12.7,447.8955082,150.748843213,325.164882,1.36598639456,564.034296,0.554629386616,591.2,1.81904761905,3252,50.0,191293.118277,03:11.2,02:12.7,0,147,0,0,0,0,0,132778.406555,1.6404e+11,4,0.0,0.0,0.0,0.0,0.0,30.2419354839,0.0,0.0,99.1817344353,10.247834569,3.76567254399
+59,39799195,163950.000048,147.0,132807.06861,22.4285714286,601.4,02:43.9,02:12.8,451.54855592,150.270275814,338.954364,1.36346938776,613.85436,0.570959970779,601.4,1.79511278195,3252,50.0,191293.118277,03:11.2,02:12.8,0,147,0,0,0,0,0,132807.06861,1.6664e+11,4,0.0,0.0,0.0,0.0,0.0,30.4,0.0,0.0,99.4331936049,10.0715995905,3.76485984694
+60,39799196,166619.999886,147.0,132572.347555,22.619047619,611.4,02:46.6,02:12.5,457.20073054,153.277999204,324.72006,1.35414965986,551.134458,0.586617053679,611.4,1.85518590998,3252,50.0,191293.118277,03:11.2,02:12.5,0,147,0,0,0,0,0,132572.347555,1.6927e+11,4,0.0,0.0,0.0,0.0,0.0,29.5546558704,0.0,0.0,98.0007459534,10.0044678542,3.77152557995
+61,39799197,169380.000114,146.904761905,132377.004331,22.5238095238,621.8,02:49.3,02:12.3,462.75156442,151.108434789,352.743846,1.34925170068,590.278794,0.589285589269,621.8,1.82432432432,3252,50.0,191293.118277,03:11.2,02:12.3,0,147,0,0,0,0,0,132377.004331,1.7212e+11,4,0.0,0.0,0.0,0.0,0.0,29.0196078431,0.0,0.0,99.8485335066,10.0615956434,3.77709106295
+62,39799198,172049.999952,147.047619048,132122.128079,22.4761904762,632.1,02:52.0,02:12.1,470.00379706,154.8577548,350.519736,1.34394557823,582.71682,0.595205660521,632.1,1.85912698413,3252,50.0,191293.118277,03:11.2,02:12.1,0,147,0,0,0,0,0,132122.128079,1.7475e+11,4,0.0,0.0,0.0,0.0,0.0,28.6852589641,0.0,0.0,97.9960127045,10.1023634884,3.78437743374
+63,39799199,174720.000029,147.333333333,131614.148435,22.380952381,642.3,02:54.7,02:11.6,480.06373406,154.127294899,349.18527,1.34401360544,607.626852,0.589862706687,642.3,1.82239382239,3252,50.0,191293.118277,03:11.2,02:11.6,0,147,0,0,0,0,0,131614.148435,1.7739e+11,4,0.0,0.0,0.0,0.0,0.0,29.718875502,0.0,0.0,99.6049114541,10.1845094001,3.79898366511
+64,39799200,177299.999952,147.571428571,130772.700382,22.6666666667,652.0,02:57.3,02:10.7,480.81046008,157.3092836,366.088506,1.34333333333,620.52669,0.586295170744,652.0,1.8893360161,3252,50.0,191293.118277,03:11.2,02:10.7,0,148,0,0,0,0,0,130772.700382,1.798e+11,4,0.0,0.0,0.0,0.0,0.0,28.8617886179,0.0,0.0,99.486102197,10.120838737,3.82342796731
+65,39799201,180180.000067,148.0,130148.629,22.9047619048,662.7,03:00.1,02:10.1,485.54760256,162.163914945,357.636888,1.34693877551,607.18203,0.583353561525,662.7,1.87301587302,3252,50.0,191293.118277,03:11.2,02:10.1,0,148,0,0,0,0,0,130148.629,1.8297e+11,4,0.0,0.0,0.0,0.0,0.0,29.0322580645,0.0,0.0,97.9027816141,10.063658141,3.84176156016
+66,39799202,182670.000076,148.428571429,129649.404112,22.7619047619,673.1,03:02.6,02:09.6,489.00093428,162.541430374,362.52993,1.34544217687,621.861156,0.587668878441,673.1,1.8893360161,3252,50.0,191293.118277,03:11.2,02:09.6,0,148,0,0,0,0,0,129649.404112,1.8535e+11,4,0.0,0.0,0.0,0.0,0.0,28.5140562249,0.0,0.0,98.8080644551,10.1658132625,3.85655455513
+67,39799203,185430.000067,148.571428571,129434.345963,22.2380952381,683.6,03:05.4,02:09.4,483.88687324,162.793432547,360.30582,1.34448979592,622.305978,0.579260719162,683.6,1.87698412698,3252,50.0,191293.118277,03:11.2,02:09.4,0,149,0,0,0,0,0,129434.345963,1.8813e+11,4,0.0,0.0,0.0,0.0,0.0,28.8,0.0,0.0,99.1476815574,10.4225535544,3.86296230944
+68,39799204,188039.999962,149.0,129521.611571,22.1904761905,693.8,03:08.0,02:09.5,488.07812532,162.163914945,366.088506,1.33972789116,626.754198,0.574143842725,693.8,1.88329979879,3252,50.0,191293.118277,03:11.2,02:09.5,0,149,0,0,0,0,0,129521.611571,1.9069e+11,4,0.0,0.0,0.0,0.0,0.0,28.6290322581,0.0,0.0,99.3315255298,10.4378822505,3.86035962599
+69,39799205,190589.999914,149.333333333,129450.495129,22.0952380952,703.8,03:10.5,02:09.4,485.5135298,163.930665884,355.412778,1.33823129252,634.316172,0.577472776375,703.8,1.85714285714,3252,50.0,191293.118277,03:11.2,02:09.4,0,149,0,0,0,0,0,129450.495129,1.9313e+11,4,0.0,0.0,0.0,0.0,0.0,28.9156626506,0.0,0.0,98.4230215789,10.4886321163,3.8624803984
+70,39799206,193410.000086,149.714285714,129612.827283,22.4761904762,714.7,03:13.4,02:09.6,476.80902898,162.163914945,371.42637,1.33734693878,640.988502,0.575938050313,714.7,1.93581780538,3252,50.0,191293.118277,03:11.2,02:09.6,0,150,0,0,0,0,0,129612.827283,1.9624e+11,4,0.0,0.0,0.0,0.0,0.0,27.380952381,0.0,0.0,99.1219578243,10.2979449696,3.85764287749
+71,39799207,196079.999924,150.285714286,130078.623324,22.4761904762,724.9,03:16.0,02:10.0,475.99809124,162.415526871,346.516338,1.34476190476,588.944328,0.570178181642,724.9,1.84344422701,3252,50.0,191293.118277,03:11.2,02:10.0,0,150,0,0,0,0,0,130078.623324,1.9874e+11,4,0.0,0.0,0.0,0.0,0.0,29.5546558704,0.0,0.0,97.9090199034,10.2610692564,3.84382911828
+72,39799208,198779.999971,150.857142857,130276.140264,22.619047619,735.2,03:18.7,02:10.2,482.79696856,158.792546326,344.73705,1.35265306122,619.637046,0.57022048833,735.2,1.85127201566,3252,50.0,191293.118277,03:11.2,02:10.2,0,151,0,0,0,0,0,130276.140264,2.0146e+11,4,0.0,0.0,0.0,0.0,0.0,29.3172690763,0.0,0.0,99.6880916192,10.1808035361,3.83800133306
+73,39799209,201450.000048,150.904761905,130062.562971,22.4761904762,745.4,03:21.4,02:10.0,482.64500284,158.420860413,367.422972,1.35972789116,657.891738,0.565853991617,745.4,1.86692759295,3252,50.0,191293.118277,03:11.2,02:10.0,0,151,0,0,0,0,0,130062.562971,2.041e+11,4,0.0,0.0,0.0,0.0,0.0,29.5546558704,0.0,0.0,100.41503713,10.2623363112,3.84430376103
+74,39799210,204150.000095,150.761904762,129931.8979,22.380952381,756.0,03:24.1,02:09.9,486.11307118,164.310917277,362.52993,1.36333333333,631.64724,0.564496229892,756.0,1.89484126984,3252,50.0,191293.118277,03:11.2,02:09.9,0,151,0,0,0,0,0,129931.8979,2.0687e+11,4,0.0,0.0,0.0,0.0,0.0,28.4584980237,0.0,0.0,97.1078363282,10.3163699875,3.84816975723
+75,39799211,206789.999962,150.333333333,129650.504848,22.3333333333,766.3,03:26.7,02:09.6,488.3475301,163.171923972,346.516338,1.36959183673,607.626852,0.568695078615,766.3,1.87084148728,3252,50.0,191293.118277,03:11.2,02:09.6,0,150,0,0,0,0,0,129650.504848,2.0946e+11,4,0.0,0.0,0.0,0.0,0.0,29.435483871,0.0,0.0,98.4237648367,10.3608048705,3.8565218129
+76,39799212,209430.000067,150.047619048,129513.21174,22.3333333333,776.5,03:29.4,02:09.5,483.68482722,160.909752581,349.630092,1.37387755102,621.416334,0.56235824624,776.5,1.85328185328,3252,50.0,191293.118277,03:11.2,02:09.5,0,150,0,0,0,0,0,129513.21174,2.1206e+11,4,0.0,0.0,0.0,0.0,0.0,30.2040816327,0.0,0.0,100.125213958,10.3717880519,3.86060999709
+77,39799213,212069.999933,149.904761905,129546.612475,22.2857142857,786.9,03:32.0,02:09.5,484.31314586,162.91953125,361.640286,1.3762585034,648.105654,0.558736076474,786.9,1.92261904762,3252,50.0,191293.118277,03:11.2,02:09.5,0,150,0,0,0,0,0,129546.612475,2.1474e+11,4,0.0,0.0,0.0,0.0,0.0,29.1497975709,0.0,0.0,98.813597128,10.3912701416,3.85961462402
+78,39799214,214740.00001,150.0,129255.687853,22.7142857143,797.2,03:34.7,02:09.2,495.94269932,164.564744602,354.078312,1.37952380952,640.54368,0.564905581725,797.2,1.85907335907,3252,50.0,191293.118277,03:11.2,02:09.2,0,150,0,0,0,0,0,129255.687853,2.174e+11,4,0.0,0.0,0.0,0.0,0.0,29.95951417,0.0,0.0,98.4877588075,10.2181554941,3.86830172276
+79,39799215,217440.000057,150.0,128834.383844,22.6666666667,807.8,03:37.4,02:08.8,505.17584234,165.582667981,359.416176,1.3762585034,618.747402,0.573836119165,807.8,1.85328185328,3252,50.0,191293.118277,03:11.2,02:08.8,0,150,0,0,0,0,0,128834.383844,2.2014e+11,4,0.0,0.0,0.0,0.0,0.0,29.4820717131,0.0,0.0,98.8457074571,10.2731070098,3.88095153703
+80,39799216,220140.000105,149.904761905,128443.049826,22.5714285714,818.2,03:40.1,02:08.4,498.49600786,166.0932,378.543522,1.3662585034,646.771188,0.575927300163,818.2,1.96734693878,3252,50.0,191293.118277,03:11.2,02:08.4,0,150,0,0,0,0,0,128443.049826,2.2282e+11,4,0.0,0.0,0.0,0.0,0.0,27.7777777778,0.0,0.0,99.4453234055,10.3478851199,3.89277583084
+81,39799217,222690.000057,150.047619048,128455.953168,22.8571428571,828.4,03:42.6,02:08.4,505.13326652,167.888324643,373.65048,1.35843537415,653.88834,0.573408655065,828.4,1.85518590998,3252,50.0,191293.118277,03:11.2,02:08.4,0,150,0,0,0,0,0,128455.953168,2.2526e+11,4,0.0,0.0,0.0,0.0,0.0,28.6274509804,0.0,0.0,98.3523725736,10.2175101086,3.89238480327
+82,39799218,225480.000019,150.238095238,128266.252205,22.6666666667,839.2,03:45.4,02:08.2,509.2093793,169.049136108,354.523134,1.34931972789,640.54368,0.559644362835,839.2,1.86706349206,3252,50.0,191293.118277,03:11.2,02:08.2,0,150,0,0,0,0,0,128266.252205,2.2827e+11,4,0.0,0.0,0.0,0.0,0.0,28.9156626506,0.0,0.0,98.111038479,10.318609837,3.89814149399
+83,39799219,228119.999886,150.714285714,127899.526566,22.5238095238,849.6,03:48.1,02:07.8,505.09202214,165.582667981,395.001936,1.34285714286,705.932514,0.556293456915,849.6,1.98109243697,3252,50.0,191293.118277,03:11.2,02:07.8,0,151,0,0,0,0,0,127899.526566,2.3077e+11,4,0.0,0.0,0.0,0.0,0.0,27.6422764228,0.0,0.0,101.029070581,10.4138297132,3.90931861457
+84,39799220,230789.999962,151.285714286,127694.761218,22.3333333333,860.1,03:50.7,02:07.6,507.87618422,171.778477875,380.767632,1.34761904762,688.139634,0.559973575253,860.1,1.89134808853,3252,50.0,191293.118277,03:11.2,02:07.6,0,151,0,0,0,0,0,127694.761218,2.3344e+11,4,0.0,0.0,0.0,0.0,0.0,28.5140562249,0.0,0.0,97.8543312318,10.5194885779,3.91558741512
+85,39799221,233369.999886,151.761904762,127607.773874,22.1904761905,870.3,03:53.3,02:07.6,504.33697462,171.778477875,364.309218,1.34979591837,627.19902,0.577271613127,870.3,1.875,3252,50.0,191293.118277,03:11.2,02:07.6,0,152,0,0,0,0,0,127607.773874,2.3595e+11,4,0.0,0.0,0.0,0.0,0.0,28.8,0.0,0.0,98.0545829537,10.5944276703,3.91825658281
+86,39799222,236160.000086,151.952380952,127739.601229,22.1904761905,881.1,03:56.1,02:07.7,493.34893316,168.6616064,367.422972,1.34544217687,632.536884,0.586842804464,881.1,1.88293650794,3252,50.0,191293.118277,03:11.2,02:07.7,0,152,0,0,0,0,0,127739.601229,2.3894e+11,4,0.0,0.0,0.0,0.0,0.0,28.8,0.0,0.0,99.5577662158,10.5834942138,3.91421293937
+87,39799223,238890.000105,152.0,128505.455385,22.3333333333,891.7,03:58.8,02:08.5,490.76887478,166.860963965,362.52993,1.34027210884,596.06148,0.587689763157,891.7,1.91020408163,3252,50.0,191293.118277,03:11.2,02:08.5,0,152,0,0,0,0,0,128505.455385,2.4163e+11,4,0.0,0.0,0.0,0.0,0.0,27.4509803922,0.0,0.0,98.8436106307,10.4531249515,3.89088539861
+88,39799224,241559.999943,151.952380952,129358.03767,22.380952381,902.1,04:01.5,02:09.3,494.78014038,163.677491155,378.0987,1.3374829932,660.56067,0.58515412607,902.1,1.9,3252,50.0,191293.118277,03:11.2,02:09.3,0,152,0,0,0,0,0,129358.03767,2.4423e+11,4,0.0,0.0,0.0,0.0,0.0,27.4509803922,0.0,0.0,98.786779712,10.3621356358,3.86524107049
+89,39799225,244470.000029,152.380952381,129936.460364,22.0952380952,913.1,04:04.4,02:09.9,486.94870108,161.160065867,359.416176,1.34183673469,633.426528,0.575341883987,913.1,1.8893360161,3252,50.0,191293.118277,03:11.2,02:09.9,0,152,0,0,0,0,0,129936.460364,2.4735e+11,4,0.0,0.0,0.0,0.0,0.0,27.519379845,0.0,0.0,98.9959693609,10.4494044003,3.8480346363
+90,39799226,247259.99999,152.904761905,130664.59819,21.5714285714,923.9,04:07.2,02:10.6,487.4082597,157.802673571,365.198862,1.35659863946,622.305978,0.567196893235,923.9,1.86105675147,3252,50.0,191293.118277,03:11.2,02:10.6,0,153,0,0,0,0,0,130664.59819,2.5006e+11,4,0.0,0.0,0.0,0.0,0.0,27.969348659,0.0,0.0,99.4214002682,10.6434986683,3.82659118788
+91,39799227,250079.999924,153.666666667,131151.327866,21.3333333333,934.6,04:10.0,02:11.1,485.51861348,158.297094122,339.844008,1.36782312925,610.295784,0.576619566674,934.6,1.82476190476,3252,50.0,191293.118277,03:11.2,02:11.1,0,154,0,0,0,0,0,131151.327866,2.5291e+11,4,0.0,0.0,0.0,0.0,0.0,28.4090909091,0.0,0.0,98.0114977086,10.7223466425,3.81238991732
+92,39799228,252900.000095,154.285714286,131618.222937,21.0476190476,945.4,04:12.9,02:11.6,475.58301482,153.884319702,362.52993,1.3680952381,615.188826,0.592352808406,945.4,1.88258317025,3252,50.0,191293.118277,03:11.2,02:11.6,0,154,0,0,0,0,0,131618.222937,2.5572e+11,4,0.0,0.0,0.0,0.0,0.0,27.7566539924,0.0,0.0,99.752917618,10.829346687,3.79886606006
+93,39799229,255690.000057,154.80952381,132270.744011,20.9047619048,956.0,04:15.6,02:12.2,476.33364438,154.49223704,350.964558,1.36156462585,579.603066,0.5943440039,956.0,1.83783783784,3252,50.0,191293.118277,03:11.2,02:12.2,0,155,0,0,0,0,0,132270.744011,2.5849e+11,4,0.0,0.0,0.0,0.0,0.0,28.3524904215,0.0,0.0,97.8971375061,10.8495626707,3.78012540669
+94,39799230,258569.999933,155.285714286,132463.992308,21.0,966.7,04:18.5,02:12.4,483.659197,151.709024051,333.171678,1.35401360544,546.241416,0.595762918594,966.7,1.7980952381,3252,50.0,191293.118277,03:11.2,02:12.4,0,155,0,0,0,0,0,132463.992308,2.614e+11,4,0.0,0.0,0.0,0.0,0.0,28.4090909091,0.0,0.0,99.2574491048,10.7846019411,3.77461067939
+95,39799231,261329.999924,155.761904762,132090.300118,21.0,977.4,04:21.3,02:12.0,481.98781616,150.389822568,380.32281,1.34789115646,681.912126,0.571103232794,977.4,1.875,3252,50.0,191293.118277,03:11.2,02:12.0,0,156,0,0,0,0,0,132090.300118,2.6413e+11,4,0.0,0.0,0.0,0.0,0.0,27.5862068966,0.0,0.0,100.980337209,10.8151122928,3.78528930249
+96,39799232,264150.000095,155.952380952,131898.866612,21.0,988.1,04:24.1,02:11.8,482.59095848,157.062974746,357.636888,1.35081632653,636.985104,0.558185758971,988.1,1.85127201566,3252,50.0,191293.118277,03:11.2,02:11.8,0,156,0,0,0,0,0,131898.866612,2.6697e+11,4,0.0,0.0,0.0,0.0,0.0,27.7566539924,0.0,0.0,97.1115832126,10.8308089771,3.79078314198
+97,39799233,266970.000029,156.095238095,131929.48876,21.0952380952,998.8,04:26.9,02:11.9,482.413998,155.223848632,350.074914,1.35741496599,650.329764,0.562355052214,998.8,1.82818532819,3252,50.0,191293.118277,03:11.2,02:11.9,0,156,0,0,0,0,0,131929.48876,2.6979e+11,4,0.0,0.0,0.0,0.0,0.0,28.1368821293,0.0,0.0,98.1937754828,10.7794088307,3.78990326349
+98,39799234,269880.000114,156.0,132543.540936,20.8571428571,1009.6,04:29.8,02:12.5,465.7281801,151.2284256,338.06472,1.36204081633,567.14805,0.580949267827,1009.6,1.82285714286,3252,50.0,191293.118277,03:11.2,02:12.5,0,156,0,0,0,0,0,132543.540936,2.7276e+11,4,0.0,0.0,0.0,0.0,0.0,27.9850746269,0.0,0.0,99.3937113439,10.8519521526,3.77234527211
+99,39799235,272789.999962,156.095238095,133744.221874,20.8095238095,1020.6,04:32.7,02:13.7,466.41831992,147.420125978,347.405982,1.36789115646,583.161642,0.57806732818,1020.6,1.82476190476,3252,50.0,191293.118277,03:11.2,02:13.7,0,156,0,0,0,0,0,133744.221874,2.7573e+11,4,0.0,0.0,0.0,0.0,0.0,27.2727272727,0.0,0.0,99.2398687646,10.7791392933,3.73847926283
+100,39799236,275730.000019,155.952380952,134547.664928,20.5238095238,1031.5,04:35.7,02:14.5,473.61435974,145.189490569,338.509542,1.37292517007,591.61326,0.57139299945,1031.5,1.77551020408,3252,50.0,191293.118277,03:11.2,02:14.5,0,156,0,0,0,0,0,134547.664928,2.7864e+11,4,0.0,0.0,0.0,0.0,0.0,28.3088235294,0.0,0.0,98.9701817819,10.8639338939,3.7161551653
+101,39799237,278670.000076,155.666666667,134591.850827,20.5238095238,1042.5,04:38.6,02:14.5,480.52150734,144.489783388,349.18527,1.37204081633,657.446916,0.553762484655,1042.5,1.83428571429,3252,50.0,191293.118277,03:11.2,02:14.5,0,156,0,0,0,0,0,134591.850827,2.8163e+11,4,0.0,0.0,0.0,0.0,0.0,27.2727272727,0.0,0.0,99.3515411645,10.8603673133,3.71493516828
+102,39799238,281549.999952,155.333333333,134423.247406,20.4761904762,1053.3,04:41.5,02:14.4,472.94803454,144.606244787,356.747244,1.36782312925,633.87135,0.563911081988,1053.3,1.82857142857,3252,50.0,191293.118277,03:11.2,02:14.4,0,155,0,0,0,0,0,134423.247406,2.8444e+11,4,0.0,0.0,0.0,0.0,0.0,27.7777777778,0.0,0.0,99.6455359429,10.8992775233,3.71959471034
+103,39799239,284460.000038,155.047619048,134984.759451,20.380952381,1064.1,04:44.4,02:14.9,468.36794146,147.302158424,344.73705,1.35897959184,590.723616,0.58176866823,1064.1,1.76252319109,3252,50.0,191293.118277,03:11.2,02:14.9,0,155,0,0,0,0,0,134984.759451,2.8736e+11,4,0.0,0.0,0.0,0.0,0.0,28.3088235294,0.0,0.0,96.6061384746,10.9046578503,3.70412187296
+104,39799240,287490.00001,154.904761905,135735.508722,20.3333333333,1075.3,04:47.4,02:15.7,468.37251072,142.288881459,330.502746,1.34503401361,531.117468,0.602317043727,1075.3,1.79428571429,3252,50.0,191293.118277,03:11.2,02:15.7,0,155,0,0,0,0,0,135735.508722,2.9054e+11,4,0.0,0.0,0.0,0.0,0.0,26.6903914591,0.0,0.0,98.3595773926,10.8697410866,3.68363447936
+105,39799241,290430.000067,155.0,135982.562299,20.4285714286,1086.1,04:50.4,02:15.9,469.90348516,135.932254618,356.747244,1.33870748299,605.847564,0.602943727733,1086.1,1.78285714286,3252,50.0,191293.118277,03:11.2,02:15.9,0,155,0,0,0,0,0,135982.562299,2.9336e+11,4,0.0,0.0,0.0,0.0,0.0,26.4084507042,0.0,0.0,102.399034847,10.7994101869,3.67694203982
+106,39799242,293519.999981,155.0,136032.213736,20.2380952381,1097.5,04:53.5,02:16.0,476.17202572,140.910419686,370.981548,1.34136054422,621.416334,0.591585810569,1097.5,1.80308880309,3252,50.0,191293.118277,03:11.2,02:16.0,0,155,0,0,0,0,0,136032.213736,2.9661e+11,4,0.0,0.0,0.0,0.0,0.0,26.4285714286,0.0,0.0,98.673296846,10.8970728364,3.67559996467
+107,39799243,296460.000038,155.0,135481.330839,20.2857142857,1108.5,04:56.4,02:15.4,482.15046366,145.657214744,346.96116,1.34870748299,598.730412,0.581032083517,1108.5,1.80380952381,3252,50.0,191293.118277,03:11.2,02:15.4,0,155,0,0,0,0,0,135481.330839,2.9942e+11,4,0.0,0.0,0.0,0.0,0.0,27.1739130435,0.0,0.0,96.6268186374,10.9156976115,3.69054538292
+108,39799244,299339.999914,155.0,134935.69799,20.0476190476,1119.2,04:59.3,02:14.9,476.637364,142.63489588,347.405982,1.35278911565,609.850962,0.577901402085,1119.2,1.80952380952,3252,50.0,191293.118277,03:11.2,02:14.9,0,155,0,0,0,0,0,134935.69799,3.022e+11,4,0.0,0.0,0.0,0.0,0.0,27.1739130435,0.0,0.0,99.8761229337,11.0900012149,3.70546865988
+109,39799245,302460.000038,155.0,135043.604152,20.0476190476,1130.6,05:02.4,02:15.0,468.32061482,142.63489588,353.63349,1.34972789116,602.288988,0.576596521567,1130.6,1.78007518797,3252,50.0,191293.118277,03:11.2,02:15.0,0,155,0,0,0,0,0,135043.604152,3.0557e+11,4,0.0,0.0,0.0,0.0,0.0,27.0462633452,0.0,0.0,99.636897092,11.0811397846,3.70250781692
+110,39799246,305400.000095,155.095238095,135598.957647,20.2857142857,1141.3,05:05.4,02:15.5,466.61609928,142.63489588,350.074914,1.34136054422,615.188826,0.57950500723,1141.3,1.80694980695,3252,50.0,191293.118277,03:11.2,02:15.5,0,155,0,0,0,0,0,135598.957647,3.0828e+11,4,0.0,0.0,0.0,0.0,0.0,27.4074074074,0.0,0.0,98.4176977661,10.9062286695,3.68734397873
+111,39799247,308339.999914,154.952380952,135967.371232,20.2380952381,1152.4,05:08.3,02:15.9,467.18544118,142.288881459,342.51294,1.3368707483,584.496108,0.574952299315,1152.4,1.80115830116,3252,50.0,191293.118277,03:11.2,02:15.9,0,155,0,0,0,0,0,135967.371232,3.1135e+11,4,0.0,0.0,0.0,0.0,0.0,26.334519573,0.0,0.0,97.8572429727,10.9022696236,3.67735284921
+112,39799248,311309.999943,154.761904762,135961.143967,20.3333333333,1163.3,05:11.3,02:15.9,472.28473534,138.4064164,350.519736,1.33816326531,616.968114,0.565898195666,1163.3,1.81081081081,3252,50.0,191293.118277,03:11.2,02:15.9,0,155,0,0,0,0,0,135961.143967,3.1427e+11,4,0.0,0.0,0.0,0.0,0.0,26.714801444,0.0,0.0,100.616079279,10.8517021335,3.67752127858
+113,39799249,314099.999905,154.380952381,135472.697606,20.4761904762,1173.8,05:14.1,02:15.4,476.19886634,140.6815452,361.195464,1.34476190476,652.553874,0.567410171149,1173.8,1.79428571429,3252,50.0,191293.118277,03:11.2,02:15.4,0,154,0,0,0,0,0,135472.697606,3.169e+11,4,0.0,0.0,0.0,0.0,0.0,26.9784172662,0.0,0.0,100.063474348,10.8148453892,3.69078056934
+114,39799250,317039.999962,153.571428571,135069.827373,20.5714285714,1184.8,05:17.0,02:15.0,476.06675118,146.125942348,356.302422,1.34918367347,628.533486,0.568519165753,1184.8,1.8,3252,50.0,191293.118277,03:11.2,02:15.0,0,154,0,0,0,0,0,135069.827373,3.1997e+11,4,0.0,0.0,0.0,0.0,0.0,27.6752767528,0.0,0.0,97.199870211,10.7968845574,3.7017889911
+115,39799251,320039.999962,153.047619048,134758.406653,20.9523809524,1195.8,05:20.0,02:14.7,466.5308266,146.008666317,338.509542,1.35210884354,581.827176,0.566821772936,1195.8,1.82818532819,3252,50.0,191293.118277,03:11.2,02:14.7,0,153,0,0,0,0,0,134758.406653,3.2304e+11,4,0.0,0.0,0.0,0.0,0.0,27.4074074074,0.0,0.0,97.9539172087,10.6250750315,3.7103436618
+116,39799252,322980.000019,152.666666667,135247.376024,21.0952380952,1206.6,05:22.9,02:15.2,450.82037928,141.368913101,338.06472,1.35523809524,596.06148,0.563176694837,1206.6,1.77819548872,3252,50.0,191293.118277,03:11.2,02:15.2,0,152,0,0,0,0,0,135247.376024,3.2589e+11,4,0.0,0.0,0.0,0.0,0.0,27.9411764706,0.0,0.0,100.075456865,10.514968482,3.69692939485
+117,39799253,325950.000048,152.380952381,136052.446984,21.0,1217.3,05:25.9,02:16.0,459.2995944,141.02494996,331.39239,1.35605442177,616.523292,0.556395600922,1217.3,1.78759398496,3252,50.0,191293.118277,03:11.2,02:16.0,0,153,0,0,0,0,0,136052.446984,3.2886e+11,4,0.0,0.0,0.0,0.0,0.0,28.0442804428,0.0,0.0,98.549180766,10.5001524062,3.67505334217
+118,39799254,328710.000038,152.142857143,135654.45421,21.0952380952,1227.8,05:28.7,02:15.6,465.51163954,139.654676675,333.171678,1.35632653061,600.064878,0.553329814852,1227.8,1.78759398496,3252,50.0,191293.118277,03:11.2,02:15.6,0,152,0,0,0,0,0,135654.45421,3.3157e+11,4,0.0,0.0,0.0,0.0,0.0,28.4644194757,0.0,0.0,100.394607355,10.4834146762,3.68583547744
+119,39799255,331589.999914,151.80952381,135173.649715,20.8571428571,1238.7,05:31.5,02:15.1,464.95415956,142.519495485,373.205658,1.35496598639,667.233,0.543275865074,1238.7,1.82625482625,3252,50.0,191293.118277,03:11.2,02:15.1,0,152,0,0,0,0,0,135173.649715,3.3447e+11,4,0.0,0.0,0.0,0.0,0.0,27.6119402985,0.0,0.0,99.4300477765,10.6408029036,3.69894577127
+120,39799256,334500.0,151.333333333,135112.064898,20.7142857143,1249.5,05:34.5,02:15.1,466.40188874,148.721928541,328.278636,1.34945578231,595.616658,0.54902713476,1249.5,1.82818532819,3252,50.0,191293.118277,03:11.2,02:15.1,0,151,0,0,0,0,0,135112.064898,3.3743e+11,4,0.0,0.0,0.0,0.0,0.0,27.2058823529,0.0,0.0,95.4136790238,10.7190713365,3.70063177094
+121,39799257,337410.000086,150.904761905,134933.599238,20.7619047619,1260.1,05:37.4,02:14.9,464.5347257,140.795951439,336.730254,1.34741496599,648.105654,0.556663049463,1260.1,1.77255639098,3252,50.0,191293.118277,03:11.2,02:14.9,0,151,0,0,0,0,0,134933.599238,3.4029e+11,4,0.0,0.0,0.0,0.0,0.0,28.0442804428,0.0,0.0,101.185332369,10.7086310348,3.70552629458
+122,39799258,340319.999933,150.619047619,135170.211574,20.6666666667,1270.9,05:40.3,02:15.1,459.90080008,141.25419665,351.40938,1.35034013605,594.727014,0.561725982989,1270.9,1.79238095238,3252,50.0,191293.118277,03:11.2,02:15.1,0,151,0,0,0,0,0,135170.211574,3.4322e+11,4,0.0,0.0,0.0,0.0,0.0,27.7777777778,0.0,0.0,100.328357903,10.73914797,3.69903985633
+123,39799259,343230.000019,150.666666667,135602.343052,20.4285714286,1281.8,05:43.2,02:15.6,464.98638646,144.72276875,345.181872,1.35442176871,592.502904,0.569723096921,1281.8,1.85909980431,3252,50.0,191293.118277,03:11.2,02:15.6,0,150,0,0,0,0,0,135602.343052,3.4615e+11,4,0.0,0.0,0.0,0.0,0.0,26.7399267399,0.0,0.0,96.99058988,10.8296909587,3.68725192165
+124,39799260,346200.000048,150.714285714,135536.874693,20.4761904762,1292.7,05:46.2,02:15.5,467.51112956,142.173667796,342.068118,1.35965986395,613.85436,0.585593542607,1292.7,1.79323308271,3252,50.0,191293.118277,03:11.2,02:15.5,0,151,0,0,0,0,0,135536.874693,3.4917e+11,4,0.0,0.0,0.0,0.0,0.0,27.5362318841,0.0,0.0,98.8727185455,10.8097245298,3.68903297447
+125,39799261,349079.999924,150.761904762,135425.973283,20.4761904762,1303.4,05:49.0,02:15.4,466.74228348,140.910419686,331.837212,1.36217687075,572.485914,0.575030221445,1303.4,1.74542124542,3252,50.0,191293.118277,03:11.2,02:15.4,0,151,0,0,0,0,0,135425.973283,3.5198e+11,4,0.0,0.0,0.0,0.0,0.0,28.5714285714,0.0,0.0,100.004384112,10.8185766995,3.69205395302
+126,39799262,351990.00001,151.142857143,135481.539224,20.4285714286,1314.3,05:51.9,02:15.4,471.5936272,141.25419665,358.08171,1.36081632653,597.840768,0.576985128294,1314.3,1.78947368421,3252,50.0,191293.118277,03:11.2,02:15.4,0,151,0,0,0,0,0,135481.539224,3.5489e+11,4,0.0,0.0,0.0,0.0,0.0,27.9411764706,0.0,0.0,99.6383021711,10.8393473897,3.69053970648
+127,39799263,354960.000038,151.333333333,135051.927441,20.7619047619,1325.2,05:54.9,02:15.0,474.18336878,146.008666317,345.181872,1.35802721088,623.640444,0.572062929127,1325.2,1.83590733591,3252,50.0,191293.118277,03:11.2,02:15.0,0,151,0,0,0,0,0,135051.927441,3.5792e+11,4,0.0,0.0,0.0,0.0,0.0,26.714801444,0.0,0.0,97.3166274991,10.699248473,3.70227963033
+128,39799264,357869.999886,151.666666667,134819.049813,20.619047619,1336.1,05:57.8,02:14.8,467.4154777,142.865883521,348.295626,1.36115646259,608.071674,0.564547005389,1336.1,1.81333333333,3252,50.0,191293.118277,03:11.2,02:14.8,0,152,0,0,0,0,0,134819.049813,3.6078e+11,4,0.0,0.0,0.0,0.0,0.0,27.7777777778,0.0,0.0,99.9736911607,10.7919864439,3.70867470652
+129,39799265,360779.999971,151.952380952,135272.90821,20.5238095238,1346.9,06:00.7,02:15.2,455.47560794,144.373384534,335.84061,1.36503401361,610.740606,0.563426030056,1346.9,1.76437847866,3252,50.0,191293.118277,03:11.2,02:15.2,0,152,0,0,0,0,0,135272.90821,3.637e+11,4,0.0,0.0,0.0,0.0,0.0,28.0,0.0,0.0,97.937367391,10.8056887126,3.69623161517
+130,39799266,363690.000057,152.0,135946.220926,20.380952381,1357.4,06:03.6,02:15.9,458.91508058,141.25419665,320.716662,1.36170068027,550.244814,0.574332484059,1357.4,1.80639097744,3252,50.0,191293.118277,03:11.2,02:15.9,0,152,0,0,0,0,0,135946.220926,3.6655e+11,4,0.0,0.0,0.0,0.0,0.0,28.5714285714,0.0,0.0,98.6200609246,10.8275361154,3.67792496617
+131,39799267,366539.999962,152.142857143,135707.336479,20.5238095238,1368.1,06:06.5,02:15.7,453.16259406,138.18026217,342.51294,1.35258503401,590.278794,0.573720093413,1368.1,1.80952380952,3252,50.0,191293.118277,03:11.2,02:15.7,0,152,0,0,0,0,0,135707.336479,3.6945e+11,4,0.0,0.0,0.0,0.0,0.0,27.6752767528,0.0,0.0,101.34726938,10.7710973871,3.68439918557
+132,39799268,369450.000048,152.285714286,135871.183186,20.619047619,1379.0,06:09.4,02:15.8,455.26642056,141.943427083,352.299024,1.34517006803,610.295784,0.584665452957,1379.0,1.73283858998,3252,50.0,191293.118277,03:11.2,02:15.8,0,152,0,0,0,0,0,135871.183186,3.7236e+11,4,0.0,0.0,0.0,0.0,0.0,28.5185185185,0.0,0.0,98.3038859372,10.7084175161,3.67995617816
+133,39799269,372329.999924,152.333333333,135911.92446,20.7619047619,1389.5,06:12.3,02:15.9,454.40304224,144.72276875,323.385594,1.33952380952,565.813584,0.57809127753,1389.5,1.85714285714,3252,50.0,191293.118277,03:11.2,02:15.9,0,153,0,0,0,0,0,135911.92446,3.7519e+11,4,0.0,0.0,0.0,0.0,0.0,26.8656716418,0.0,0.0,96.3293202928,10.6315478511,3.67885306595
+134,39799270,375150.000095,152.380952381,136089.743077,20.5238095238,1399.9,06:15.1,02:16.0,446.34779998,137.615954692,339.399186,1.34727891156,568.927338,0.575237962562,1399.9,1.80380952381,3252,50.0,191293.118277,03:11.2,02:16.0,0,152,0,0,0,0,0,136089.743077,3.7798e+11,4,0.0,0.0,0.0,0.0,0.0,27.6752767528,0.0,0.0,100.907413543,10.7408310451,3.67404617493
+135,39799271,378089.999914,152.095238095,136630.270895,20.3333333333,1410.7,06:18.0,02:16.6,457.51715936,138.4064164,330.947568,1.36482993197,595.171836,0.572597794735,1410.7,1.74175824176,3252,50.0,191293.118277,03:11.2,02:16.6,0,152,0,0,0,0,0,136630.270895,3.8102e+11,4,0.0,0.0,0.0,0.0,0.0,28.1588447653,0.0,0.0,99.1450490667,10.7985574969,3.65951115171
+136,39799272,381150.000095,151.476190476,136418.047659,20.1904761905,1422.0,06:21.1,02:16.4,470.8275953,139.199899252,334.950966,1.37551020408,584.051286,0.576811197542,1422.0,1.76556776557,3252,50.0,191293.118277,03:11.2,02:16.4,0,152,0,0,0,0,0,136418.047659,3.8423e+11,4,0.0,0.0,0.0,0.0,0.0,28.1588447653,0.0,0.0,99.0406846396,10.8918803787,3.66520419093
+137,39799273,384029.999971,151.476190476,135619.718841,20.0952380952,1432.8,06:24.0,02:15.6,468.96106772,141.02494996,359.860998,1.37557823129,624.085266,0.570099974688,1432.8,1.84761904762,3252,50.0,191293.118277,03:11.2,02:15.6,0,151,0,0,0,0,0,135619.718841,3.8691e+11,4,0.0,0.0,0.0,0.0,0.0,27.8810408922,0.0,0.0,99.495530275,11.0079198513,3.68677950576
+138,39799274,387000.0,151.238095238,135248.659164,20.380952381,1443.6,06:27.0,02:15.2,471.66113726,145.657214744,335.395788,1.36843537415,569.37216,0.579103403429,1443.6,1.81904761905,3252,50.0,191293.118277,03:11.2,02:15.2,0,151,0,0,0,0,0,135248.659164,3.8992e+11,4,0.0,0.0,0.0,0.0,0.0,27.5735294118,0.0,0.0,97.1263656849,10.883380478,3.69689432109
+139,39799275,389880.000114,151.285714286,135020.184383,20.619047619,1454.4,06:29.8,02:15.0,474.42741568,142.750358554,339.844008,1.35217687075,611.63025,0.576122113145,1454.4,1.75139146568,3252,50.0,191293.118277,03:11.2,02:15.0,0,152,0,0,0,0,0,135020.184383,3.928e+11,4,0.0,0.0,0.0,0.0,0.0,28.3088235294,0.0,0.0,99.6081207115,10.7759100213,3.70315003112
+140,39799276,392789.999962,151.523809524,134604.605094,20.8095238095,1465.1,06:32.7,02:14.6,468.0654625,143.328606672,358.971354,1.33258503401,607.626852,0.574599185498,1465.1,1.85912698413,3252,50.0,191293.118277,03:11.2,02:14.6,0,151,0,0,0,0,0,134604.605094,3.9566e+11,4,0.0,0.0,0.0,0.0,0.0,26.8656716418,0.0,0.0,100.127969837,10.7102397889,3.71458316489
+141,39799277,395640.000105,151.857142857,134531.510854,20.9523809524,1475.9,06:35.6,02:14.5,467.13629894,145.3063276,364.75404,1.3274829932,641.878146,0.575502759115,1475.9,1.81409001957,3252,50.0,191293.118277,03:11.2,02:14.5,0,152,0,0,0,0,0,134531.510854,3.9851e+11,4,0.0,0.0,0.0,0.0,0.0,27.4436090226,0.0,0.0,98.9262300291,10.6429948844,3.71660138822
+142,39799278,398490.00001,152.095238095,134717.801846,21.0476190476,1486.6,06:38.4,02:14.7,465.17181974,148.129254179,339.844008,1.32952380952,587.16504,0.580404599147,1486.6,1.80626223092,3252,50.0,191293.118277,03:11.2,02:14.7,0,152,0,0,0,0,0,134717.801846,4.0137e+11,4,0.0,0.0,0.0,0.0,0.0,27.037037037,0.0,0.0,96.6389592792,10.5801857438,3.71146198313
+143,39799279,401430.000067,152.80952381,135058.857384,20.5714285714,1497.4,06:41.4,02:15.0,459.83634628,142.519495485,334.061322,1.33897959184,574.710024,0.572980352813,1497.4,1.82432432432,3252,50.0,191293.118277,03:11.2,02:15.0,0,153,0,0,0,0,0,135058.857384,4.0436e+11,4,0.0,0.0,0.0,0.0,0.0,27.1062271062,0.0,0.0,99.6837929441,10.797761521,3.70208966435
+144,39799280,404369.999886,153.380952381,135382.877147,20.4761904762,1508.2,06:44.3,02:15.3,462.27917556,139.427164349,353.63349,1.35387755102,619.192224,0.57310518315,1508.2,1.77819548872,3252,50.0,191293.118277,03:11.2,02:15.3,0,153,0,0,0,0,0,135382.877147,4.0729e+11,4,0.0,0.0,0.0,0.0,0.0,27.8388278388,0.0,0.0,101.164800904,10.8220205535,3.69322923651
+145,39799281,407309.999943,153.714285714,135730.342589,20.2380952381,1519.2,06:47.3,02:15.7,467.68470092,143.676303949,341.178474,1.36503401361,601.399344,0.577255450082,1519.2,1.77179962894,3252,50.0,191293.118277,03:11.2,02:15.7,0,154,0,0,0,0,0,135730.342589,4.1027e+11,4,0.0,0.0,0.0,0.0,0.0,27.8985507246,0.0,0.0,97.4208829178,10.9213084776,3.68377468489
+146,39799282,410279.999971,153.619047619,135519.060217,20.2857142857,1530.0,06:50.2,02:15.5,473.7156097,143.328606672,343.402584,1.36544217687,591.61326,0.578325132737,1530.0,1.85135135135,3252,50.0,191293.118277,03:11.2,02:15.5,0,154,0,0,0,0,0,135519.060217,4.1321e+11,4,0.0,0.0,0.0,0.0,0.0,27.0072992701,0.0,0.0,98.1146867082,10.9126586111,3.68951791136
+147,39799283,413160.000086,153.428571429,135030.376252,20.7142857143,1540.9,06:53.1,02:15.0,470.76256656,141.25419665,338.954364,1.36789115646,567.14805,0.582445358297,1540.9,1.77365491651,3252,50.0,191293.118277,03:11.2,02:15.0,0,153,0,0,0,0,0,135030.376252,4.1609e+11,4,0.0,0.0,0.0,0.0,0.0,28.2051282051,0.0,0.0,100.640376183,10.7255559991,3.7028705235
+148,39799284,415950.000048,153.142857143,135084.603998,20.7619047619,1551.3,06:55.9,02:15.0,463.76388246,143.328606672,357.192066,1.36448979592,628.088664,0.583689111117,1551.3,1.81523809524,3252,50.0,191293.118277,03:11.2,02:15.0,0,153,0,0,0,0,0,135084.603998,4.1871e+11,4,0.0,0.0,0.0,0.0,0.0,27.6752767528,0.0,0.0,99.0643976896,10.6966603571,3.70138406006
+149,39799285,419039.999962,152.857142857,135426.313714,20.4285714286,1562.6,06:59.0,02:15.4,464.7047869,145.89145305,331.39239,1.36265306122,568.927338,0.579244873232,1562.6,1.79887218045,3252,50.0,191293.118277,03:11.2,02:15.4,0,153,0,0,0,0,0,135426.313714,4.221e+11,4,0.0,0.0,0.0,0.0,0.0,27.5362318841,0.0,0.0,96.58930096,10.8437675682,3.69204467202
+150,39799286,421950.000048,152.666666667,135393.051047,20.4761904762,1573.3,07:01.9,02:15.3,469.49915104,140.910419686,329.613102,1.36176870748,571.151448,0.571828605124,1573.3,1.78571428571,3252,50.0,191293.118277,03:11.2,02:15.3,0,153,0,0,0,0,0,135393.051047,4.2488e+11,4,0.0,0.0,0.0,0.0,0.0,27.7372262774,0.0,0.0,100.077353187,10.8212073496,3.69295171453
+151,39799287,424890.000105,152.333333333,135335.644206,20.4761904762,1584.2,07:04.8,02:15.3,463.31385574,139.199899252,360.750642,1.35925170068,631.64724,0.574232861636,1584.2,1.79323308271,3252,50.0,191293.118277,03:11.2,02:15.3,0,152,0,0,0,0,0,135335.644206,4.2782e+11,4,0.0,0.0,0.0,0.0,0.0,27.7372262774,0.0,0.0,101.4360992,10.8257975027,3.69451819536
+152,39799288,427650.000095,152.047619048,135640.381081,20.4285714286,1594.6,07:07.6,02:15.6,462.32556414,145.3063276,345.626694,1.35578231293,609.850962,0.574948423137,1594.6,1.80761904762,3252,50.0,191293.118277,03:11.2,02:15.6,0,152,0,0,0,0,0,135640.381081,4.3043e+11,4,0.0,0.0,0.0,0.0,0.0,27.4725274725,0.0,0.0,96.5198223331,10.8266539568,3.68621789483
+153,39799289,430769.999981,151.904761905,135755.601608,20.6666666667,1606.0,07:10.7,02:15.7,463.34272378,143.328606672,325.164882,1.35476190476,558.696432,0.57418260892,1606.0,1.77819548872,3252,50.0,191293.118277,03:11.2,02:15.7,0,152,0,0,0,0,0,135755.601608,4.3388e+11,4,0.0,0.0,0.0,0.0,0.0,27.4368231047,0.0,0.0,97.6027129202,10.6928398242,3.68308927277
+154,39799290,433500.0,152.095238095,135778.261376,20.8571428571,1616.2,07:13.5,02:15.7,455.75194226,137.728693043,337.175076,1.35047619048,582.271998,0.570176939833,1616.2,1.80380952381,3252,50.0,191293.118277,03:11.2,02:15.7,0,152,0,0,0,0,0,135778.261376,4.3627e+11,4,0.0,0.0,0.0,0.0,0.0,27.1739130435,0.0,0.0,101.520298996,10.5934201087,3.68247460922
+155,39799291,436559.999943,151.857142857,136008.019233,20.6666666667,1627.4,07:16.5,02:16.0,462.31796888,139.882436364,356.302422,1.34870748299,638.764392,0.569221632348,1627.4,1.8,3252,50.0,191293.118277,03:11.2,02:16.0,0,152,0,0,0,0,0,136008.019233,4.3958e+11,4,0.0,0.0,0.0,0.0,0.0,27.5735294118,0.0,0.0,99.4514934249,10.6729949558,3.67625381812
+156,39799292,439440.000057,151.80952381,135665.72469,20.5238095238,1638.0,07:19.4,02:15.6,473.08898562,144.024563085,341.623296,1.34448979592,608.071674,0.567993168719,1638.0,1.76691729323,3252,50.0,191293.118277,03:11.2,02:15.6,0,152,0,0,0,0,0,135665.72469,4.4228e+11,4,0.0,0.0,0.0,0.0,0.0,27.8388278388,0.0,0.0,97.3242489105,10.7744011297,3.68552927531
+157,39799293,442440.000057,151.619047619,135182.475263,20.3333333333,1649.2,07:22.4,02:15.1,469.43076344,142.750358554,350.964558,1.34108843537,604.068276,0.56991134906,1649.2,1.8166023166,3252,50.0,191293.118277,03:11.2,02:15.1,0,151,0,0,0,0,0,135182.475263,4.4549e+11,4,0.0,0.0,0.0,0.0,0.0,26.8115942029,0.0,0.0,99.2498030347,10.9142093544,3.69870428121
+158,39799294,445380.000114,151.380952381,135350.796391,20.0952380952,1660.2,07:25.3,02:15.3,461.95330562,142.519495485,352.743846,1.34394557823,612.519894,0.577038136948,1660.2,1.80888030888,3252,50.0,191293.118277,03:11.2,02:15.3,0,152,0,0,0,0,0,135350.796391,4.4833e+11,4,0.0,0.0,0.0,0.0,0.0,26.8115942029,0.0,0.0,99.0401573532,11.0297909954,3.69410460323
+159,39799295,448259.99999,151.285714286,135812.873651,20.2380952381,1670.8,07:28.2,02:15.8,459.0357272,141.483691644,332.726856,1.35428571429,584.496108,0.573893979377,1670.8,1.77819548872,3252,50.0,191293.118277,03:11.2,02:15.8,0,151,0,0,0,0,0,135812.873651,4.5114e+11,4,0.0,0.0,0.0,0.0,0.0,28.4644194757,0.0,0.0,98.750395978,10.9146717931,3.68153612069
+160,39799296,451140.000105,151.095238095,136053.741379,20.6666666667,1681.4,07:31.1,02:16.0,454.00415492,140.224539997,332.726856,1.36387755102,579.603066,0.565565878403,1681.4,1.79887218045,3252,50.0,191293.118277,03:11.2,02:16.0,0,151,0,0,0,0,0,136053.741379,4.5402e+11,4,0.0,0.0,0.0,0.0,0.0,28.0442804428,0.0,0.0,99.1088765411,10.669408195,3.67501837828
+161,39799297,454049.999952,150.571428571,136050.158308,20.9523809524,1692.1,07:34.0,02:16.0,460.1101085,140.224539997,331.39239,1.36965986395,598.730412,0.557429377781,1692.1,1.76373626374,3252,50.0,191293.118277,03:11.2,02:16.0,0,151,0,0,0,0,0,136050.158308,4.5695e+11,4,0.0,0.0,0.0,0.0,0.0,28.7822878229,0.0,0.0,99.1167072582,10.5241934271,3.67511516501
+162,39799298,456839.999914,150.333333333,135508.685793,21.1904761905,1702.5,07:36.8,02:15.5,467.22011914,141.25419665,342.957762,1.36659863946,616.523292,0.560940991906,1702.5,1.79511278195,3252,50.0,191293.118277,03:11.2,02:15.5,0,150,0,0,0,0,0,135508.685793,4.5964e+11,4,0.0,0.0,0.0,0.0,0.0,28.2527881041,0.0,0.0,99.5784322917,10.4475246645,3.68980037756
+163,39799299,459839.999914,150.047619048,135121.507637,20.8571428571,1713.7,07:39.8,02:15.1,468.19403724,143.90841425,354.078312,1.35707482993,636.540282,0.562610728352,1713.7,1.80761904762,3252,50.0,191293.118277,03:11.2,02:15.1,0,150,0,0,0,0,0,135121.507637,4.6283e+11,4,0.0,0.0,0.0,0.0,0.0,27.8810408922,0.0,0.0,98.5844481751,10.6449090862,3.70037315852
+164,39799300,462750.0,149.904761905,135122.935,20.7142857143,1724.4,07:42.7,02:15.1,460.93820366,145.657214744,337.175076,1.34870748299,573.82038,0.566754084449,1724.4,1.82432432432,3252,50.0,191293.118277,03:11.2,02:15.1,0,150,0,0,0,0,0,135122.935,4.6566e+11,4,0.0,0.0,0.0,0.0,0.0,27.2058823529,0.0,0.0,97.397729605,10.7182090299,3.70033406986
+165,39799301,465690.000057,149.904761905,135409.984588,20.7619047619,1735.1,07:45.6,02:15.4,460.1344678,141.02494996,338.509542,1.34823129252,604.95792,0.574200782538,1735.1,1.76879699248,3252,50.0,191293.118277,03:11.2,02:15.4,0,150,0,0,0,0,0,135409.984588,4.6859e+11,4,0.0,0.0,0.0,0.0,0.0,28.0442804428,0.0,0.0,99.958567598,10.6709570408,3.69248989667
+166,39799302,468539.999962,150.142857143,135705.405237,20.4761904762,1745.6,07:48.5,02:15.7,451.04914488,140.338698368,329.16828,1.35238095238,580.937532,0.569293296429,1745.6,1.77819548872,3252,50.0,191293.118277,03:11.2,02:15.7,0,150,0,0,0,0,0,135705.405237,4.7139e+11,4,0.0,0.0,0.0,0.0,0.0,28.679245283,0.0,0.0,99.7927892396,10.7963000922,3.68445161877
+167,39799303,471390.000105,150.285714286,136086.491159,20.7142857143,1756.3,07:51.3,02:16.0,446.03839148,141.02494996,346.516338,1.35891156463,593.392548,0.56601285805,1756.3,1.83976833977,3252,50.0,191293.118277,03:11.2,02:16.0,0,150,0,0,0,0,0,136086.491159,4.7428e+11,4,0.0,0.0,0.0,0.0,0.0,27.4074074074,0.0,0.0,98.4752383869,10.642319085,3.67413396981
+168,39799304,474059.999943,150.333333333,136277.633993,20.9523809524,1766.2,07:54.0,02:16.2,440.85237216,141.483691644,308.706468,1.36414965986,565.368762,0.5702633677,1766.2,1.74908424908,3252,50.0,191293.118277,03:11.2,02:16.2,0,151,0,0,0,0,0,136277.633993,4.7673e+11,4,0.0,0.0,0.0,0.0,0.0,28.4671532847,0.0,0.0,97.7435046018,10.5066263617,3.66898063425
+169,39799305,477059.999943,150.285714286,136497.120011,21.1904761905,1777.1,07:57.0,02:16.4,442.06706908,137.728693043,319.827018,1.36027210884,551.134458,0.560617166152,1777.1,1.79323308271,3252,50.0,191293.118277,03:11.2,02:16.4,0,150,0,0,0,0,0,136497.120011,4.8006e+11,4,0.0,0.0,0.0,0.0,0.0,28.5714285714,0.0,0.0,99.9247691213,10.3718696553,3.66308094969
+170,39799306,479880.000114,150.238095238,136580.031401,21.4285714286,1787.5,07:59.8,02:16.5,432.87365744,137.728693043,330.057924,1.35183673469,588.499506,0.562084297404,1787.5,1.78195488722,3252,50.0,191293.118277,03:11.2,02:16.5,0,150,0,0,0,0,0,136580.031401,4.8271e+11,4,0.0,0.0,0.0,0.0,0.0,29.1187739464,0.0,0.0,99.7429005188,10.2504003377,3.66085726348
+171,39799307,482609.999895,149.857142857,136811.69351,21.4761904762,1797.7,08:02.6,02:16.8,449.45807408,139.76852559,336.730254,1.34448979592,614.744004,0.574192025951,1797.7,1.80888030888,3252,50.0,191293.118277,03:11.2,02:16.8,0,150,0,0,0,0,0,136811.69351,4.8534e+11,4,0.0,0.0,0.0,0.0,0.0,28.5714285714,0.0,0.0,97.7887746272,10.2103537446,3.65465836415
+172,39799308,485579.999924,149.666666667,136176.08526,21.3333333333,1808.4,08:05.5,02:16.1,450.0774055,140.224539997,318.492552,1.34136054422,534.231222,0.567041996588,1808.4,1.78857142857,3252,50.0,191293.118277,03:11.2,02:16.1,0,150,0,0,0,0,0,136176.08526,4.8854e+11,4,0.0,0.0,0.0,0.0,0.0,28.1954887218,0.0,0.0,98.841991041,10.3267030868,3.67171665307
+173,39799309,488279.999971,149.428571429,135744.803044,21.4285714286,1818.4,08:08.2,02:15.7,446.29018494,138.4064164,356.302422,1.34741496599,620.081868,0.570033589223,1818.4,1.79619047619,3252,50.0,191293.118277,03:11.2,02:15.7,0,149,0,0,0,0,0,135744.803044,4.9094e+11,4,0.0,0.0,0.0,0.0,0.0,28.1954887218,0.0,0.0,101.097911766,10.31347034,3.68338226429
+174,39799310,491069.999933,149.0,135655.993062,21.2380952381,1828.9,08:11.0,02:15.6,452.80389202,145.657214744,319.827018,1.35897959184,586.275396,0.57254419599,1828.9,1.78383458647,3252,50.0,191293.118277,03:11.2,02:15.6,0,149,0,0,0,0,0,135655.993062,4.9388e+11,4,0.0,0.0,0.0,0.0,0.0,29.2307692308,0.0,0.0,96.2540669287,10.4127803124,3.68579366613
+175,39799311,494039.999962,148.666666667,135300.864262,21.2857142857,1839.9,08:14.0,02:15.3,457.61477812,141.713435077,326.054526,1.36326530612,563.144652,0.568145934555,1839.9,1.80263157895,3252,50.0,191293.118277,03:11.2,02:15.3,0,149,0,0,0,0,0,135300.864262,4.9705e+11,4,0.0,0.0,0.0,0.0,0.0,28.2527881041,0.0,0.0,99.7138091099,10.4167551393,3.69546789466
+176,39799312,496890.000105,148.285714286,134976.811268,21.2380952381,1850.5,08:16.8,02:14.9,450.62353798,141.483691644,347.850804,1.36238095238,599.620056,0.571160947145,1850.5,1.82285714286,3252,50.0,191293.118277,03:11.2,02:14.9,0,148,0,0,0,0,0,134976.811268,4.9972e+11,4,0.0,0.0,0.0,0.0,0.0,28.4090909091,0.0,0.0,100.596800752,10.4651757627,3.7043399922
+177,39799313,499769.999981,147.619047619,135463.633431,20.8571428571,1861.2,08:19.7,02:15.4,456.67402498,144.839355293,330.502746,1.3587755102,574.710024,0.579918778356,1861.2,1.75510204082,3252,50.0,191293.118277,03:11.2,02:15.4,0,148,0,0,0,0,0,135463.633431,5.0265e+11,4,0.0,0.0,0.0,0.0,0.0,28.7313432836,0.0,0.0,97.2105277427,10.6180243948,3.69102752773
+178,39799314,502710.000038,147.19047619,135766.017193,20.5714285714,1871.9,08:22.7,02:15.7,451.3696588,142.519495485,330.947568,1.3568707483,584.496108,0.576471579536,1871.9,1.83204633205,3252,50.0,191293.118277,03:11.2,02:15.7,0,147,0,0,0,0,0,135766.017193,5.0564e+11,4,0.0,0.0,0.0,0.0,0.0,27.1062271062,0.0,0.0,98.1342334945,10.74151959,3.68280671656
+179,39799315,505680.000067,147.428571429,136042.640233,20.4761904762,1882.6,08:25.6,02:16.0,459.4732868,138.519585991,334.506144,1.36469387755,568.482516,0.575279416416,1882.6,1.81904761905,3252,50.0,191293.118277,03:11.2,02:16.0,0,147,0,0,0,0,0,136042.640233,5.0859e+11,4,0.0,0.0,0.0,0.0,0.0,27.6752767528,0.0,0.0,100.353310532,10.7695372316,3.67531826158
+180,39799316,508500.0,147.80952381,135635.192846,20.3333333333,1893.3,08:28.5,02:15.6,468.43714608,139.5408896,335.395788,1.37870748299,590.278794,0.567668322861,1893.3,1.74321880651,3252,50.0,191293.118277,03:11.2,02:15.6,0,148,0,0,0,0,0,135635.192846,5.1138e+11,4,0.0,0.0,0.0,0.0,0.0,29.3680297398,0.0,0.0,100.519284677,10.8777803541,3.68635889778
+181,39799317,511410.000086,148.571428571,135228.054118,20.2380952381,1904.3,08:31.4,02:15.2,469.18608108,144.373384534,358.971354,1.38632653061,637.874748,0.568806989976,1904.3,1.80705009276,3252,50.0,191293.118277,03:11.2,02:15.2,0,149,0,0,0,0,0,135228.054118,5.1434e+11,4,0.0,0.0,0.0,0.0,0.0,28.0,0.0,0.0,98.0348549052,10.9618743747,3.6974576264
+182,39799318,514440.000057,149.333333333,135091.590969,20.2857142857,1915.4,08:34.4,02:15.0,472.29378308,148.129254179,322.051128,1.38857142857,586.720218,0.558225432086,1915.4,1.80705009276,3252,50.0,191293.118277,03:11.2,02:15.0,0,149,0,0,0,0,0,135091.590969,5.1746e+11,4,0.0,0.0,0.0,0.0,0.0,27.4021352313,0.0,0.0,95.8389967843,10.9471894499,3.70119262355
+183,39799319,517410.000086,150.142857143,135165.185389,20.1428571429,1926.2,08:37.4,02:15.1,470.79285682,139.313500906,336.285432,1.38523809524,580.49271,0.552451093149,1926.2,1.81578947368,3252,50.0,191293.118277,03:11.2,02:15.1,0,150,0,0,0,0,0,135165.185389,5.2034e+11,4,0.0,0.0,0.0,0.0,0.0,27.8388278388,0.0,0.0,101.737322801,11.0188263186,3.69917740697
+184,39799320,520380.000114,150.857142857,135528.874331,19.9047619048,1937.3,08:40.3,02:15.5,462.43652756,140.338698368,350.519736,1.38006802721,656.557272,0.549901547877,1937.3,1.79220779221,3252,50.0,191293.118277,03:11.2,02:15.5,0,151,0,0,0,0,0,135528.874331,5.2335e+11,4,0.0,0.0,0.0,0.0,0.0,28.0,0.0,0.0,100.183247751,11.1207079741,3.68925074061
+185,39799321,523170.000076,151.761904762,135908.232418,19.9047619048,1947.8,08:43.1,02:15.9,469.9886368,144.1407744,335.84061,1.37489795918,609.850962,0.56103077658,1947.8,1.7866419295,3252,50.0,191293.118277,03:11.2,02:15.9,0,152,0,0,0,0,0,135908.232418,5.26e+11,4,0.0,0.0,0.0,0.0,0.0,28.0,0.0,0.0,96.726149754,11.0896669516,3.67895300457
+186,39799322,526230.000019,152.380952381,135536.044927,20.0476190476,1959.1,08:46.2,02:15.5,464.41203653,141.943427083,332.726856,1.37003401361,576.489312,0.578327192904,1959.1,1.80639097744,3252,50.0,191293.118277,03:11.2,02:15.5,0,152,0,0,0,0,0,135536.044927,5.293e+11,4,0.0,0.0,0.0,0.0,0.0,27.6363636364,0.0,0.0,99.0349148838,11.0408788706,3.68905555914
+187,39799323,529140.000105,152.666666667,135676.953847,20.3333333333,1969.8,08:49.1,02:15.6,463.23852347,140.11044355,347.850804,1.36343537415,569.37216,0.593066463629,1969.8,1.79135338346,3252,50.0,191293.118277,03:11.2,02:15.6,0,153,0,0,0,0,0,135676.953847,5.3203e+11,4,0.0,0.0,0.0,0.0,0.0,28.0442804428,0.0,0.0,100.018257266,10.8744322026,3.68522424644
+188,39799324,532049.999952,152.904761905,135784.677306,20.7380952381,1980.6,08:52.0,02:15.7,471.712087535,142.63489588,340.28883,1.35807823129,561.365364,0.594141310259,1980.6,1.78665413534,3252,50.0,191293.118277,03:11.2,02:15.7,0,153,0,0,0,0,0,135784.677306,5.3497e+11,4,0.0,0.0,0.0,0.0,0.0,27.8388278388,0.0,0.0,98.0144170752,10.6537285142,3.68230060946
+189,39799325,534960.000038,153.261904762,135356.212775,21.0238095238,1991.4,08:54.9,02:15.3,480.500726285,142.63489588,356.302422,1.35675170068,632.536884,0.591064693856,1991.4,1.81047619048,3252,50.0,191293.118277,03:11.2,02:15.3,0,153,0,0,0,0,0,135356.212775,5.3786e+11,4,0.0,0.0,0.0,0.0,0.0,27.7777777778,0.0,0.0,98.9481483694,10.5422096122,3.69395678078
+190,39799326,537240.00001,153.904761905,134031.309351,21.0238095238,2000.0,08:57.2,02:14.0,485.32090977,146.713264566,356.302422,1.36183673469,595.616658,0.587622263206,2000.0,1.81523809524,3252,50.0,191293.118277,03:11.2,02:14.0,0,154,0,0,0,0,0,134031.309351,5.3946e+11,4,0.0,0.0,0.0,0.0,0.0,27.7777777778,0.0,0.0,99.0786049127,10.6464196634,3.7304716519
diff --git a/rowers/tests/tests.py b/rowers/tests/tests.py
index b1ad33b0..1511c6ab 100644
--- a/rowers/tests/tests.py
+++ b/rowers/tests/tests.py
@@ -250,7 +250,7 @@ class DataTest(TestCase):
form = RowerForm(data=form_data)
self.assertFalse(form.is_valid())
- def test_painsled(self):
+ def test_painsled_form(self):
filename = 'rowers/tests/testdata/testdata.csv'
f = open(filename,'rb')
file_data = {'file': SimpleUploadedFile(f.name, f.read())}
@@ -263,61 +263,122 @@ class DataTest(TestCase):
form = DocumentsForm(form_data,file_data)
self.assertTrue(form.is_valid())
-
+
f.close()
+class InteractiveChartTest(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.nu = datetime.datetime.now()
+
+ self.filename = 'rowers/tests/testdata/testdata.csv'
+ self.wotw = Workout.objects.create(name='testworkout',
+ workouttype='water',
+ user=r,date=self.nu.strftime('%Y-%m-%d'),
+ starttime=self.nu.strftime('%H:%M:%S'),
+ duration="0:55:00",distance=8000,
+ csvfilename=self.filename)
+
+ self.wote = Workout.objects.create(name='testworkout',
+ workouttype='Indoor Rower',
+ user=r,date=self.nu.strftime('%Y-%m-%d'),
+ starttime=self.nu.strftime('%H:%M:%S'),
+ duration="0:55:00",distance=8000,
+ csvfilename=self.filename)
+
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_painsled(self, mocked_sqlalchemy, mocked_read_df_sql):
u = User.objects.get(username='john')
r = Rower.objects.get(user=u)
rr = rrower(hrmax=r.max,hrut2=r.ut2,
hrut1=r.ut1,hrat=r.at,
hrtr=r.tr,hran=r.an,ftp=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')
-
- w = Workout.objects.create(name='testworkout',workouttype='water',
- user=r,date=self.nu.strftime('%Y-%m-%d'),
- starttime=workoutstarttime,
- duration=duration,distance=totaldist,
- csvfilename=filename)
-
+ row = rdata(self.filename,rower=rr)
fig1 = plots.mkplot(row,'test')
- res = iplots.interactive_chart(w.id)
- res = iplots.interactive_chart(w.id,promember=1)
- res = iplots.interactive_bar_chart(w.id)
- res = iplots.interactive_bar_chart(w.id,promember=1)
- res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='time',
- yparam1='pace',yparam2='hr')
- res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='distance',
- yparam1='pace',yparam2='hr')
- res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='time',
- yparam1='pace',yparam2='spm')
- res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='distance',
- yparam1='pace',yparam2='spm')
- res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='time',
- yparam1='pace',yparam2='hr')
- res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='distance',
- yparam1='pace',yparam2='hr')
- res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='time',
- yparam1='pace',yparam2='spm')
- res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='distance',
- yparam1='pace',yparam2='spm')
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart1(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_chart(self.wote.id)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart2(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_chart(self.wote.id,promember=1)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart3(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_bar_chart(self.wote.id)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart4(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_bar_chart(self.wote.id,promember=1)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart5(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_flex_chart2(self.wote.id,promember=0,
+ xparam='time',
+ yparam1='pace',yparam2='hr')
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart6(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_flex_chart2(self.wote.id,
+ promember=0,xparam='distance',
+ yparam1='pace',yparam2='hr')
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart7(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_flex_chart2(self.wote.id,promember=0,
+ xparam='time',
+ yparam1='pace',yparam2='spm')
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart8(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_flex_chart2(self.wote.id,
+ promember=0,xparam='distance',
+ yparam1='pace',yparam2='spm')
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart9(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_flex_chart2(self.wote.id,
+ promember=1,xparam='time',
+ yparam1='pace',yparam2='hr')
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart10(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_flex_chart2(self.wote.id,
+ promember=1,xparam='distance',
+ yparam1='pace',yparam2='hr')
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart11(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_flex_chart2(self.wote.id,
+ promember=1,xparam='time',
+ yparam1='pace',yparam2='spm')
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.read_df_sql')
+ def test_interactive_chart12(self, mocked_sqlalchemy,mocked_read_df_sql):
+ res = iplots.interactive_flex_chart2(self.wote.id,promember=1,
+ xparam='distance',
+ yparam1='pace',yparam2='spm')
@@ -540,7 +601,8 @@ class ViewTest(TestCase):
@patch('rowers.dataprep.create_engine')
- def test_upload_view_TCX_CN(self, mocked_sqlalchemy):
+ @patch('rowers.dataprep.TCXParser')
+ def test_upload_view_TCX_CN(self, mocked_sqlalchemy, mocked_tcx_parser):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/crewnerddata.tcx'
@@ -588,7 +650,9 @@ class ViewTest(TestCase):
pass
@patch('rowers.dataprep.create_engine')
- def test_upload_view_TCX_SpeedCoach2a(self, mocked_sqlalchemy):
+ @patch('rowers.dataprep.TCXParser')
+ def test_upload_view_TCX_SpeedCoach2a(self, mocked_sqlalchemy,
+ mocked_tcx_parser):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/Speedcoach2example.csv'
@@ -623,7 +687,9 @@ class ViewTest(TestCase):
pass
@patch('rowers.dataprep.create_engine')
- def test_upload_view_TCX_SpeedCoach2b(self, mocked_sqlalchemy):
+ @patch('rowers.dataprep.TCXParser')
+ def test_upload_view_TCX_SpeedCoach2b(self, mocked_sqlalchemy,
+ mocked_tcx_parser):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/Speedcoach2example.csv'
@@ -659,8 +725,10 @@ class ViewTest(TestCase):
- @patch('rowers.dataprep.create_engine')
- def test_upload_view_TCX_SpeedCoach2c(self, mocked_sqlalchemy):
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.TCXParser')
+ def test_upload_view_TCX_SpeedCoach2c(self, mocked_sqlalchemy,
+ mocked_tcx_parser):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/speedcoach3test3.csv'
@@ -770,7 +838,9 @@ class ViewTest(TestCase):
@patch('rowers.dataprep.create_engine')
- def test_upload_view_TCX_NoHR(self, mocked_sqlalchemy):
+ @patch('rowers.dataprep.TCXParser')
+ def test_upload_view_TCX_NoHR(self, mocked_sqlalchemy,
+ mocked_tcx_parser):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/NoHR.tcx'
@@ -806,7 +876,9 @@ class ViewTest(TestCase):
@patch('rowers.dataprep.create_engine')
- def test_upload_view_TCX_CN(self, mocked_sqlalchemy):
+ @patch('rowers.dataprep.TCXParser')
+ def test_upload_view_TCX_CN(self, mocked_sqlalchemy,
+ mocked_tcx_parser):
self.c.login(username='john',password='koeinsloot')
filename = 'rowers/tests/testdata/rowinginmotionexample.tcx'
@@ -1173,8 +1245,9 @@ class PlotTests(TestCase):
'powerzones':serialize_list(r.powerzones),
}
-
- def test_ote_plots(self):
+ @patch('rowers.tasks.rdata')
+ @patch('rowers.tasks.FigureCanvas')
+ def test_ote_plots(self, mocked_rowingdata, mocked_canvas):
w = self.wote
f1 = 'testdata.csv'[:-4]
timestr = strftime("%Y%m%d-%H%M%S")
@@ -1311,7 +1384,9 @@ class PlotTests(TestCase):
except WindowsError:
pass
- def test_otw_plots(self):
+ @patch('rowers.tasks.rdata')
+ @patch('rowers.tasks.FigureCanvas')
+ def test_otw_plots(self, mocked_rowingdata, mocked_canvas):
w = self.wotw
f1 = 'testdata.csv'[:-4]
timestr = strftime("%Y%m%d-%H%M%S")
From abceefa42c745780ba0d8649400a9c281089dab4 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Thu, 3 Jan 2019 18:11:19 +0100
Subject: [PATCH 10/18] non succeeeded in ajax test
---
rowers/tests/donottest_ajax.py | 82 +
rowers/tests/test_admin.py,cover | 47 -
rowers/tests/test_imports.py | 12 +-
rowers/tests/test_user.py,cover | 94 -
rowers/tests/tests.py | 5 +
rowers/tests/tests.py,cover | 2831 ------------------------------
rowers/views.py | 7 +-
7 files changed, 101 insertions(+), 2977 deletions(-)
create mode 100644 rowers/tests/donottest_ajax.py
delete mode 100644 rowers/tests/test_admin.py,cover
delete mode 100644 rowers/tests/test_user.py,cover
delete mode 100644 rowers/tests/tests.py,cover
diff --git a/rowers/tests/donottest_ajax.py b/rowers/tests/donottest_ajax.py
new file mode 100644
index 00000000..92d223de
--- /dev/null
+++ b/rowers/tests/donottest_ajax.py
@@ -0,0 +1,82 @@
+#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()
+
+class AjaxTests(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.nu = datetime.datetime.now()
+
+ self.filename = 'rowers/tests/testdata/testdata.csv'
+ self.wotw = Workout.objects.create(name='testworkout',
+ workouttype='water',
+ user=r,date=self.nu.strftime('%Y-%m-%d'),
+ starttime=self.nu.strftime('%H:%M:%S'),
+ duration="0:55:00",distance=8000,
+ csvfilename=self.filename)
+
+ self.wote = Workout.objects.create(name='testworkout',
+ workouttype='Indoor Rower',
+ user=r,date=self.nu.strftime('%Y-%m-%d'),
+ starttime=self.nu.strftime('%H:%M:%S'),
+ duration="0:55:00",distance=8000,
+ csvfilename=self.filename)
+
+
+ self.c = Client()
+
+ def test_toggle_ranking(self):
+ response = self.c.get(
+ '/rowers/workout/1/toggle-ranking/',
+ **{'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'})
+
+ jsondata = json.loads(response.json())
+ self.assertIn('result',jsondata)
diff --git a/rowers/tests/test_admin.py,cover b/rowers/tests/test_admin.py,cover
deleted file mode 100644
index 083f75f0..00000000
--- a/rowers/tests/test_admin.py,cover
+++ /dev/null
@@ -1,47 +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
-> import datetime
-
-> import json
-> import numpy as np
-
-
-> from redis import StrictRedis
-> redis_connection = StrictRedis()
-
-> from rowers.models import User,Rower
-
-> @pytest.mark.django_db
-> class AdminTests(TestCase):
-> def setUp(self):
-> u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-> r = Rower.objects.create(user=u)
-> my_admin = User.objects.create_superuser('myuser',
-> 'myemail@test.com',
-> 'apensstaart')
-
-> self.c = Client()
-> self.c.login(username='myuser',password='apensstaart')
-
-> def test_admin(self):
-> response = self.c.get('/admin',follow=True)
-> self.assertEqual(response.status_code,200)
-
-
-> response = self.c.get('/admin/auth/user/',follow=True)
-> self.assertEqual(response.status_code,200)
-
-> response = self.c.get('/admin/auth/user/77/change/',follow=True)
-> self.assertEqual(response.status_code,200)
diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py
index 1e84168c..ee537e2e 100644
--- a/rowers/tests/test_imports.py
+++ b/rowers/tests/test_imports.py
@@ -152,7 +152,8 @@ class C2Objects(DjangoTestCase):
self.assertEqual(response.status_code, 200)
- def test_strokedata(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_strokedata(self, mocked_sqlalchemy):
with open('rowers/tests/testdata/c2stroketestdata.txt','r') as infile:
res = json.load(infile)
@@ -167,7 +168,8 @@ class C2Objects(DjangoTestCase):
res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
- def test_strokedatanohr(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_strokedatanohr(self, mocked_sqlalchemy):
with open('rowers/tests/testdata/c2strokedatanohr.txt','r') as infile:
res = json.load(infile)
@@ -399,7 +401,8 @@ class STObjects(DjangoTestCase):
self.assertEqual(response.status_code, 200)
- def test_strokedata(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_strokedata(self, mocked_sqlalchemy):
with open('rowers/tests/testdata/sporttrackstestdata.txt','r') as infile:
data = json.load(infile)
@@ -407,7 +410,8 @@ class STObjects(DjangoTestCase):
res = add_workout_from_data(self.u,1,data,data)
- def test_strokedatanohr(self):
+ @patch('rowers.dataprep.create_engine')
+ def test_strokedatanohr(self, mocked_sqlalchemy):
with open('rowers/tests/testdata/sporttrackstestnohr.txt','r') as infile:
data = json.load(infile)
diff --git a/rowers/tests/test_user.py,cover b/rowers/tests/test_user.py,cover
deleted file mode 100644
index 5ece6fa8..00000000
--- a/rowers/tests/test_user.py,cover
+++ /dev/null
@@ -1,94 +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
-> import datetime
-! from django.utils import timezone
-
-> import json
-! import numpy as np
-
-
-> from redis import StrictRedis
-! redis_connection = StrictRedis()
-
-! from rowers.models import User,Rower, Workout
-
-> class UserMiddleWareTest(TestCase):
-> def setUp(self):
-> u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-! r = Rower.objects.create(user=u)
-
-> self.c = Client()
-! self.c.login(username='john',password='koeinsloot')
-> nu = datetime.datetime.now()
-
-> response = dataprep.new_workout_from_file(r,'/media/testdata.csv.gz',
-> title='sample')
-
-! newworkoutid = response[0]
-! self.w = Workout.objects.get(id=newworkoutid)
-
-
-! def test_middleware(self):
-! response = self.c.get('/rowers/list-workouts',follow=True)
-! self.assertEqual(response.status_code,200)
-
-! class UserExpireTest(TestCase):
-! def setUp(self):
-! redis_connection.publish('tasks','KILL')
-! self.u = User.objects.create_user('john',
-! 'sander@ds.ds',
-! 'koeinsloot')
-
-! yesterday_dt = timezone.now()-datetime.timedelta(days=1)
-! yesterday = yesterday_dt.date()
-
-! r = Rower.objects.create(user=self.u,planexpires = yesterday,rowerplan='pro',
-! paymenttype='single')
-
-! self.c = Client()
-! self.c.login(username='john',password='koeinsloot')
-! nu = datetime.datetime.now()
-
-! response = dataprep.new_workout_from_file(r,'/media/testdata.csv.gz',
-! title='sample')
-
-! newworkoutid = response[0]
-! self.w = Workout.objects.get(id=newworkoutid)
-
-
-! def test_expire(self):
-! response = self.c.get('/rowers/list-workouts',follow=True)
-! self.assertEqual(response.status_code,200)
-! self.assertEqual(self.u.rower.rowerplan,'basic')
-
-! class UserTestsNoRower(TestCase):
-! def setUp(self):
-! u = User.objects.create_user('john',
-! 'sander@ds.ds',
-! 'koeinsloot')
-
-! self.c = Client()
-! self.c.login(username='john',password='koeinsloot')
-! nu = datetime.datetime.now()
-! self.w = Workout.objects.create(name='testworkout',
-! workouttype='water',
-! user=self.r,date=nu.strftime('%Y-%m-%d'),
-! starttime=nu.strftime('%H:%M:%S'),
-! duration="0:55:00",distance=8000)
-
-! def test_user(self):
-! response = self.c.get('/rowers/list-workouts',follow=True)
-! self.assertEqual(response.status_code,200)
-
diff --git a/rowers/tests/tests.py b/rowers/tests/tests.py
index 1511c6ab..9a298642 100644
--- a/rowers/tests/tests.py
+++ b/rowers/tests/tests.py
@@ -444,6 +444,11 @@ class ViewTest(TestCase):
response = self.c.get('/rowers/workout/1/histo', form_data, follow=True)
self.assertEqual(response.status_code, 200)
+ response = self.c.get('/rowers/workout/1/workflow',
+ follow=True)
+
+ self.assertEqual(response.status_code, 200)
+
form_data = {
'name':'aap',
'date':'2016-11-05',
diff --git a/rowers/tests/tests.py,cover b/rowers/tests/tests.py,cover
deleted file mode 100644
index 3c9785cd..00000000
--- a/rowers/tests/tests.py,cover
+++ /dev/null
@@ -1,2831 +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()
-
- #@pytest.mark.django_db
-> class DjangoTestCase(TestCase, MockTestCase):
-> def _pre_setup(self):
-> MockTestCase.setUp(self)
-> TestCase._pre_setup(self)
-> self.client = Client()
-
-> def _post_teardown(self):
-> TestCase._post_teardown(self)
-> MockTestCase.tearDown(self)
-> delete_strokedata(1)
-
- # to be done add polar mocks (for email processing)
-> def mocked_requests(*args, **kwargs):
-> with open('rowers/tests/testdata/c2jsonworkoutdata.txt','r') as infile:
-> c2workoutdata = json.load(infile)
-
-> with open('rowers/tests/testdata/c2jsonstrokedata.txt','r') as infile:
-> c2strokedata = json.load(infile)
-
-> polar_json = {
-> 'available-user-data': []
-> }
-
-> c2workoutlist = json.load(open('rowers/tests/testdata/c2workoutlist.txt'))
-
-> c2uploadjson = {
-> "data": {
-> "id": 339,
-> "user_id": 1,
-> "date": "2015-08-05 13:15:41",
-> "timezone": "Europe/London",
-> "date_utc": "2015-08-05 12:15:41",
-> "distance": 5649,
-> "type": "rower",
-> "time": 8649,
-> "time_formatted": "14:24.9",
-> "workout_type": "JustRow",
-> "source": "ErgData",
-> "weight_class": "H",
-> "verified": True,
-> "ranked": False
-> }
-> }
-
-> stravaworkoutlist = json.load(open('rowers/tests/testdata/stravaworkoutlist.txt'))
-> sporttracksworkoutlist = json.load(open('rowers/tests/testdata/sporttracksworkouts.txt'))
-
-> rkworkoutlistjson = json.load(open('rowers/tests/testdata/rkworkoutslist.txt','r'))
-> uaworkoutlistjson = json.load(open('rowers/tests/testdata/uaworkoutlist.txt','r'))
-
-> stravasummaryjson = json.load(open('rowers/tests/testdata/stravaworkoutsummary.txt','r'))
-
-> stravatimejson = json.load(open('rowers/tests/testdata/stravatimetestdata.txt','r'))
-> stravavelojson = json.load(open('rowers/tests/testdata/stravavelotestdata.txt','r'))
-
-> stravapowerjson = json.load(open('rowers/tests/testdata/stravapowertestdata.txt','r'))
-
-> stravadistancejson = json.load(open('rowers/tests/testdata/stravadistancetestdata.txt','r'))
-> stravalatlongjson = json.load(open('rowers/tests/testdata/stravalatlongtestdata.txt','r'))
-> stravahrjson = json.load(open('rowers/tests/testdata/stravahrtestdata.txt','r'))
-> stravaspmjson = json.load(open('rowers/tests/testdata/stravaspmtestdata.txt','r'))
-
-> uapostworkoutjson = json.load(open('rowers/tests/testdata/uapostworkoutresponse.txt','r'))
-
-> tpuploadresponse = json.load(open('rowers/tests/testdata/tpuploadresponse.txt','r'))
-
-> stravastreamjson = {
-> 'time':stravatimejson,
-> 'velocity_smooth':stravavelojson,
-> 'distance':stravadistancejson,
-> 'latlng':stravalatlongjson,
-> 'heartrate':stravahrjson,
-> 'cadence':stravaspmjson,
-> 'power':stravapowerjson,
-> }
-
-> ststrokesjson = json.load(open('rowers/tests/testdata/sporttracksstrokedata.txt','r'))
-
-> rkstrokesjson = json.load(open('rowers/tests/testdata/rkstrokes.txt','r'))
-
-> uastrokesjson = json.load(open('rowers/tests/testdata/uastrokes.txt','r'))
-> uauserjson = json.load(open('rowers/tests/testdata/uauser.txt','r'))
-
-> class MockResponse:
-> def __init__(self, json_data, status_code):
-> self.json_data = json_data
-> self.status_code = status_code
-
-> def json(self):
-> return self.json_data
-
-
-> class MockHeaderResponse:
-> def __init__(self, header_data, status_code):
-> self.headers = header_data
-> self.status_code = status_code
-
-> class MockSession:
-> def send(self,prepped):
- # prepped.url
- # prepped.body (post data)
- # prepped.headers
- # prepped.method
-
-> json_data = {
-> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
-> 'expires_in': 604800,
-> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
-> }
-
-> return MockResponse(json_data,200)
-
-> if not args:
-> return MockSession()
-
-> polartester = re.compile('.*?polaraccesslink\.com')
-> c2tester = re.compile('.*?log\.concept2\.com')
-> stravatester = re.compile('.*?strava\.com')
-> sttester = re.compile('.*?sporttracks\.mobi')
-> rktester = re.compile('.*?runkeeper\.com')
-> uatester = re.compile('.*?mapmyfitness\.com')
-> tptester = re.compile('.*?trainingpeaks\.com')
-
-> c2importregex = '.*?concept2.com\/api\/users\/me\/results\/\d+'
-> c2importtester = re.compile(c2importregex)
-
-> c2uploadregex = '.*?concept2.com\/api\/users\/\d+\/results$'
-> c2uploadtester = re.compile(c2uploadregex)
-
-> c2strokesregex = '.*?concept2.com\/api\/users\/me\/results\/\d+\/strokes'
-> c2strokestester = re.compile(c2strokesregex)
-
-> c2workoutlistregex = '.*?concept2\.com\/api\/users\/me\/results\?page=\d'
-> c2workoutlisttester = re.compile(c2workoutlistregex)
-
-> stravaworkoutlistregex = '.*?strava\.com\/api\/v3\/athlete\/activities'
-> stravaworkoutlisttester = re.compile(stravaworkoutlistregex)
-
-> stravastreamregex = '.*?strava\.com\/api\/v3\/activities\/\d+\/streams\/(\w.*?)\?'
-> stravastreamtester = re.compile(stravastreamregex)
-
-> stravasummaryregex = '.*?strava\.com\/api\/v3\/activities\/\d+$'
-> stravasummarytester = re.compile(stravasummaryregex)
-
-> stuploadregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities.json$'
-> stuploadtester = re.compile(stuploadregex)
-
-> stworkoutlistregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities$'
-> stworkoutlisttester = re.compile(stworkoutlistregex)
-
-> ststrokesregex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/\d+$'
-> ststrokestester = re.compile(ststrokesregex)
-
-> rkuploadregex = '.*?api\.runkeeper\.com\/fitnessActivities$'
-> rkuploadtester = re.compile(rkuploadregex)
-> rkuserregex = '.*?api\.runkeeper\.com\/user$'
-> rkusertester = re.compile(rkuserregex)
-> rkstrokesregex = '.*?api\.runkeeper\.com\/fitnessActivities/\d+$'
-> rkstrokestester = re.compile(rkstrokesregex)
-
-> uaapiregex = '.*?api\.ua\.com'
-> uaapitester = re.compile(uaapiregex)
-
-> uauploadregex = '.*?api\.ua\.com\/v7.1\/workout\/$'
-> uauploadtester = re.compile(uauploadregex)
-
-> uastrokesregex = '.*?api\.ua\.com\/v7.1\/workout\/\d+'
-> uastrokestester = re.compile(uastrokesregex)
-
-> ualistregex = '.*?api\.ua\.com\/v7.1\/workout\/\?user'
-> ualisttester = re.compile(ualistregex)
-
-> uauserregex = '.*?api\.ua\.com\/v7.1\/user\/self\/'
-> uausertester = re.compile(uauserregex)
-
-> tpuploadregex = '.*?trainingpeaks\.com\/v1\/file'
-> tpuploadtester = re.compile(tpuploadregex)
-
-> if polartester.match(args[0]):
-> json_data = polar_json
-> return MockResponse(json_data,200)
-
-> if tptester.match(args[0]):
-> if 'token' in args[0]:
-> json_data = {
-> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
-> 'expires_in': 604800,
-> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
-> }
-> return MockResponse(json_data,200)
-> elif tpuploadtester.match(args[0]):
-> return MockResponse(tpuploadresponse,200)
-
-> if uaapitester.match(args[0]):
-> if 'access_token' in args[0]:
-> json_data = {
-> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
-> 'expires_in': 604800,
-> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
-> }
-> return MockResponse(json_data,200)
-> elif uauploadtester.match(args[0]):
-> if 'data' in kwargs:
-> return MockResponse(uapostworkoutjson,200)
-> elif uastrokestester.match(args[0]):
-> return MockResponse(uastrokesjson,200)
-> elif ualisttester.match(args[0]):
-> return MockResponse(uaworkoutlistjson,200)
-> elif uausertester.match(args[0]):
-> return MockResponse(uauserjson,200)
-
-
-> if uatester.match(args[0]):
-! if 'access_token' in args[0]:
-! json_data = {
-! 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
-! 'expires_in': 604800,
-! 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
-! }
-! return MockResponse(json_data,200)
-
-
-> if rktester.match(args[0]):
-> if 'token' in args[0]:
-> json_data = {
-> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
-> 'expires_in': 604800,
-> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
-> }
-> return MockResponse(json_data,200)
-> elif rkuploadtester.match(args[0]):
-> if 'data' in kwargs:
- # post
-> header_data = {
-> 'Location': '/fitnessActivities/12'
-> }
-> return MockHeaderResponse(header_data,200)
-> else:
-> json_data = rkworkoutlistjson
-> return MockResponse(json_data,200)
-> elif rkusertester.match(args[0]):
-> json_data = {
-> "userID": 1234567890,
-> "profile": "/profile",
-> "settings": "/settings",
-> "fitness_activities": "/fitnessActivities",
-> "strength_training_activities": "/strengthTrainingActivities",
-> "background_activities": "/backgroundActivities",
-> "sleep": "/sleep",
-> "nutrition": "/nutrition",
-> "weight": "/weight",
-> "general_measurements": "/generalMeasurements",
-> "diabetes": "/diabetes",
-> "records": "/records",
-> "team": "/team"
-> }
-> return MockResponse(json_data, 200)
-> elif rkstrokestester.match(args[0]):
-> return MockResponse(rkstrokesjson,200)
-
-> if sttester.match(args[0]):
-> if 'oauth2/token' in args[0]:
-> json_data = {
-> 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
-> 'expires_in': 604800,
-> 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
-> }
-> return MockResponse(json_data,200)
-> if ststrokestester.match(args[0]):
-> return MockResponse(ststrokesjson,200)
-> if stuploadtester.match(args[0]):
-> json_data = {
-> "uris": [
-> "https://api.sporttracks.mobi/api/v2/fitnessActivities/123456.json"
-> ]
-> }
-> return MockResponse(json_data, 200)
-> if stworkoutlisttester.match(args[0]):
-> return MockResponse(sporttracksworkoutlist,200)
-
-
-> if stravatester.match(args[0]):
-> if stravaworkoutlisttester.match(args[0]):
-! return MockResponse(stravaworkoutlist,200)
-> if stravastreamtester.match(args[0]):
-> metric = stravastreamtester.match(args[0]).group(1)
-> json_data = stravastreamjson[metric]
-> return MockResponse(json_data,200)
-> elif stravasummarytester.match(args[0]):
-> return MockResponse(stravasummaryjson,200)
-> elif 'token' in args[0]:
-> json_data = {
-> "token_type": "Bearer",
-> "access_token": "987654321234567898765432123456789",
-> "refresh_token": "1234567898765432112345678987654321",
-> "expires_at": 1531385304
-> }
-> return MockResponse(json_data,200)
-
-
-> if c2tester.match(args[0]):
-> if c2uploadtester.match(args[0]):
-> return MockResponse(c2uploadjson,201)
-> if c2strokestester.match(args[0]):
-> return MockResponse(c2strokedata,200)
-> elif c2importtester.match(args[0]):
-> return MockResponse(c2workoutdata,200)
-> elif c2workoutlisttester.match(args[0]):
-> return MockResponse(c2workoutlist,200)
-> elif 'access_token' in args[0]:
-! json_data = {
-! 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
-! 'expires_in': 604800,
-! 'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
-! }
-! return MockResponse(json_data,200)
-> elif 'users/me' in args[0]:
-> json_data = {
-> 'data': {
-> 'username': 'john',
-> 'id': 1234,
-> }
-> }
-> return MockResponse(json_data,200)
-! elif 'results' in args[0]:
-! json_data = {
-! 'data': {
-! 'id': 1223,
-! }
-! }
-! else:
-! return MockResponse(c2workoutdata,200)
-
-! return MockResponse(None,404)
-
- #@pytest.mark.django_db
-> class C2Objects(DjangoTestCase):
-> def setUp(self):
-> self.c = Client()
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-
-> self.u.first_name = 'John'
-> self.u.last_name = 'Sander'
-> self.u.save()
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-
-> self.r.c2token = '12'
-> self.r.c2refreshtoken = 'ab'
-> self.r.tokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
-> 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.c2stuff.requests.Session', side_effect=mocked_requests)
-> def test_c2_callback(self, mock_Session):
-> response = self.c.get('/call_back?code=dsdoij232s',follow=True)
-
-
-> self.assertEqual(response.status_code, 200)
-
-
-> @patch('rowers.c2stuff.Session', side_effect=mocked_requests)
-> def test_c2_token_refresh(self, mock_post):
-> response = self.c.get('/rowers/me/c2refresh/',follow=True)
-
-> self.assertEqual(response.status_code, 200)
-
-
-> @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests)
-> @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
-> def test_c2_upload(self, mock_get, mock_post):
-> response = self.c.get('/rowers/workout/1/c2uploadw/')
-
-> 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.c2stuff.requests.post', side_effect=mocked_requests)
-> @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
-> def test_c2_list(self, mock_get, mock_post):
-> response = self.c.get('/rowers/workout/c2list',follow=True)
-
-> self.assertEqual(response.status_code,200)
-
-> @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
-> def test_c2_import(self, mock_get):
-
-> response = self.c.get('/rowers/workout/c2import/12/',follow=True)
-
-> self.assertRedirects(response,
-> expected_url='/rowers/workout/2/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-
-> def test_strokedata(self):
-> with open('rowers/tests/testdata/c2stroketestdata.txt','r') as infile:
-> res = json.load(infile)
-
-> strokedata = pd.DataFrame.from_dict(res['data'])
-
-> with open('rowers/tests/testdata/c2testdata.txt','r') as infile:
-> res = json.load(infile)
-
-> data = res['data']
-
-> from rowers.views import add_workout_from_strokedata
-
-> res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
-
-> def test_strokedatanohr(self):
-> with open('rowers/tests/testdata/c2strokedatanohr.txt','r') as infile:
-> res = json.load(infile)
-
-> strokedata = pd.DataFrame.from_dict(res['data'])
-
-> with open('rowers/tests/testdata/c2testdata.txt','r') as infile:
-> res = json.load(infile)
-
-> data = res['data']
-
-> from rowers.views import add_workout_from_strokedata
-
-
-> res = add_workout_from_strokedata(self.u,1,data,strokedata,source='c2')
-
-! class C2ObjectsTokenExpired(DjangoTestCase):
-! def setUp(self):
-> self.c = Client()
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-
-> self.u.first_name = 'John'
-! self.u.last_name = 'Sander'
-> self.u.save()
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-
-! self.r.c2token = '12'
-! self.r.c2refreshtoken = 'ab'
-> self.r.tokenexpirydate = datetime.datetime.now()-datetime.timedelta(days=1)
-! 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.c2stuff.requests.post', side_effect=mocked_requests)
-> @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
-> def test_c2_list(self, mock_get, mock_post):
-> response = self.c.get('/rowers/workout/c2list',follow=True)
-
-! self.assertEqual(response.status_code,200)
-
-! @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
-! def test_c2_import(self, mock_get):
-
-> response = self.c.get('/rowers/workout/c2import/12/',follow=True)
-
-> self.assertRedirects(response,
-> expected_url='/rowers/workout/2/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-
-
- #@pytest.mark.django_db
-> class StravaObjects(DjangoTestCase):
-> def setUp(self):
-> self.c = Client()
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-
-! self.u.first_name = 'John'
-> self.u.last_name = 'Sander'
-> self.u.save()
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-
-> self.r.stravatoken = '12'
-
-> self.r.save()
-> self.c.login(username='john',password='koeinsloot')
-
-! @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
-! def test_strava_list(self, mock_get):
-! response = self.c.get('/rowers/workout/stravaimport/',follow=True)
-
-! self.assertEqual(response.status_code,200)
-
-> @patch('rowers.utils.requests.get', side_effect=mocked_requests)
-> def test_strava_import(self, mock_get):
-
-> response = self.c.get('/rowers/workout/stravaimport/12',follow=True)
-
-> self.assertRedirects(response,
-> expected_url='/rowers/workout/1/edit',
-> status_code=301,target_status_code=200)
-
-! self.assertEqual(response.status_code, 200)
-
-
-
- #@pytest.mark.django_db
-! class STObjects(DjangoTestCase):
-> def setUp(self):
-> self.c = Client()
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-
-! self.u.first_name = 'John'
-> self.u.last_name = 'Sander'
-! self.u.save()
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-
-
-! self.r.sporttrackstoken = '12'
-! self.r.sporttracksrefreshtoken = '12'
-> self.r.sporttrackstokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
-! 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.sporttracksstuff.requests.post', side_effect=mocked_requests)
-> def test_sporttracks_callback(self, mock_post):
-! response = self.c.get('/sporttracks_callback?code=dsdoij232s',follow=True)
-
-
-! self.assertEqual(response.status_code, 200)
-
-
-> @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
-> def test_sporttracks_token_refresh(self, mock_post):
-> response = self.c.get('/rowers/me/sporttracksrefresh/',follow=True)
-
-> self.assertEqual(response.status_code, 200)
-
-
-> @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
-> @patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests)
-> def test_sporttracks_upload(self, mock_get, mock_post):
-> response = self.c.get('/rowers/workout/1/sporttracksuploadw/')
-
-> 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.sporttracksstuff.requests.get', side_effect=mocked_requests)
-! def test_sporttracks_list(self, mock_get):
-! response = self.c.get('/rowers/workout/sporttracksimport',follow=True)
-
-> self.assertEqual(response.status_code,200)
-
-! @patch('rowers.imports.requests.get', side_effect=mocked_requests)
-! def test_sporttracks_import(self, mock_get):
-
-> response = self.c.get('/rowers/workout/sporttracksimport/12/',follow=True)
-
-> self.assertRedirects(response,
-> expected_url='/rowers/workout/2/edit',
-> status_code=302,target_status_code=200)
-
-! self.assertEqual(response.status_code, 200)
-
-! def test_strokedata(self):
-> with open('rowers/tests/testdata/sporttrackstestdata.txt','r') as infile:
-! data = json.load(infile)
-
-! from rowers.sporttracksstuff import add_workout_from_data
-
-> res = add_workout_from_data(self.u,1,data,data)
-
-> def test_strokedatanohr(self):
-! with open('rowers/tests/testdata/sporttrackstestnohr.txt','r') as infile:
-> data = json.load(infile)
-
-> from rowers.sporttracksstuff import add_workout_from_data
-
-
-
-! res = add_workout_from_data(self.u,1,data,data)
-
- #@pytest.mark.django_db
-> class RunKeeperObjects(DjangoTestCase):
-! def setUp(self):
-> self.c = Client()
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-
-> self.u.first_name = 'John'
-! self.u.last_name = 'Sander'
-> self.u.save()
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-
-
-! self.r.runkeepertoken = '12'
-
-! 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.runkeeperstuff.requests.post', side_effect=mocked_requests)
-> def test_runkeeper_callback(self, mock_post):
-> response = self.c.get('/runkeeper_callback?code=dsdoij232s',follow=True)
-
-> self.assertEqual(response.status_code, 200)
-
-! @patch('rowers.runkeeperstuff.requests.post', side_effect=mocked_requests)
-> @patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests)
-> def test_runkeeper_upload(self, mock_get, mock_post):
-! response = self.c.get('/rowers/workout/1/runkeeperuploadw/')
-
-> 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.runkeeperstuff.requests.get', side_effect=mocked_requests)
-! def test_runkeeper_list(self, mock_get):
-! response = self.c.get('/rowers/workout/runkeeperimport',follow=True)
-
-! self.assertEqual(response.status_code,200)
-
-> @patch('rowers.imports.requests.get', side_effect=mocked_requests)
-> def test_runkeeper_import(self, mock_get):
-
-> response = self.c.get('/rowers/workout/runkeeperimport/12/',follow=True)
-
-> self.assertRedirects(response,
-> expected_url='/rowers/workout/2/edit',
-> status_code=302,target_status_code=200)
-
-! self.assertEqual(response.status_code, 200)
-
-
-
- #@pytest.mark.django_db
-! class UAObjects(DjangoTestCase):
-> def setUp(self):
-> self.c = Client()
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-
-! self.u.first_name = 'John'
-> self.u.last_name = 'Sander'
-! self.u.save()
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-
-
-! self.r.underarmourtoken = '12'
-! self.r.underarmourrefreshtoken = '12'
-> self.r.underarmourtokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
-! 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.imports.requests.post', side_effect=mocked_requests)
-> def test_underarmour_callback(self, mock_post):
-> response = self.c.get('/underarmour_callback?code=dsdoij232s',follow=True)
-
-
-! self.assertEqual(response.status_code, 200)
-
-
-> @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
-> def test_underarmour_token_refresh(self, mock_post):
-> response = self.c.get('/rowers/me/underarmourrefresh/',follow=True)
-
-> self.assertEqual(response.status_code, 200)
-
-
-> @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
-> @patch('rowers.underarmourstuff.requests.get', side_effect=mocked_requests)
-> def test_underarmour_upload(self, mock_get, mock_post):
-> response = self.c.get('/rowers/workout/1/underarmouruploadw/')
-
-> 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.underarmourstuff.requests.get', side_effect=mocked_requests)
-> def test_underarmour_list(self, mock_get):
-> response = self.c.get('/rowers/workout/underarmourimport',follow=True)
-
-! self.assertEqual(response.status_code,200)
-
-! @patch('rowers.imports.requests.get', side_effect=mocked_requests)
-! def test_underarmour_import(self, mock_get):
-
-! response = self.c.get('/rowers/workout/underarmourimport/12/',follow=True)
-
-> self.assertRedirects(response,
-> expected_url='/rowers/workout/2/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-
- #@pytest.mark.django_db
-! class TPObjects(DjangoTestCase):
-> def setUp(self):
-> self.c = Client()
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-
-! self.u.first_name = 'John'
-! self.u.last_name = 'Sander'
-! self.u.save()
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-
-
-> self.r.tptoken = '12'
-> self.r.tprefreshtoken = '12'
-> self.r.tptokenexpirydate = datetime.datetime.now()+datetime.timedelta(days=1)
-> 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.imports.requests.post', side_effect=mocked_requests)
-> def test_tp_callback(self, mock_post):
-> response = self.c.get('/tp_callback?code=dsdoij232s',follow=True)
-
-
-> self.assertEqual(response.status_code, 200)
-
-
-> @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
-> def test_tp_token_refresh(self, mock_post):
-> response = self.c.get('/rowers/me/tprefresh/',follow=True)
-
-> self.assertEqual(response.status_code, 200)
-
-
-> @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
-> @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
-> def test_tp_upload(self, mock_get, mock_post):
-> response = self.c.get('/rowers/workout/1/tpuploadw/')
-
-> 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)
-
-
-
-
- #@pytest.mark.django_db
-> class TestErrorPages(TestCase):
-> def test_error_handlers(self):
-
-! self.assertTrue(urls.handler404.endswith('.error404_view'))
-! self.assertTrue(urls.handler500.endswith('.error500_view'))
-! factory = RequestFactory()
-! request = factory.get('/')
-> response = error404_view(request)
-> self.assertEqual(response.status_code, 404)
-> self.assertIn('404 Page not found', unicode(response))
-> response = error500_view(request)
-> self.assertEqual(response.status_code, 500)
-> self.assertIn('500 Internal Server Error', unicode(response))
-
- #@pytest.mark.django_db
-> class NewUserRegistrationTest(TestCase):
-> def setUp(self):
-> self.c = Client()
-! redis_connection.publish('tasks','KILL')
-
-! def test_newuser(self):
-> form_data = {
-> 'first_name':'Jan',
-> 'last_name':'Roeiert',
-> 'email':'jan@loop.nl',
-> 'username':'janderoeiert',
-> 'password1':'aapindewei2',
-> 'password2':'aapindewei2',
-> 'tos':True,
-> 'weightcategory':'hwt',
-> 'adaptiveclass': 'None',
-> 'sex':'male',
-> 'next':'/rowers/list-workouts',
-> 'birthdate':datetime.datetime(year=1970,month=4,day=2)
-> }
-
-> form = RegistrationFormUniqueEmail(form_data)
-> self.assertTrue(form.is_valid())
-
-! response = self.c.post('/rowers/register', form_data, follow=True)
-
-> self.assertRedirects(response,
-> expected_url='/rowers/me/gdpr-optin/?next=/rowers/list-workouts/',
-> status_code=302,target_status_code=200)
-
-> from django_mailbox.models import Mailbox,MessageAttachment,Message
-
- #@pytest.mark.django_db
-> class AutoExportTests(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()
-> )
-
-> r.c2_auto_export = True
-> r.sporttracks_auto_export = True
-> r.mapmyfitness_auto_export = True
-> r.trainingpeaks_auto_export = True
-
-! r.save()
-
-! nu = datetime.datetime.now()
-! workoutsbox = Mailbox.objects.create(name='workouts')
-> workoutsbox.save()
-! failbox = Mailbox.objects.create(name='Failed')
-> failbox.save()
-
-> filename = 'testdata.csv'
-
-> m = Message(mailbox=workoutsbox,
-> from_header = u.email,
-> subject = filename,
-> body="""
-> ---
-> workouttype: water
-> boattype: 2x
-> ...
-> """)
-> m.save()
-! a2 = 'media/mailbox_attachments/'+filename
-! copyfile('rowers/tests/testdata/'+filename,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 WindowsError:
-! pass
-
-! @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
-! @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
-! def test_emailprocessing(self, mock_post, mock_get):
-> out = StringIO()
-> call_command('processemail', stdout=out, testing=True)
-> self.assertIn('Successfully processed email attachments',out.getvalue())
-
- #@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()
-> )
-
-> 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('requests.get', side_effect=mocked_requests)
-> def test_emailprocessing(self, mock_get):
-> out = StringIO()
-> call_command('processemail', stdout=out,testing=True)
-! self.assertIn('Successfully processed email attachments',out.getvalue())
-
-
- #@pytest.mark.django_db
-> class WorkoutTests(TestCase):
-> def setUp(self):
-> redis_connection.publish('tasks','KILL')
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-> nu = datetime.datetime.now()
-> self.w = Workout.objects.create(name='testworkout',
-> workouttype='water',
-> user=self.r,date=nu.strftime('%Y-%m-%d'),
-> starttime=nu.strftime('%H:%M:%S'),
-> duration="0:55:00",distance=8000)
-
-> def test_checkworkoutuser(self):
-> self.assertEqual(checkworkoutuser(self.u,self.w),True)
-
- #@pytest.mark.django_db
-> class C2Tests(TestCase):
-> def setUp(self):
-! redis_connection.publish('tasks','KILL')
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now()
-> )
-> self.nu = datetime.datetime.now()
-> self.w = Workout.objects.create(name='testworkout',workouttype='water',
-> user=r,date=nu.strftime('%Y-%m-%d'),
-> starttime=nu.strftime('%H:%M:%S'),
-> duration="0:55:00",distance=8000)
-
-> def c2_notokentest(self):
-! thetoken = c2_open(self.u)
- # should raise NoTokenError
-> self.assertRaises(NoTokenError)
-
- #@pytest.mark.django_db
-> class DataTest(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.nu = datetime.datetime.now()
-
-
-! def test_workoutform(self):
-> form_data = {
-> 'name':'test',
-> 'date':'2016-05-01',
-> 'starttime':'07:53:00',
-> 'timezone':'UTC',
-> 'duration':'0:55:00.1',
-> 'distance':8000,
-> 'notes':'Aap noot \n mies',
-> 'weightcategory':'lwt',
-> 'adaptiveclass': 'PR1',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'private':False,
-> }
-> form = WorkoutForm(data=form_data)
-> self.assertTrue(form.is_valid())
-
-> def test_rower_form_withvalidnumbers(self):
-> form_data = {
-> 'max':192,
-> 'rest':48,
-> 'ut2':105,
-> 'ut1':148,
-> 'at':160,
-> 'tr':167,
-> 'an':180,
-> 'weightcategory':'lwt',
-> }
-> form = RowerForm(data=form_data)
-> self.assertTrue(form.is_valid())
-
-
-> def test_rower_form_twoequalvalues(self):
-> form_data = {
-> 'max':192,
-> 'rest':48,
-> 'ut2':105,
-> 'ut1':105,
-> 'at':160,
-> 'an':180,
-> 'tr':167,
-> 'weightcategory':'lwt',
-> }
-! form = RowerForm(data=form_data)
-> self.assertFalse(form.is_valid())
-
-! def test_rower_form_abovemaxallowed(self):
-> form_data = {
-> 'max':300,
-> 'rest':48,
-> 'ut2':105,
-> 'ut1':148,
-> 'at':160,
-> 'an':180,
-> 'tr':167,
-> 'weightcategory':'lwt',
-> }
-> form = RowerForm(data=form_data)
-> self.assertFalse(form.is_valid())
-
-! def test_rower_form_wrongorder(self):
-> form_data = {
-> 'max':192,
-> 'rest':48,
-> 'ut2':20,
-> 'ut1':148,
-> 'at':160,
-> 'an':180,
-> 'tr':167,
-> 'weightcategory':'lwt',
-> }
-> form = RowerForm(data=form_data)
-! self.assertFalse(form.is_valid())
-
-> def test_rower_form_belowminalloed(self):
-> form_data = {
-> 'max':192,
-> 'rest':2,
-> 'ut2':105,
-> 'ut1':148,
-> 'at':160,
-> 'an':180,
-> 'tr':167,
-> 'weightcategory':'lwt',
-> }
-> form = RowerForm(data=form_data)
-> self.assertFalse(form.is_valid())
-
-> def test_rower_form_wrongorder2(self):
-> form_data = {
-> 'max':192,
-> 'rest':48,
-> 'ut2':105,
-> 'ut1':170,
-> 'at':160,
-> 'an':180,
-> 'tr':167,
-> 'weightcategory':'lwt',
-> }
-! form = RowerForm(data=form_data)
-! self.assertFalse(form.is_valid())
-
-> def test_painsled(self):
-> filename = 'rowers/tests/testdata/testdata.csv'
-> f = open(filename,'rb')
-> file_data = {'file': SimpleUploadedFile(f.name, f.read())}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> }
-
-! form = DocumentsForm(form_data,file_data)
-> self.assertTrue(form.is_valid())
-
-! f.close()
-
-! u = User.objects.get(username='john')
-! r = Rower.objects.get(user=u)
-
-> rr = rrower(hrmax=r.max,hrut2=r.ut2,
-> hrut1=r.ut1,hrat=r.at,
-> hrtr=r.tr,hran=r.an,ftp=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')
-
-> w = Workout.objects.create(name='testworkout',workouttype='water',
-> user=r,date=self.nu.strftime('%Y-%m-%d'),
-> starttime=workoutstarttime,
-> duration=duration,distance=totaldist,
-> csvfilename=filename)
-
-
-> fig1 = plots.mkplot(row,'test')
-! res = iplots.interactive_chart(w.id)
-> res = iplots.interactive_chart(w.id,promember=1)
-> res = iplots.interactive_bar_chart(w.id)
-! res = iplots.interactive_bar_chart(w.id,promember=1)
-> res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='time',
-> yparam1='pace',yparam2='hr')
-! res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='distance',
-! yparam1='pace',yparam2='hr')
-> res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='time',
-> yparam1='pace',yparam2='spm')
-> res = iplots.interactive_flex_chart2(w.id,promember=0,xparam='distance',
-> yparam1='pace',yparam2='spm')
-
-> res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='time',
-> yparam1='pace',yparam2='hr')
-> res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='distance',
-> yparam1='pace',yparam2='hr')
-> res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='time',
-> yparam1='pace',yparam2='spm')
-> res = iplots.interactive_flex_chart2(w.id,promember=1,xparam='distance',
-> yparam1='pace',yparam2='spm')
-
-
-
-
- #@pytest.mark.django_db
-> class ViewTest(TestCase):
-> def setUp(self):
-> redis_connection.publish('tasks','KILL')
-! self.c = Client()
-> self.u = User.objects.create_user('john',
-> 'sander@ds.ds',
-> 'koeinsloot')
-> self.r = Rower.objects.create(user=self.u,gdproptin=True,
-> gdproptindate=timezone.now(),
-> rowerplan='coach',
-> )
-! self.nu = datetime.datetime.now()
-
-! def test_upload_view_notloggedin(self):
-! response = self.c.post('/rowers/workout/upload/',follow=True)
-
-
-! self.assertRedirects(response, expected_url='/login/?next=/rowers/workout/upload/',
-! status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-> def test_upload_view_sled(self):
-! self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/testdata.csv'
-! f = open(filename,'rb')
-> file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-
-> f.close()
-
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-> response = self.c.get('/rowers/workout/1/', form_data, follow=True)
-! self.assertEqual(response.status_code, 200)
-
-! response = self.c.get('/rowers/workout/1/edit', form_data, follow=True)
-> self.assertEqual(response.status_code, 200)
-
-
-> response = self.c.get('/rowers/workout/1/histo', form_data, follow=True)
-! self.assertEqual(response.status_code, 200)
-
-> form_data = {
-> 'name':'aap',
-> 'date':'2016-11-05',
-> 'starttime':'09:07:14',
-> 'timezone':'Europe/Berlin',
-> 'duration':'1:00:00.5',
-> 'distance':'15000',
-> 'weightcategory':'hwt',
-> 'adaptiveclass':'PR1',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'private':True,
-> 'notes':'noot mies',
-> }
-> form = WorkoutForm(data=form_data)
-! self.assertTrue(form.is_valid())
-> response = self.c.post('/rowers/workout/1/edit', form_data, follow=True)
-> self.assertEqual(response.status_code, 200)
-
-
-> w = Workout.objects.get(id=1)
-> f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-
-
-
-> def test_upload_view_notloggedin(self):
-! response = self.c.post('/rowers/workout/upload/',follow=True)
-
-
-> self.assertRedirects(response, expected_url='/login/?next=/rowers/workout/upload/',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-> def test_upload_view_sled_negativetime(self):
-! self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/tim.csv'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_C2':False,
-> 'upload_to_Strava':False,
-> 'upload_to_SportTracks':False,
-> 'upload_to_RunKeeper':False,
-> 'upload_to_MapMyFitness':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> 'makeprivate':False,
-> 'landingpage':'workout_edit_view',
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-
-! f.close()
-
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-> response = self.c.get('/rowers/workout/1/', form_data, follow=True)
-! self.assertEqual(response.status_code, 200)
-
-
-! w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-! try:
-> os.remove(f_to_be_deleted+'.gz')
-! except WindowsError:
-! pass
-
-
-
-
-! def test_upload_view_sled_noname(self):
-! self.c.login(username='john',password='koeinsloot')
-
-! filename = 'rowers/tests/testdata/testdata.csv'
-! f = open(filename,'rb')
-! file_data = {'file': f}
-! form_data = {
-! 'title':'',
-! 'workouttype':'rower',
-! 'boattype':'1x',
-! 'notes':'aap noot mies',
-! 'make_plot':False,
-! 'upload_to_c2':False,
-! 'plottype':'timeplot',
-! 'file': f,
-! }
-
-! form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-
-! f.close()
-
-! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-! status_code=302,target_status_code=200)
-
-! self.assertEqual(response.status_code, 200)
-
-! w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-! try:
-! os.remove(f_to_be_deleted+'.gz')
-! except WindowsError:
-! pass
-
-! def test_upload_view_logcard(self):
-! self.c.login(username='john',password='koeinsloot')
-
-! filename = 'rowers/tests/testdata/logcard.csv'
-! f = open(filename,'rb')
-> file_data = {'file': f}
-> form_data = {
-> 'title':'',
-> 'workouttype':'rower',
-> 'boattype': '1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-
-! f.close()
-
-> self.assertRedirects(response,
-> expected_url='/rowers/workout/upload/',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-
-
-
-> def test_upload_view_TCX_CN(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/crewnerddata.tcx'
-! f = open(filename,'rb')
-! file_data = {'file': f}
-
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-> f.close()
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-> filename = 'rowers/tests/testdata/crewnerddata.CSV'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-> form_data = {}
-! form = CNsummaryForm(form_data,file_data)
-
-> response = self.c.post('rowers/workout/1/crewnerdsummary',
-> form_data,
-> follow=True)
-
-> f.close()
-
-! self.assertEqual(response.status_code, 200)
-! w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-! try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-! pass
-
-> def test_upload_view_TCX_SpeedCoach2a(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/Speedcoach2example.csv'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-> f.close()
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-! w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-! try:
-! os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-> def test_upload_view_TCX_SpeedCoach2b(self):
-> self.c.login(username='john',password='koeinsloot')
-
-! filename = 'rowers/tests/testdata/Speedcoach2example.csv'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! f.close()
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-> w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-! try:
-! os.remove(f_to_be_deleted+'.gz')
-! except WindowsError:
-! pass
-
-
-
-> def test_upload_view_TCX_SpeedCoach2c(self):
-> self.c.login(username='john',password='koeinsloot')
-
-! filename = 'rowers/tests/testdata/speedcoach3test3.csv'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! f.close()
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-> w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-! try:
-! os.remove(f_to_be_deleted+'.gz')
-! except WindowsError:
-! pass
-
-
-! def test_upload_view_SpeedCoach2v127(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/SpeedCoach2Linkv1.27.csv'
-! f = open(filename,'rb')
-> file_data = {'file': f}
-
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-> f.close()
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-> w = Workout.objects.get(id=1)
-> f_to_be_deleted = w.csvfilename
-! try:
-! os.remove(f_to_be_deleted+'.gz')
-! except WindowsError:
-! pass
-
-
-
-> def test_upload_view_SpeedCoach2v127intervals(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/SpeedCoach2Link_interval.csv'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-> f.close()
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-
-! self.assertEqual(response.status_code, 200)
-
-! w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-! except WindowsError:
-> pass
-
-
-
-> def test_upload_view_TCX_NoHR(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/NoHR.tcx'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! f.close()
-! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-! status_code=302,target_status_code=200)
-
-> self.assertEqual(response.status_code, 200)
-
-! w = Workout.objects.get(id=1)
-> f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-
-> def test_upload_view_TCX_CN(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/rowinginmotionexample.tcx'
-> f = open(filename,'rb')
-! file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'water',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-! status_code=302,target_status_code=200)
-> self.assertEqual(response.status_code, 200)
-
-! w = Workout.objects.get(id=1)
-> f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-
-> def test_upload_view_RP(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/RP_testdata.csv'
-> f = open(filename,'rb')
-! file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-! status_code=302,target_status_code=200)
-! self.assertEqual(response.status_code, 200)
-
-> w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-
-> def test_upload_view_Mystery(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/mystery.csv'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-! status_code=302,target_status_code=200)
-> self.assertEqual(response.status_code, 200)
-
-! w = Workout.objects.get(id=1)
-> f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-
-> def test_upload_view_RP_interval(self):
-> self.c.login(username='john',password='koeinsloot')
-
-> filename = 'rowers/tests/testdata/RP_interval.csv'
-> f = open(filename,'rb')
-! file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-> self.assertEqual(response.status_code, 200)
-
-> w = Workout.objects.get(id=1)
-> f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-
-
-> def test_upload_view_sled_desktop(self):
-> self.c.login(username='john',password='koeinsloot')
-
-! filename = 'rowers/tests/testdata/painsled_desktop_example.csv'
-! f = open(filename,'rb')
-> file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-! form = DocumentsForm(form_data,file_data)
-
-> response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-> self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-> status_code=302,target_status_code=200)
-> self.assertEqual(response.status_code, 200)
-
-> w = Workout.objects.get(id=1)
-> f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-> def test_upload_view_sled_ergdata(self):
-> self.c.login(username='john',password='koeinsloot')
-
-! filename = 'rowers/tests/testdata/ergdata_example.csv'
-! f = open(filename,'rb')
-> file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-! form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-! status_code=302,target_status_code=200)
-! self.assertEqual(response.status_code, 200)
-
-! w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-! try:
-! os.remove(f_to_be_deleted+'.gz')
-! except WindowsError:
-! pass
-
-! def test_upload_view_sled_boatcoach(self):
-! self.c.login(username='john',password='koeinsloot')
-
-! filename = 'rowers/tests/testdata/boatcoach.csv'
-! f = open(filename,'rb')
-! file_data = {'file': f}
-! form_data = {
-! 'title':'test',
-! 'workouttype':'rower',
-! 'boattype':'1x',
-! 'notes':'aap noot mies',
-! 'make_plot':False,
-! 'upload_to_c2':False,
-! 'plottype':'timeplot',
-! 'file': f,
-! }
-
-! form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-! status_code=302,target_status_code=200)
-! self.assertEqual(response.status_code, 200)
-
-> w = Workout.objects.get(id=1)
-> f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-> def test_upload_view_sled_ergstick(self):
-> self.c.login(username='john',password='koeinsloot')
-
-! filename = 'rowers/tests/testdata/ergstick.csv'
-> f = open(filename,'rb')
-> file_data = {'file': f}
-> form_data = {
-> 'title':'test',
-> 'workouttype':'rower',
-> 'boattype':'1x',
-> 'notes':'aap noot mies',
-> 'make_plot':False,
-> 'upload_to_c2':False,
-> 'plottype':'timeplot',
-> 'file': f,
-> }
-
-> form = DocumentsForm(form_data,file_data)
-
-! response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
-! self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
-! status_code=302,target_status_code=200)
-! self.assertEqual(response.status_code, 200)
-
-! w = Workout.objects.get(id=1)
-! f_to_be_deleted = w.csvfilename
-> try:
-> os.remove(f_to_be_deleted+'.gz')
-> except WindowsError:
-> pass
-
-
- # def test_upload_view_FIT_SpeedCoach2a(self):
- # self.c.login(username='john',password='koeinsloot')
-
- # filename = 'rowers/tests/testdata/3x250m.fit'
- # with open(filename,'rb') as f:
-
- # file_data = {'file': f}
-
- # form_data = {
- # 'title':'test',
- # 'workouttype':'water',
- # 'boattype':'1x',
- # 'notes':'aap noot mies',
- # 'make_plot':False,
- # 'upload_to_c2':False,
- # 'plottype':'timeplot',
- # 'file': f,
- # }
-
- # form = DocumentsForm(form_data,file_data)
-
- # response = self.c.post('/rowers/workout/upload/',
- # form_data, follow=True,
- # format='multipart')
- # f.close()
- # self.assertRedirects(response, expected_url='/rowers/workout/1/edit',
- # status_code=302,target_status_code=200)
-
- # self.assertEqual(response.status_code, 200)
-
- # w = Workout.objects.get(id=1)
- # f_to_be_deleted = w.csvfilename
- # os.remove(f_to_be_deleted+'.gz')
-
- #@pytest.mark.django_db
-> class URLTests(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,rowerplan='coach')
-> self.c = Client()
-> self.c.login(username='john',password='koeinsloot')
-
-> self.nu = datetime.datetime.now()
-> filename = 'rowers/tests/testdata/testdata.csv'
-> self.wotw = Workout.objects.create(name='testworkout',
-> workouttype='water',
-> user=r,date=self.nu.strftime('%Y-%m-%d'),
-> starttime=self.nu.strftime('%H:%M:%S'),
-> duration="0:55:00",distance=8000,
-> csvfilename=filename)
-
-> self.wote = Workout.objects.create(name='testworkout',
-> workouttype='Indoor Rower',
-> user=r,date=self.nu.strftime('%Y-%m-%d'),
-> starttime=self.nu.strftime('%H:%M:%S'),
-> duration="0:55:00",distance=8000,
-> csvfilename=filename)
-
-> powerperc = 100*np.array([r.pw_ut2,
-> r.pw_ut1,
-> r.pw_at,
-> r.pw_tr,r.pw_an])/r.ftp
-
-
-> self.hrdata = {
-> 'hrmax':r.max,
-> 'hrut2':r.ut2,
-> 'hrut1':r.ut1,
-> 'hrat':r.at,
-> 'hrtr':r.tr,
-> 'hran':r.an,
-> 'ftp':r.ftp,
-> 'powerperc':serialize_list(powerperc),
-> 'powerzones':serialize_list(r.powerzones),
-> }
-
-> urlstotest = [
-> '/rowers/400/',
-> '/rowers/403/',
-> '/rowers/404/',
-> '/rowers/500/',
-> '/rowers/502/',
-> '/rowers/1/list-workouts/',
-> '/rowers/1/list-workouts/2016-01-01/2016-12-31',
-> '/rowers/1/ote-bests/',
-> '/rowers/1/ote-bests2/2016-01-01/2016-12-31',
-> '/rowers/about',
-> '/rowers/addmanual/',
-> '/rowers/agegroupcp/30',
-> '/rowers/agegroupcp/30/1',
-> '/rowers/agegrouprecords/male/hwt',
-> '/rowers/agegrouprecords/male/hwt/2000m',
-> '/rowers/agegrouprecords/male/hwt/2000min',
-> '/rowers/ajax_agegroup/45/hwt/male/1',
-> '/rowers/analysis/',
-> '/rowers/analysis/user/1',
-> '/rowers/brochure',
-> '/rowers/courses/upload',
-> '/rowers/createplan/',
-> '/rowers/createplan/user/1/',
-> '/rowers/cumstats/',
-> '/rowers/cumstats/2016-01-01/2016-12-31',
-> '/rowers/cumstats/user/1',
-> '/rowers/cumstats/user/1/2016-01-01/2016-12-31',
-> '/rowers/developers',
-> '/rowers/email/',
-> '/rowers/email/thankyou/',
-> '/rowers/fitness-progress/',
-> '/rowers/fitness-progress/user/1',
-> '/rowers/fitness-progress/user/1/rower',
-> '/rowers/flexall/',
-> '/rowers/flexall/spm/hr/None/',
-> '/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/',
-> '/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/user/1',
-> '/rowers/flexall/user/1/',
-> '/rowers/flexalldata/',
-> '/rowers/help',
-> '/rowers/histo/',
-> '/rowers/histo/user/1',
-> '/rowers/histo/user/1/2016-01-01/2016-12-31',
-> '/rowers/histodata',
-> '/rowers/job-kill/1',
-> '/rowers/jobs-status/',
-> '/rowers/laboratory/',
-> '/rowers/laboratory/user/1',
-> '/rowers/legal',
-> '/rowers/list-courses/',
-> '/rowers/list-graphs/',
-> '/rowers/list-jobs/',
-> '/rowers/list-workouts/',
-> '/rowers/list-workouts/2016-01-01/2016-12-31',
-> '/rowers/list-workouts/2016-01-01/2016-12-31/user/1/',
-> '/rowers/list-workouts/ranking',
-> '/rowers/list-workouts/user/1/',
-> '/rowers/me/calcdps/',
-> '/rowers/me/edit/',
-> '/rowers/me/edit/user/1',
-> '/rowers/me/exportsettings/',
-> '/rowers/me/exportsettings/user/1',
-> '/rowers/me/favoritecharts/',
-> '/rowers/me/favoritecharts/user/1',
-> '/rowers/me/invitation/',
-> '/rowers/me/preferences/',
-> '/rowers/me/preferences/user/1',
-> '/rowers/me/request/',
-> '/rowers/me/teams/',
-> '/rowers/me/workflowconfig2/',
-> '/rowers/me/workflowconfig2/user/1',
-> '/rowers/me/workflowdefault',
-> '/rowers/multi-compare',
-> '/rowers/ote-bests/',
-> '/rowers/ote-bests/2016-01-01/2016-12-31',
-> '/rowers/ote-bests/user/1',
-> '/rowers/ote-bests/user/1/2016-01-01/2016-12-31',
-> '/rowers/ote-bests2/',
-> '/rowers/ote-bests2/2016-01-01/2016-12-31',
-> '/rowers/ote-bests2/user/1',
-> '/rowers/ote-ranking/',
-> '/rowers/ote-ranking/2016-01-01/2016-12-31',
-> '/rowers/ote-ranking/user/1/',
-> '/rowers/ote-ranking/user/1/2016-01-01/2016-12-31',
-> '/rowers/otw-bests/',
-> '/rowers/otw-bests/2016-01-01/2016-12-31',
-> '/rowers/otw-bests/user/1/2016-01-01/2016-12-31',
-> '/rowers/partners',
-> '/rowers/physics',
-> '/rowers/planrequired',
-> '/rowers/promembership',
-> '/rowers/register',
-> '/rowers/register/thankyou/',
-> '/rowers/sessions/',
-> '/rowers/sessions/2016-01-01/2016-12-31',
-> '/rowers/sessions/2016-01-01/2016-12-31/user/1',
-> '/rowers/sessions/coach/',
-> '/rowers/sessions/coach/user/1/',
-> '/rowers/sessions/create/',
-> '/rowers/sessions/create/user/1',
-> '/rowers/sessions/manage/',
-> '/rowers/sessions/manage/user/1/',
-> '/rowers/sessions/multiclone/',
-> '/rowers/sessions/multiclone/user/1/',
-> '/rowers/sessions/multicreate/',
-> '/rowers/sessions/multicreate/user/1/',
-> '/rowers/sessions/print/',
-> '/rowers/sessions/print/user/1',
-> '/rowers/sessions/teamcreate/',
-> '/rowers/sessions/user/1',
-> '/rowers/team-compare-select/',
-> '/rowers/team-compare-select/workout/1',
-> '/rowers/team-compare-select/2016-01-01/2016-12-31',
-> '/rowers/test-job/2',
-> '/rowers/test-job2/2',
-> '/rowers/test_callback',
-> '/rowers/updatefitness',
-> '/rowers/updatefitness/rower',
-> '/rowers/updatefitness/rower/50',
-> '/rowers/user-boxplot',
-> '/rowers/user-boxplot-data',
-> '/rowers/user-boxplot-select/',
-> '/rowers/user-boxplot-select/user/1/',
-> '/rowers/user-boxplot/user/1',
-> '/rowers/user-multiflex-data',
-> '/rowers/user-multiflex-select/',
-> '/rowers/user-multiflex-select/2016-01-01/2016-12-31',
-> '/rowers/user-multiflex-select/user/1/',
-> '/rowers/user-multiflex-select/user/1/2016-01-01/2016-12-31',
-> '/rowers/user-multiflex/',
-> '/rowers/user-multiflex/user/1',
-> '/rowers/workout/1/',
-> '/rowers/workout/1/adddistanceplot',
-> '/rowers/workout/1/adddistanceplot2',
-> '/rowers/workout/1/addotwpowerplot',
-> '/rowers/workout/1/addpiechart',
-> '/rowers/workout/1/addpowerpiechart',
-> '/rowers/workout/1/addstatic',
-> '/rowers/workout/1/addstatic/3',
-> '/rowers/workout/1/addtimeplot',
-> '/rowers/workout/1/addtimeplot2',
-> '/rowers/workout/1/comment',
-> '/rowers/workout/1/darkskywind',
-> '/rowers/workout/1/data',
-> '/rowers/workout/1/edit',
-> '/rowers/workout/1/editintervals',
-> '/rowers/workout/1/flexchart',
-> '/rowers/workout/1/flexchart/spm/hr/None',
-> '/rowers/workout/1/flexchart/spm/hr/None/scatter',
-> '/rowers/workout/1/flexchart/spm/hr/None/scatter/',
-> '/rowers/workout/1/forcecurve',
-> '/rowers/workout/1/get-testscript',
-> '/rowers/workout/1/get-thumbnails',
-> '/rowers/workout/1/histo',
-> '/rowers/workout/1/image',
-> '/rowers/workout/1/instroke',
-> '/rowers/workout/1/interactiveotwplot',
-> '/rowers/workout/1/map',
-> '/rowers/workout/1/otwsetpower',
-> '/rowers/workout/1/recalcsummary/',
-> '/rowers/workout/1/restore',
-> '/rowers/workout/1/smoothenpace',
-> '/rowers/workout/1/split',
-> '/rowers/workout/1/stats',
-> '/rowers/workout/1/stream',
-> '/rowers/workout/1/task',
-> '/rowers/workout/1/test_strokedata',
-> '/rowers/workout/1/toggle-ranking',
-> '/rowers/workout/1/undosmoothenpace',
-> '/rowers/workout/1/unsubscribe',
-> '/rowers/workout/1/updatecp',
-> '/rowers/workout/1/view',
-> '/rowers/workout/1/wind',
-> '/rowers/workout/1/workflow',
-> '/rowers/workout/compare/1/2016-01-01/2016-12-31',
-> '/rowers/workout/fusion/1/',
-> '/rowers/workout/fusion/1/2016-01-01/2016-12-31',
-> '/rowers/workout/upload/',
-> '/rowers/workout/upload/team/',
-> '/rowers/workouts-join',
-> '/rowers/workouts-join-select/',
-> '/rowers/workouts-join-select/2016-01-01/2016-12-31',
-> ]
-
-! lijst = []
-> for url in urlstotest:
-> lijst.append(
-> (url,200)
-> )
-
-> @parameterized.expand(lijst)
-> def test_url_generator(self,url,expected):
-> response = self.c.get(url,follow=True)
-> if response.status_code != expected:
-> print response.status_code
-! self.assertEqual(response.status_code,
-! expected,
-! msg=url+' response status code not 200')
-
-
- #@pytest.mark.django_db
-> class subroutinetests(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)
-! nu = datetime.datetime.now()
-> filename = 'rowers/tests/testdata/testdata.csv'
-> self.w = Workout.objects.create(name='testworkout',
-> workouttype='water',
-> user=r,date=nu.strftime('%Y-%m-%d'),
-> starttime=nu.strftime('%H:%M:%S'),
-> duration="0:55:00",distance=8000,
-> csvfilename=filename)
-
-
-> def c2stuff(self):
-> data = c2stuff.createc2workoutdata(self.w)
-! jsond = json.dumps(data)
-! data = c2stuff.createc2workoutdata_as_splits(w)
-> jsond = json.dumps(data)
-
-
-
- #@pytest.mark.django_db
-> class PlotTests(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)
-! self.nu = datetime.datetime.now()
-> filename = 'rowers/tests/testdata/testdata.csv'
-> self.wotw = Workout.objects.create(name='testworkout',
-> workouttype='water',
-> user=r,date=self.nu.strftime('%Y-%m-%d'),
-> starttime=self.nu.strftime('%H:%M:%S'),
-> duration="0:55:00",distance=8000,
-> csvfilename=filename)
-
-> self.wote = Workout.objects.create(name='testworkout',
-> workouttype='Indoor Rower',
-> user=r,date=self.nu.strftime('%Y-%m-%d'),
-> starttime=self.nu.strftime('%H:%M:%S'),
-> duration="0:55:00",distance=8000,
-> csvfilename=filename)
-
- # timestr = strftime("%Y%m%d-%H%M%S")
- # imagename = f1+timestr+'.png'
- # fullpathimagename = 'static/plots/'+imagename
-> powerperc = 100*np.array([r.pw_ut2,
-> r.pw_ut1,
-> r.pw_at,
-> r.pw_tr,r.pw_an])/r.ftp
-
-
-> self.hrdata = {
-> 'hrmax':r.max,
-> 'hrut2':r.ut2,
-> 'hrut1':r.ut1,
-> 'hrat':r.at,
-> 'hrtr':r.tr,
-> 'hran':r.an,
-> 'ftp':r.ftp,
-> 'powerperc':serialize_list(powerperc),
-> 'powerzones':serialize_list(r.powerzones),
-> }
-
-
-! def test_ote_plots(self):
-! w = self.wote
-> f1 = 'testdata.csv'[:-4]
-> timestr = strftime("%Y%m%d-%H%M%S")
-> imagename = f1+timestr+'.png'
-> fullpathimagename = 'static/plots/'+imagename
- # make plot - asynchronous task
-> plotnr = 1
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 1
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 2
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 3
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 4
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-! except WindowsError:
-> pass
-
-> plotnr = 5
-! if (w.workouttype=='water'):
-> plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-> pass
-
-> plotnr = 6
-! if (w.workouttype=='water'):
-> plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-> pass
-
-> plotnr = 7
-! if (w.workouttype=='water'):
-> plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-> pass
-
-> plotnr = 8
-! if (w.workouttype=='water'):
-> plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-> pass
-
-> plotnr = 13
-! if (w.workouttype=='water'):
-> plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-> pass
-
-> def test_otw_plots(self):
-! w = self.wotw
-> f1 = 'testdata.csv'[:-4]
-> timestr = strftime("%Y%m%d-%H%M%S")
-> imagename = f1+timestr+'.png'
-> fullpathimagename = 'static/plots/'+imagename
- # make plot - asynchronous task
-> plotnr = 1
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 1
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 2
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 3
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 4
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-> res = handle_makeplot(f1,w.csvfilename,
-> w.name,self.hrdata,plotnr,imagename)
-> i = GraphImage(workout=w,creationdatetime=self.nu,
-> filename=fullpathimagename)
-> try:
-> os.remove(fullpathimagename)
-> except WindowsError:
-> pass
-
-> plotnr = 5
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-! res = handle_makeplot(f1,w.csvfilename,
-! w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-! pass
-
-! plotnr = 6
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-! res = handle_makeplot(f1,w.csvfilename,
-! w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-! pass
-
-! plotnr = 7
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-! res = handle_makeplot(f1,w.csvfilename,
-! w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-! pass
-
-! plotnr = 8
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-! res = handle_makeplot(f1,w.csvfilename,
-! w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-! pass
-
-! plotnr = 9
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-! res = handle_makeplot(f1,w.csvfilename,
-! w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-! pass
-
-! plotnr = 13
-! if (w.workouttype=='water'):
-! plotnr = plotnr+3
-
-! res = handle_makeplot(f1,w.csvfilename,
-! w.name,self.hrdata,plotnr,imagename)
-! i = GraphImage(workout=w,creationdatetime=self.nu,
-! filename=fullpathimagename)
-! try:
-! os.remove(fullpathimagename)
-! except WindowsError:
-! pass
diff --git a/rowers/views.py b/rowers/views.py
index 77299f11..9450d9cb 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -38,6 +38,7 @@ from django.views.generic.edit import UpdateView,DeleteView
from django.http import (
HttpResponse, HttpResponseRedirect,
+ JsonResponse,
HttpResponseForbidden, HttpResponseNotAllowed,
HttpResponseNotFound,Http404
)
@@ -227,6 +228,7 @@ class JSONResponse(HttpResponse):
kwargs['content_type'] = 'application/json'
super(JSONResponse, self).__init__(content, **kwargs)
+
def getrequestrower(request,rowerid=0,userid=0,notpermanent=False):
userid = int(userid)
@@ -12038,7 +12040,10 @@ def workout_toggle_ranking(request,id=0):
row.save()
if is_ajax:
- return JSONResponse({'result':row.rankingpiece})
+ response = JSONResponse({'result':row.rankingpiece},
+ content_type='application/json')
+
+ return response
else:
url = reverse(workouts_view)
response = HttpResponseRedirect(url)
From 7e8cb40d464097c19dc8456074ef78d28bbf6843 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Fri, 4 Jan 2019 08:27:01 +0100
Subject: [PATCH 11/18] adding multi compare test
---
rowers/tests/test_fakers.py | 140 ++++++++++++++++++++++++++++++++++++
1 file changed, 140 insertions(+)
create mode 100644 rowers/tests/test_fakers.py
diff --git a/rowers/tests/test_fakers.py b/rowers/tests/test_fakers.py
new file mode 100644
index 00000000..c7dfb940
--- /dev/null
+++ b/rowers/tests/test_fakers.py
@@ -0,0 +1,140 @@
+#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.forms import (
+ DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail,
+ ChartParamChoiceForm,WorkoutMultipleCompareForm)
+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 django_mailbox.models import Mailbox,MessageAttachment,Message
+
+from rowers.tests.mocks import *
+
+from rowers.models import *
+
+import factory
+from faker import Factory
+
+faker = Factory.create()
+
+filename = 'rowers/tests/testdata/testdata.csv'
+
+row = rdata(filename)
+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)
+duration = datetime.time(hour=hours,minute=minutes,second=seconds)
+
+workoutdate = row.rowdatetime.strftime('%Y-%m-%d')
+workoutstarttime = row.rowdatetime.strftime('%H:%M:%S')
+
+nu = datetime.datetime.now()
+
+class UserFactory(factory.DjangoModelFactory):
+ class Meta:
+ model = User
+
+ email = faker.email()
+ username = faker.profile()['username']
+
+ first_name = faker.name().split(' ')[0]
+ last_name = faker.name().split(' ')[0]
+
+class WorkoutFactory(factory.DjangoModelFactory):
+ class Meta:
+ model = Workout
+
+ name = factory.LazyAttribute(lambda _: faker.word())
+ notes = faker.text()
+ startdatetime = row.rowdatetime
+ starttime = workoutstarttime
+ workouttype='water'
+ date=timezone.now().date()
+ duration=duration
+ distance=totaldist
+ csvfilename=filename
+
+class ModelObjectsTest(TestCase):
+ def setUp(self):
+ self.u = UserFactory()
+ self.r = Rower.objects.create(user=self.u,
+ birthdate=faker.profile()['birthdate'],
+ gdproptin=True)
+
+ self.c = Client()
+
+ def test_workouts_compare(self):
+ user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+
+ url = '/rowers/team-compare-select/workout/1/team/0/user/1/'
+
+ response = self.c.get(url,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'chartform':'Compare',
+ 'plottype':'scatter',
+ 'teamid':0,
+ 'workouts':['1','2','3'],
+ 'xparam':'distance',
+ 'yparam':'hr',
+ }
+
+ form = WorkoutMultipleCompareForm(form_data)
+ chartform = ChartParamChoiceForm(form_data)
+ self.assertTrue(form.is_valid)
+ self.assertTrue(chartform.is_valid)
+
+ response = self.c.post('/rowers/multi-compare',form_data,follow=True)
+
+ self.assertEqual(response.status_code,200)
From 50928cba32e720d46ae50c27612a654c07124618 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Fri, 4 Jan 2019 09:14:14 +0100
Subject: [PATCH 12/18] changed links to paidplans
was promembership
---
rowers/templates/about_us.html | 2 +-
rowers/templates/advancededit.html | 18 ++---
rowers/templates/advancedotw.html | 24 +++---
rowers/templates/basebase.html | 2 +-
rowers/templates/comparisonchart2.html | 4 +-
rowers/templates/flexchart2.html | 36 ++++-----
rowers/templates/imports.html | 2 +-
rowers/templates/menu_workouts.html | 2 +-
rowers/templates/rankings.html | 2 +-
rowers/templates/registeremail.html | 2 +-
rowers/views.py | 108 ++++++++++++-------------
templates/newbase.html | 6 +-
templates/newbasefront.html | 4 +-
13 files changed, 106 insertions(+), 106 deletions(-)
diff --git a/rowers/templates/about_us.html b/rowers/templates/about_us.html
index 1d64d9b4..c178aa32 100644
--- a/rowers/templates/about_us.html
+++ b/rowers/templates/about_us.html
@@ -93,7 +93,7 @@ and inspired by the RowPro Dan Burpee spreadsheet
We offer three plans. Click on the name of the plan to find out more:
- - Pro Membership,
+
- Pro Membership,
offering additional rowing metrics and analysis
tools for individual rowers.
- Self-Coach Membership,
diff --git a/rowers/templates/advancededit.html b/rowers/templates/advancededit.html
index d0d4feaf..5ab7140b 100644
--- a/rowers/templates/advancededit.html
+++ b/rowers/templates/advancededit.html
@@ -16,7 +16,7 @@
{{ workout.name }} - Advanced
{% if user.rower.rowerplan == 'basic' %}
Functionality marked with an asterisk (*) is limited to the paid plans. See
- the page about Pro membership
+ the page about Pro membership
for more information and to sign up for Pro Membership
{% endif %}
@@ -62,7 +62,7 @@
{% if user|is_promember %}
Compare Workouts
{% else %}
- Compare Workouts*
+ Compare Workouts*
{% endif %}
Compare this workout to other workouts. Plot HR, SPM, or pace vs time or distance for the two workouts.
@@ -82,7 +82,7 @@
{% if user|is_promember %}
Edit Intervals
{% else %}
- Edit Intervals*
+ Edit Intervals*
{% endif %}
Enter or change the interval and summary data for your workout
@@ -98,7 +98,7 @@
{% if user|is_promember %}
Dist Metrics Plot
{% else %}
- Dist Metrics Plot*
+ Dist Metrics Plot*
{% endif %}
@@ -110,7 +110,7 @@
{% if user|is_promember %}
Time Metrics Plot
{% else %}
- Time Metrics Plot*
+ Time Metrics Plot*
{% endif %}
@@ -122,7 +122,7 @@
{% if user|is_promember %}
Power Histogram
{% else %}
- Power Histogram*
+ Power Histogram*
{% endif %}
@@ -136,7 +136,7 @@
{% if user|is_promember %}
Glue
{% else %}
- Glue*
+ Glue*
{% endif %}
@@ -149,7 +149,7 @@
{% if user|is_promember %}
Sensor Fusion
{% else %}
- Sensor Fusion*
+ Sensor Fusion*
{% endif %}
@@ -161,7 +161,7 @@
{% if user|is_promember %}
Split Workout
{% else %}
- Split Workout*
+ Split Workout*
{% endif %}
diff --git a/rowers/templates/advancedotw.html b/rowers/templates/advancedotw.html
index 4e8c0924..56d5a322 100644
--- a/rowers/templates/advancedotw.html
+++ b/rowers/templates/advancedotw.html
@@ -16,7 +16,7 @@
{{ workout.name }} - Advanced OTW
{% if user.rower.rowerplan == 'basic' %}
Functionality marked with an asterisk (*) is limited to the paid plans. See
- the page about Pro membership
+ the page about Pro membership
for more information and to sign up for Pro Membership
{% endif %}
@@ -60,7 +60,7 @@
{% if user|is_promember %}
Compare Workouts
{% else %}
-
Compare Workouts*
+
Compare Workouts*
{% endif %}
@@ -82,7 +82,7 @@
{% if user|is_promember %}
Edit Intervals
{% else %}
- Edit Intervals*
+ Edit Intervals*
{% endif %}
Enter or change the interval and summary data for your workout
@@ -99,7 +99,7 @@
{% if user|is_promember %}
CrewNerd Summary
{% else %}
-
CrewNerd Summary*
+
CrewNerd Summary*
{% endif %}
@@ -113,7 +113,7 @@
{% if user|is_promember %}
Stroke Profile (Empower)
{% else %}
-
Stroke Profile (Empower)*
+
Stroke Profile (Empower)*
{% endif %}
Analyze your stroke force profile (need Empower Oarlock data)
@@ -126,7 +126,7 @@
{% if user|is_promember %}
OTW Power Plot
{% else %}
- OTW Power Plot*
+ OTW Power Plot*
{% endif %}
Note: You must run the OTW calculations under Geeky Stuff first. Otherwise the plot will be empty
@@ -146,7 +146,7 @@
{% if user|is_promember %}
Geeky Stuff
{% else %}
-
Geeky Stuff*
+
Geeky Stuff*
{% endif %}
@@ -161,7 +161,7 @@
{% if user|is_promember %}
Smooth out Pace Data
{% else %}
-
Smooth out Pace Data*
+
Smooth out Pace Data*
{% endif %}
@@ -178,7 +178,7 @@
{% if user|is_promember %}
Raw Data
{% else %}
-
Reset Smoothing*
+
Reset Smoothing*
{% endif %}
@@ -193,7 +193,7 @@
{% if user|is_promember %}
Glue
{% else %}
- Glue*
+ Glue*
{% endif %}
@@ -205,7 +205,7 @@
{% if user|is_promember %}
Sensor Fusion
{% else %}
- Sensor Fusion*
+ Sensor Fusion*
{% endif %}
@@ -217,7 +217,7 @@
{% if user|is_promember %}
Split Workout
{% else %}
- Split Workout*
+ Split Workout*
{% endif %}
diff --git a/rowers/templates/basebase.html b/rowers/templates/basebase.html
index 41dd1dfb..98f30743 100644
--- a/rowers/templates/basebase.html
+++ b/rowers/templates/basebase.html
@@ -98,7 +98,7 @@
{% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %}
Pro Member
{% else %}
-
+
{% endif %}
diff --git a/rowers/templates/comparisonchart2.html b/rowers/templates/comparisonchart2.html
index 1fd119fe..93a996b8 100644
--- a/rowers/templates/comparisonchart2.html
+++ b/rowers/templates/comparisonchart2.html
@@ -74,7 +74,7 @@
{% endfor %}
{% else %}
{% for key, value in axchoicespro.items %}
- {{ value }}
+ {{ value }}
{% endfor %}
{% endif %}
@@ -98,7 +98,7 @@
{% else %}
{% for key, value in axchoicespro.items %}
{% if key not in noylist %}
- {{ value }} (Pro)
+ {{ value }} (Pro)
{% endif %}
{% endfor %}
{% endif %}
diff --git a/rowers/templates/flexchart2.html b/rowers/templates/flexchart2.html
index 8dbf755f..253bc0c7 100644
--- a/rowers/templates/flexchart2.html
+++ b/rowers/templates/flexchart2.html
@@ -76,14 +76,14 @@
Work per Stroke
Drive Speed
{% else %}
- Power (Pro)
- HR (Pro)
- SPM (Pro)
- Peak Force (Pro)
- Average Force (Pro)
- Drive Length (Pro)
- Work per Stroke (Pro)
- Drive Speed (Pro)
+ Power (Pro)
+ HR (Pro)
+ SPM (Pro)
+ Peak Force (Pro)
+ Average Force (Pro)
+ Drive Length (Pro)
+ Work per Stroke (Pro)
+ Drive Speed (Pro)
{% endif %}
@@ -103,11 +103,11 @@
Work per Stroke
Drive Speed
{% else %}
- Peak Force (Pro)
- Average Force (Pro)
- Drive Length (Pro)
- Work per Stroke (Pro)
- Drive Speed (Pro)
+ Peak Force (Pro)
+ Average Force (Pro)
+ Drive Length (Pro)
+ Work per Stroke (Pro)
+ Drive Speed (Pro)
{% endif %}
@@ -126,11 +126,11 @@
Work per Stroke
Drive Speed
{% else %}
- Peak Force (Pro)
- Average Force (Pro)
- Drive Length (Pro)
- Work per Stroke (Pro)
- Drive Speed (Pro)
+ Peak Force (Pro)
+ Average Force (Pro)
+ Drive Length (Pro)
+ Work per Stroke (Pro)
+ Drive Speed (Pro)
{% endif %}
None
diff --git a/rowers/templates/imports.html b/rowers/templates/imports.html
index 87dbd002..ceb31260 100644
--- a/rowers/templates/imports.html
+++ b/rowers/templates/imports.html
@@ -115,7 +115,7 @@
to the partner site
These settings only have effect if you are a user on one
- of the paid plans
+ of the paid plans