from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from .statements import * from http.cookies import SimpleCookie nu = datetime.datetime.now() from rowers.views import * from rowers.views.analysisviews import histodata class ListWorkoutTest(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError,OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') @patch('rowers.dataprep.myqueue') def test_list_workouts(self, mocked_sqlalchemy, mocked_read_data, mocked_myqueue): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() startdate = arrow.get(startdate).datetime enddate = arrow.get(startdate).datetime form_data = { 'startdate':startdate, 'enddate':enddate, } workouts = Workout.objects.filter(startdatetime__gte=startdate, startdatetime__lte=enddate) url = '/rowers/list-workouts/' response = self.c.post(url, form_data) self.assertEqual(response.status_code,200) class PlannedSessionTests(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() self.user_sessions = SessionFactory.create_batch( 5, manager=self.u) for session in self.user_sessions: session.rower.add(self.r) session.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError,OSError): pass def test_ics_download(self): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) response = self.c.get('/rowers/sessions/sendcalendar/') self.assertEqual(response.status_code,200) startdate, enddate = get_dates_timeperiod(response.wsgi_request) filename = 'training_plan_{u}_{d1}_{d2}.ics'.format( u = self.u.username, d1 = startdate.strftime("%Y%m%d"), d2 = enddate.strftime("%Y%m%d"), ) self.assertEqual( response.get('Content-Disposition'), 'attachment; filename="{name}"'.format(name=filename) ) class ForcecurveTest(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() result = get_random_file(filename='rowers/tests/testdata/quiske_in_stroke.csv') self.winstroke = WorkoutFactory(user=self.r, csvfilename=result['filename'], starttime=result['starttime'], startdatetime=result['startdatetime'], duration=result['duration'], distance=result['totaldist'], workouttype = 'water', ) self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError,OSError): pass @patch('rowers.dataprep.read_data',side_effect = mocked_read_data) def test_forcecurve_plot(self, mocked_read_data): login = self.c.login(username=self.u.username, password = self.password) self.assertTrue(login) encoded1 = str(encoder.encode_hex(1)) url = '/rowers/workout/'+encoded1+'/forcecurve/' response = self.c.get(url) self.assertEqual(response.status_code,200) # saving form_data = { 'spm_min': 19, 'spm_max': 25, 'dist_min': 0, 'dist_max': 10000, 'work_min': 0, 'work_max': 3444, 'notes': 'aap', 'name': 'sdsd', 'includereststrokes': True, 'plottype':'none', '_save_as_new':'Save' } form = ForceCurveOptionsForm(form_data) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) response = self.c.post(url, form_data) self.assertEqual(response.status_code,200) url = '/rowers/analysis/forcecurveanalysis/' response = self.c.get(url) self.assertEqual(response.status_code,200) url = '/rowers/analysis/forcecurveanalysis/1/delete/' response = self.c.get(url) self.assertEqual(response.status_code, 200) form_data = {} response = self.c.post(url, form_data, follow=True) expected_url = '/rowers/analysis/forcecurveanalysis/' self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) def test_instroke_analysis(self): login = self.c.login(username=self.u.username, password = self.password) self.assertTrue(login) encoded1 = str(encoder.encode_hex(self.winstroke.id)) url = '/rowers/workout/'+encoded1+'/instroke/interactive/' response = self.c.get(url) self.assertEqual(response.status_code,200) # saving form_data = { 'spm_min': 19, 'spm_max': 25, 'activeminutesmin': 0, 'activeminutesmax': 10, 'individual_curves': False, 'notes': 'aap', 'name': 'sdsd', 'metric': 'boat accelerator curve', '_save_as_new':'Save' } form = InstrokeForm(form_data,choices=['boat accelerator curve', 'oar angle velocity curve']) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) response = self.c.post(url, form_data) self.assertEqual(response.status_code,200) url = '/rowers/analysis/instrokeanalysis/' response = self.c.get(url) self.assertEqual(response.status_code,200) url = '/rowers/analysis/instrokeanalysis/1/delete/' response = self.c.get(url) self.assertEqual(response.status_code, 200) form_data = {} response = self.c.post(url, form_data, follow=True) expected_url = '/rowers/analysis/instrokeanalysis/' self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) class WorkoutCompareTestNew(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') def test_workouts_compare(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = '/rowers/user-analysis-select/compare/' response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_workouts_compare_submit(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass form_data = { 'function':'compare', 'xparam':'hr', 'plotfield':'spm', 'yparam':'pace', 'yaxis2':'hr', 'groupby':'spm', 'palette':'monochrome_blue', 'xaxis':'time', 'yaxis1':'power', 'yaxis2':'hr', 'startdate':startdate, 'enddate':enddate, 'plottype':'scatter', 'spmmin':15, 'spmmax':55, 'workmin':0, 'workmax':1500, 'includereststrokes':False, 'modality':'all', 'waterboattype':['1x','2x','4x'], 'workouts':[1,2,3] } form = AnalysisChoiceForm(form_data) optionsform = AnalysisOptionsForm(form_data) dateform = DateRangeForm(form_data) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) self.assertTrue(optionsform.is_valid()) self.assertTrue(dateform.is_valid()) response = self.c.post('/rowers/user-analysis-select/',form_data) self.assertEqual(response.status_code,200) class WorkoutBoxPlotTestNew(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') def test_workouts_boxplot(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = '/rowers/user-analysis-select/boxplot/' response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_workouts_boxplot_submit(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass form_data = { 'function':'boxplot', 'xparam':'hr', 'plotfield':'spm', 'yparam':'pace', 'groupby':'spm', 'palette':'monochrome_blue', 'xaxis':'time', 'yaxis1':'power', 'yaxis2':'hr', 'startdate':startdate, 'enddate':enddate, 'plottype':'scatter', 'spmmin':15, 'spmmax':55, 'workmin':0, 'workmax':1500, 'includereststrokes':False, 'modality':'all', 'waterboattype':['1x','2x','4x'], 'workouts':[1,2,3] } form = AnalysisChoiceForm(form_data) optionsform = AnalysisOptionsForm(form_data) dateform = DateRangeForm(form_data) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) self.assertTrue(optionsform.is_valid()) self.assertTrue(dateform.is_valid()) response = self.c.post('/rowers/user-analysis-select/',form_data) self.assertEqual(response.status_code,200) class WorkoutHistoTestNew(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') def test_workouts_histo(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = '/rowers/user-analysis-select/histo/' response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_workouts_histo_submit(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass form_data = { 'function':'histo', 'xparam':'hr', 'plotfield':'spm', 'yparam':'pace', 'groupby':'spm', 'palette':'monochrome_blue', 'xaxis':'time', 'yaxis1':'power', 'yaxis2':'hr', 'startdate':startdate, 'enddate':enddate, 'plottype':'scatter', 'spmmin':15, 'spmmax':55, 'workmin':0, 'workmax':1500, 'includereststrokes':False, 'modality':'all', 'waterboattype':['1x','2x','4x'], 'workouts':[1,2,3] } form = AnalysisChoiceForm(form_data) optionsform = AnalysisOptionsForm(form_data) dateform = DateRangeForm(form_data) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) self.assertTrue(optionsform.is_valid()) self.assertTrue(dateform.is_valid()) response = self.c.post('/rowers/user-analysis-select/',form_data) self.assertEqual(response.status_code,200) class History(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(20, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_workouts_history(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = '/rowers/history/' response = self.c.get(url) self.assertEqual(response.status_code,200) url = '/rowers/history/data/' response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_workouts_history_submit(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=50)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=50)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass form_data = { 'startdate':startdate, 'enddate':enddate, 'workouttype':'rower', 'yaxis':'TRIMP', } form = HistorySelectForm(form_data) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) response = self.c.get('/rowers/history/',form_data) self.assertEqual(response.status_code,200) response = self.c.get('/rowers/history/data/',form_data,xhr=True) self.assertEqual(response.status_code,200) class GoldMedalScores(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(20, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() result = get_random_file(filename='rowers/tests/testdata/onwater2.csv') self.w1 = WorkoutFactory(user=self.r, csvfilename=result['filename'], starttime=result['starttime'], startdatetime=result['startdatetime'], duration=result['duration'], distance=result['totaldist'], workouttype = 'water', rankingpiece=True ) result = get_random_file(filename='rowers/tests/testdata/onwater2.csv') self.w2 = WorkoutFactory(user=self.r, csvfilename=result['filename'], starttime=result['starttime'], startdatetime=result['startdatetime'], duration=result['duration'], distance=result['totaldist'], workouttype = 'water', rankingpiece=True ) self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') def test_workouts_goldmedalscores(self, mocked_sqlalchemy, mocked_read_data): ws = Workout.objects.filter(rankingpiece=True) self.assertEqual(ws.count(),2) login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = '/rowers/goldmedalscores/' response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_workouts_goldmedalscores_submit(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=50)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=50)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass form_data = { 'startdate':startdate, 'enddate':enddate, } form = DateRangeForm(form_data) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) response = self.c.post('/rowers/goldmedalscores/',form_data) self.assertEqual(response.status_code,200) class WorkoutFlexallTestNew(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') def test_workouts_flexall(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = '/rowers/user-analysis-select/flexall/' response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_workouts_flexall_submit(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass form_data = { 'function':'flexall', 'xparam':'hr', 'plotfield':'spm', 'yparam':'pace', 'groupby':'spm', 'palette':'monochrome_blue', 'xaxis':'time', 'yaxis1':'power', 'yaxis2':'hr', 'startdate':startdate, 'enddate':enddate, 'plottype':'scatter', 'spmmin':15, 'spmmax':55, 'workmin':0, 'workmax':1500, 'includereststrokes':False, 'modality':'all', 'waterboattype':['1x','2x','4x'], 'workouts':[1,2,3] } form = AnalysisChoiceForm(form_data) optionsform = AnalysisOptionsForm(form_data) dateform = DateRangeForm(form_data) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) self.assertTrue(optionsform.is_valid()) self.assertTrue(dateform.is_valid()) response = self.c.post('/rowers/user-analysis-select/',form_data) self.assertEqual(response.status_code,200) class WorkoutStatsTestNew(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() today = datetime.date.today() i = 0 for w in self.user_workouts: w.date = today-datetime.timedelta(days=i) i += 1 w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') def test_workouts_stats(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = '/rowers/user-analysis-select/stats/' response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) @patch('rowers.dataprep.read_cols_df_sql', side_effect=mocked_read_cols_df_sql) def test_analysis_data(self, mocked_sqlalchemy, mocked_read_data, mocked_read_cols_df_sql, ): startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass options = { 'function':'flexall', 'xparam':'hr', 'plotfield':'spm', 'yparam':'pace', 'groupby':'spm', 'binsize':1, 'ploterrorbars':True, 'palette':'monochrome_blue', 'xaxis':'time', 'yaxis1':'power', 'yaxis2':'hr', 'startdate':startdate, 'enddate':enddate, 'plottype':'scatter', 'trendline':True, 'spmmin':15, 'spmmax':55, 'workmin':0, 'workmax':1500, 'cpfit':'data', 'piece': 4, 'cpoverlay':True, 'cpfit':'data', 'includereststrokes':False, 'modality':'all', 'waterboattype':['1x','2x','4x'], 'ids':[1,2,3], 'userid':self.u.id, } workouts = self.user_workouts script, div = boxplotdata(workouts,options) script, div = trendflexdata(workouts,options) script, div = histodata(workouts,options) script, div = cpdata(workouts,options) script, div = flexalldata(workouts,options) script, div = statsdata(workouts,options) script, div = comparisondata(workouts,options) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) @patch('rowers.dataprep.read_cols_df_sql', side_effect=mocked_read_cols_df_sql) def test_analysis_data2(self, mocked_sqlalchemy, mocked_read_data, mocked_read_cols_df_sql, ): startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass options = { 'function':'flexall', 'xparam':'spm', 'plotfield':'spm', 'yparam':'power', 'groupby':'spm', 'binsize':1, 'ploterrorbars':True, 'palette':'monochrome_blue', 'xaxis':'time', 'yaxis1':'power', 'yaxis2':'hr', 'startdate':startdate, 'enddate':enddate, 'plottype':'scatter', 'spmmin':15, 'spmmax':55, 'workmin':0, 'workmax':1500, 'cpfit':'data', 'piece': 4, 'cpoverlay':True, 'cpfit':'data', 'includereststrokes':False, 'modality':'all', 'waterboattype':['1x','2x','4x'], 'ids':[1,2,3], 'userid':self.u.id, } workouts = self.user_workouts script, div = boxplotdata(workouts,options) script, div = trendflexdata(workouts,options) script, div = histodata(workouts,options) script, div = cpdata(workouts,options) script, div = flexalldata(workouts,options) script, div = statsdata(workouts,options) script, div = comparisondata(workouts,options) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) @patch('rowers.dataprep.read_cols_df_sql', side_effect=mocked_read_cols_df_sql) def test_analysis_data2(self, mocked_sqlalchemy, mocked_read_data, mocked_read_cols_df_sql, ): startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass options = { 'function':'flexall', 'xparam':'hr', 'plotfield':'spm', 'yparam':'pace', 'groupby':'spm', 'binsize':1, 'ploterrorbars':True, 'palette':'monochrome_blue', 'xaxis':'time', 'yaxis1':'power', 'yaxis2':'hr', 'startdate':startdate.strftime('%Y-%m-%d'), 'enddate':enddate.strftime('%Y-%m-%d'), 'plottype':'scatter', 'spmmin':15, 'spmmax':55, 'workmin':0, 'workmax':1500, 'cpfit':'data', 'piece': 4, 'cpoverlay':True, 'cpfit':'data', 'includereststrokes':False, 'modality':'all', 'waterboattype':['1x','2x','4x'], 'ids':[1,2,3], 'userid':self.u.id, 'function':'boxplot' } workouts = self.user_workouts request = self.factory request.user = self.u request.META = { 'HTTP_X_REQUESTED_WITH':'XMLHttpRequest' } request.COOKIES = SimpleCookie({'name': 'bla'}) # adding session get_response = MagicMock() middleware = SessionMiddleware(get_response) middleware.process_request(request) request.session.save() session = request.session options['ids'] = [w.id for w in workouts] session['options'] = options session.save() response = analysis_view_data(request) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data', side_effect=mocked_read_data) def test_workouts_stats_submit(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() # make sure the dates are not naive try: startdate = pytz.utc.localize(startdate) except (ValueError, AttributeError): pass try: enddate = pytz.utc.localize(enddate) except (ValueError, AttributeError): pass form_data = { 'function':'stats', 'xparam':'hr', 'plotfield':'spm', 'yparam':'pace', 'groupby':'spm', 'palette':'monochrome_blue', 'xaxis':'time', 'yaxis1':'power', 'yaxis2':'hr', 'startdate':startdate, 'enddate':enddate, 'plottype':'scatter', 'spmmin':15, 'spmmax':55, 'workmin':0, 'workmax':1500, 'includereststrokes':False, 'modality':'all', 'waterboattype':['1x','2x','4x'], 'workouts':[1,2,3] } form = AnalysisChoiceForm(form_data) optionsform = AnalysisOptionsForm(form_data) dateform = DateRangeForm(form_data) result = form.is_valid() if not result: print(form.errors) self.assertTrue(form.is_valid()) self.assertTrue(optionsform.is_valid()) self.assertTrue(dateform.is_valid()) response = self.c.post('/rowers/user-analysis-select/',form_data) self.assertEqual(response.status_code,200) class MarkerPerformanceTest(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() # need a 2k, 5k, 1h row self.werg2k = WorkoutFactory( user=self.r, duration=datetime.time(hour=0,minute=7,second=0), distance=2000, workouttype='rower', rankingpiece=True, ) self.werg2k.date = self.werg2k.startdatetime.date() self.werg2k.save() # need a 2k, 5k, 1h row self.werg5k = WorkoutFactory( user=self.r, duration=datetime.time(hour=0,minute=18,second=0), distance=5000, workouttype='rower', rankingpiece=True, ) self.werg5k.date = self.werg5k.startdatetime.date() self.werg5k.save() # need a 2k, 5k, 1h row self.werg1h = WorkoutFactory( user=self.r, duration=datetime.time(hour=1,minute=0,second=0), distance=15000, workouttype='rower', rankingpiece=True, ) self.werg1h.date = self.werg1h.startdatetime.date() self.werg1h.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') def test_create_marker_workouts(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() url = reverse('create_marker_workouts_view') response = self.c.get(url, follow=True) expected_url = reverse('goldmedalscores_view',kwargs={'userid':self.u.id}) self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) @patch('rowers.dataprep.read_data', side_effect=mocked_getsmallrowdata_uh) def test_trainingzones_view(self,mocked_getsmallrowdata_uh): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() zones = 'hr' url = reverse('trainingzones_view') response = self.c.get(url) self.assertEqual(response.status_code,200) url = reverse('trainingzones_view_data') response = self.c.get(url) self.assertEqual(response.status_code,200) url += '?startdate={startdate}&enddate={enddate}&zones={zones}'.format( startdate = startdate.strftime("%Y-%m-%d"), enddate = enddate.strftime("%Y-%m-%d"), zones=zones, ) response = self.c.get(url) self.assertEqual(response.status_code,200) zones = 'power' url = reverse('trainingzones_view_data') url += '?startdate={startdate}&enddate={enddate}&zones={zones}'.format( startdate = startdate.strftime("%Y-%m-%d"), enddate = enddate.strftime("%Y-%m-%d"), zones=zones, ) response = self.c.get(url) self.assertEqual(response.status_code,200) dates = 'week' yaxis = 'percentage' url = reverse('trainingzones_view_data') url += '?startdate={startdate}&enddate={enddate}&zones={zones}&yaxis={yaxis}&dates={dates}'.format( startdate = startdate.strftime("%Y-%m-%d"), enddate = enddate.strftime("%Y-%m-%d"), zones=zones, dates=dates, yaxis=yaxis ) response = self.c.get(url) self.assertEqual(response.status_code,200) zones = 'hr' dates = 'month' yaxis = 'percentage' url = reverse('trainingzones_view_data') url += '?startdate={startdate}&enddate={enddate}&zones={zones}&yaxis={yaxis}&dates={dates}'.format( startdate = startdate.strftime("%Y-%m-%d"), enddate = enddate.strftime("%Y-%m-%d"), zones=zones, dates=dates, yaxis=yaxis ) response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data') def test_performancemanager_view(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() url = reverse('performancemanager_view') response = self.c.get(url) self.assertEqual(response.status_code,200) form_data = { 'startdate':startdate.strftime("%Y-%m-%d"), 'enddate': enddate.strftime("%Y-%m-%d"), 'doform': True, 'dofatigue': True, 'metricchoice':'rscore', 'modelchoice': 'coggan', 'daterange': '', } form = PerformanceManagerForm(form_data) if not form.is_valid(): print(form.errors) self.assertTrue(form.is_valid()) response = self.c.post(url,form_data) self.assertEqual(response.status_code,200) class AlertTest(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) for w in self.user_workouts: if w.date != w.startdatetime.date(): w.date = w.startdatetime.date() w.save() self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() # need a 2k, 5k, 1h row self.werg2k = WorkoutFactory( user=self.r, duration=datetime.time(hour=0,minute=7,second=0), distance=2000, workouttype='rower', rankingpiece=True, ) # need a 2k, 5k, 1h row self.werg5k = WorkoutFactory( user=self.r, duration=datetime.time(hour=0,minute=18,second=0), distance=5000, workouttype='rower', rankingpiece=True, ) # need a 2k, 5k, 1h row self.werg1h = WorkoutFactory( user=self.r, duration=datetime.time(hour=1,minute=0,second=0), distance=15000, workouttype='rower', rankingpiece=True, ) def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError, OSError): pass @patch('rowers.dataprep.create_engine') @patch('rowers.alerts.read_data') def test_alerts(self, mocked_sqlalchemy, mocked_read_data): login = self.c.login(username=self.u.username,password=self.password) self.assertTrue(login) startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() url = reverse('alerts_view') response = self.c.get(url) self.assertEqual(response.status_code,200) # create alert url = reverse('alert_create_view') response = self.c.get(url) self.assertEqual(response.status_code,200) data = { 'name': 'Ss', 'period':7, 'emailalert': True, 'boattype':'1x', 'workouttype':'water', 'reststrokes':False, 'metric':'spm', 'condition':'<', 'value1':20, 'value2':22, # management_form data 'form-INITIAL_FORMS': '0', 'form-TOTAL_FORMS': '1', 'form-MAX_NUM_FORMS': '', # First condition data 'form-0-metric': 'hr', 'form-0-condition': '>', 'form-0-value1': 120, 'form-0-value2': 130 } form = AlertEditForm(data) self.assertTrue(form.is_valid()) response = self.c.post(url,data,follow=True) expected_url = reverse('alert_edit_view',kwargs={'id':1}) self.assertRedirects(response,expected_url=expected_url,status_code=302,target_status_code=200) url = expected_url response = self.c.post(url,data) self.assertEqual(response.status_code,200) data = {} url = reverse('alert_report_view',kwargs={'id':1,'userid':self.u.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) # delete url = '/rowers/alerts/1/delete/' response = self.c.get(url) self.assertEqual(response.status_code,200) response = self.c.post(url,data,follow=True) expected_url = reverse('alerts_view') self.assertRedirects(response,expected_url=expected_url,status_code=302,target_status_code=200) #