from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from django.test import RequestFactory #from __future__ import print_function from .statements import * nu = datetime.datetime.now() from rowers.utils import allmonths,allsundays import rowers.plannedsessions as plannedsessions import rowers.courses as courses import rowers.tasks as tasks from rowers.views.racesviews import * from rowers.utils import calculate_age from rowers.views import addmanual_view, virtualevent_compare_view, virtualevent_create_view, fastestvirtualevent_create_view from django.contrib.messages.storage.fallback import FallbackStorage from django.contrib.sessions.middleware import SessionMiddleware from base64 import b64encode import base64 from django.core.files.base import File from io import BytesIO from PIL import Image from io import StringIO from django.core.files.uploadedfile import InMemoryUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile def create_image(storage, filename, size=(100, 100), image_mode='RGB', image_format='PNG'): """ Generate a test image, returning the filename that it was saved as. If ``storage`` is ``None``, the BytesIO containing the image data will be passed instead. """ data = BytesIO() Image.new(image_mode, size).save(data, image_format) data.seek(0) if not storage: return data image_file = ContentFile( b64encode(data.read()) ) return storage.save(filename, image_file) @override_settings(TESTING=True) class ChallengesTest(TestCase): def setUp(self): self.u = UserFactory() self.r = Rower.objects.create(user=self.u, birthdate=datetime.datetime.now()-datetime.timedelta(days=25*365), gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='pro') self.u2 = UserFactory() self.r2 = Rower.objects.create(user=self.u2, birthdate=datetime.datetime.now()-datetime.timedelta(days=28*365), gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='basic') self.u3 = UserFactory() self.follower = Rower.objects.create(user=self.u3, birthdate=datetime.datetime.now()-datetime.timedelta(days=28*365), gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), rowerplan='basic') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) self.factory = RequestFactory() self.password = faker.word() self.u.set_password(self.password) self.u.save() cs = courses.kmltocourse('rowers/tests/testdata/thyro.kml') course = cs[0] cname = course['name'] cnotes = course['description'] polygons = course['polygons'] self.ThyroBaantje = courses.createcourse(self.r,cname,polygons,notes=cnotes) self.ThyroBaantje.save() id = save_scoring('Standard Scoring',self.u,'rowers/tests/testdata/coursestandard.csv',id=0) self.Scoring = StandardCollection.objects.get(id=id) result = get_random_file(filename='rowers/tests/testdata/thyro.csv') self.wthyro = WorkoutFactory(user=self.r, csvfilename=result['filename'], starttime=result['starttime'], startdatetime=result['startdatetime'], duration=result['duration'], distance=result['totaldist'], workouttype = 'water', ) self.wthyro.startdatetime = arrow.get(nu).datetime self.wthyro.date = nu.date() self.wthyro.save() result = get_random_file(filename='rowers/tests/testdata/thyro.csv') self.w_strava = WorkoutFactory(user=self.r, csvfilename=result['filename'], starttime=result['starttime'], startdatetime=result['startdatetime'], duration=result['duration'], distance=result['totaldist'], workouttype = 'water', workoutsource = 'strava', privacy = 'hidden', ) self.w_strava.startdatetime = arrow.get(nu).datetime self.w_strava.date = nu.date() self.w_strava.save() result = get_random_file(filename='rowers/tests/testdata/thyro.csv') self.wthyro2 = WorkoutFactory(user=self.r2, csvfilename=result['filename'], starttime=result['starttime'], startdatetime=result['startdatetime'], duration=result['duration'], distance=result['totaldist'], workouttype = 'water', ) result = get_random_file(filename='rowers/tests/testdata/thyro.csv') self.wthyro3 = WorkoutFactory(user=self.r2, csvfilename=result['filename'], starttime=result['starttime'], startdatetime=result['startdatetime'], duration=result['duration'], distance=result['totaldist'], workouttype = 'water', ) self.wthyro2.startdatetime = arrow.get(nu).datetime self.wthyro2.date = nu.date() self.wthyro2.save() startdate = arrow.get(datetime.datetime.now()-datetime.timedelta(days=1)).datetime start_time = datetime.time() enddate = startdate+datetime.timedelta(days=5) end_time = start_time evaluation_closure = startdate+datetime.timedelta(days=6) registration_closure = evaluation_closure contact_phone = '06342323' contact_email = 'roosendaalsander@gmail.com' timezone_str = 'UTC' self.SpeedOrder = VirtualRace( name='Thyro Speed Order', startdate=startdate, preferreddate = startdate, start_time = start_time, enddate=enddate, end_time=end_time, course=self.ThyroBaantje, comment='', sessiontype = 'race', timezone=timezone_str, evaluation_closure=evaluation_closure, registration_closure=registration_closure, contact_phone=contact_phone, coursestandards=self.Scoring, contact_email=contact_email, country = 'Netherlands', manager=self.u, ) self.SpeedOrder.save() flw = VirtualRaceFollower.objects.create(race=self.SpeedOrder, user=self.u3, emailaddress='bla@bla.com') self.result = VirtualRaceResult( userid = self.u2.id, username = self.u2.username, race = self.SpeedOrder, distance = 300, duration = datetime.time(0,1,20), points = 75, coursecompleted = True, age = 28, startsecond = 0, endsecond = 120, workoutid = self.wthyro2.id ) self.result.save() self.FastestRace = VirtualRace( name='Thyro 5K', startdate=startdate, preferreddate = startdate, start_time = start_time, enddate=enddate, end_time=end_time, sessionvalue=200, comment='', sessiontype = 'fastest_distance', timezone=timezone_str, evaluation_closure=evaluation_closure, registration_closure=registration_closure, contact_phone=contact_phone, contact_email=contact_email, manager=self.u, ) self.FastestRace.save() self.result = VirtualRaceResult( userid = self.u2.id, username = self.u2.username, race = self.FastestRace, distance = 300, duration = datetime.time(0,1,20), points = 75, coursecompleted = True, age = 28, startsecond = 0, endsecond = 120, workoutid = self.wthyro3.id ) self.result.save() def tearDown(self): for workout in self.user_workouts: try: os.remove(workout.csvfilename) except (IOError, FileNotFoundError,OSError): pass def test_distance(self): lat_lon = (52.214229145558484, 6.890036546847821) distance = howfaris(lat_lon,self.ThyroBaantje) distance = int(100*distance) self.assertEqual(distance,315) def test_getnearestraces(self): lat_lon = (52.214229145558484, 6.890036546847821) races = VirtualRace.objects.all() traces = getnearestraces(lat_lon,races) self.assertEqual(len(traces),2) lat_lon = (0, 0) races = VirtualRace.objects.all() traces = getnearestraces(lat_lon,races) self.assertEqual(len(traces),2) def test_getnearestcourses(self): lat_lon = (52.214229145558484, 6.890036546847821) courses = [self.ThyroBaantje] tcourses = getnearestcourses(lat_lon,courses) self.assertEqual(len(tcourses),1) lat_lon = (0, 0) courses = [self.ThyroBaantje] tcourses = getnearestcourses(lat_lon,courses) self.assertEqual(len(tcourses),1) @patch('django.contrib.gis.geoip2.GeoIP2.city', side_effect=mocked_requests) def test_courses_view(self, mock_get): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = reverse('courses_view') response = self.c.get(url) self.assertEqual(response.status_code,200) def test_standards_view(self): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = reverse('standards_view') response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('django.contrib.gis.geoip2.GeoIP2.city', side_effect=mocked_requests) def test_coursemap_view(self, mock_get): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = reverse('course_map_view',kwargs={'id':self.ThyroBaantje.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('django.contrib.gis.geoip2.GeoIP2.city', side_effect=mocked_requests) def test_coursemapcompare_view(self, mock_get): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = reverse('course_mapcompare_view',kwargs={'id':self.ThyroBaantje.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('django.contrib.gis.geoip2.GeoIP2.city', side_effect=mocked_requests) def test_coursecompare_view(self, mock_get): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = reverse('course_compare_view',kwargs={'id':self.ThyroBaantje.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) @patch('django.contrib.gis.geoip2.GeoIP2.city', side_effect=mocked_requests) def test_course_create_edit_delete(self, mock_get): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) # Create url = reverse('course_upload_view') response = self.c.get(url) self.assertEqual(response.status_code,200) filename = 'rowers/tests/testdata/alphen.kml' f = open(filename,'r') file_data = {'file': f} form_data = { 'name':'Alphen', 'notes': 'aa', 'country': 'Netherlands', 'file':f, } form = CourseForm(form_data,file_data) response = self.c.post(url,form_data,follow=True) f.close() expected_url = reverse('courses_view') self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) courses = GeoCourse.objects.all() self.assertEqual(len(courses),2) Alphen = GeoCourse.objects.get(id=2) # edit # edit url = reverse('course_edit_view',kwargs={'id':Alphen.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) form_data = { 'name':'Alphen', 'country': 'NL', 'notes': 'bb' } form = GeoCourseEditForm(form_data) self.assertTrue(form.is_valid()) response = self.c.post(url,form_data) self.assertEqual(response.status_code,200) # check url = reverse('course_view',kwargs={'id':Alphen.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) # Upload new kml url = reverse('course_upload_replace_view',kwargs={'id':self.ThyroBaantje.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) filename = 'rowers/tests/testdata/thyro2.kml' f = open(filename,'r') file_data = {'file': f} form_data = { 'name':'Thyro modified', 'notes': 'aa', 'country': 'Netherlands', 'file':f, } form = CourseForm(form_data,file_data) response = self.c.post(url,form_data,follow=True) f.close() expected_url = reverse('course_update_confirm',kwargs={'id':self.ThyroBaantje.id,'newid':3}) self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) url = expected_url response = self.c.get(url) self.assertEqual(response.status_code,200) form_data = { 'doupdate': True, } response = self.c.post(url,form_data,follow=True) expected_url = reverse('course_view',kwargs={'id':3}) self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) # KML Download url = reverse('course_kmldownload_view',kwargs={'id':Alphen.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) # delete url = reverse('course_delete_view',kwargs={'id':Alphen.id}) response = self.c.get(url,follow=True) expected_url = reverse('courses_view') self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) def test_standard_view(self): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) # Download url = reverse('standards_download_view',kwargs={'id':1}) response = self.c.get(url) self.assertEqual(response.status_code,200) # Deactivate url = reverse('standard_deactivate_view',kwargs={'id':1}) response = self.c.get(url,follow=True) expected_url = reverse('standards_view') self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code,200) # Create Charles url = reverse('standards_upload_view') response = self.c.get(url) self.assertEqual(response.status_code,200) filename = 'rowers/tests/testdata/charles.csv' f = open(filename,'r') file_data = {'file': f} form_data = { 'name':'Alphen', 'notes': 'aa', 'file':f, } form = StandardsForm(form_data,file_data) response = self.c.post(url,form_data,follow=True) f.close() expected_url = reverse('standard_view',kwargs={'id':2}) self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @patch('django.contrib.gis.geoip2.GeoIP2.city', side_effect=mocked_requests) def test_fastestrace_create_view(self, mock_get): self.u.rower.rowerplan = 'basic' self.u.rower.save() login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) url = reverse('fastestvirtualevent_create_view') response = self.c.get(url) self.assertEqual(response.status_code, 200) startdate = arrow.get(datetime.datetime.now()-datetime.timedelta(days=1)).datetime.date() start_time = timezone.now().time() enddate = startdate+datetime.timedelta(days=5) end_time = start_time evaluation_closure = startdate+datetime.timedelta(days=6) registration_closure = evaluation_closure form_data = { 'name': 'test 2', 'startdate': startdate.strftime("%Y-%m-%d"), 'initial-startdate': startdate.strftime("%Y-%m-%d"), 'start_time': '13:12:14', 'enddate': enddate.strftime("%Y-%m-%d"), 'initial-enddate': enddate.strftime("%Y-%m-%d"), 'end_time': '13:12:16', 'timezone': 'US/Pacific', 'sessionvalue': '2000', 'sessionunit': 'm', 'registration_form': 'manual', 'registration_closure_0': registration_closure.strftime("%Y-%m-%d"), 'registration_closure_1': registration_closure.strftime("%H:%M:%S"), 'evaluation_closure_0': evaluation_closure.strftime("%Y-%m-%d"), 'evaluation_closure_1': evaluation_closure.strftime("%H:%M:%S"), 'comment': 'no comment', 'coursestandards': '', 'contact_phone': '+3164805181', 'contact_email': 'test@rowsandall.com', } form = IndoorVirtualRaceForm(form_data) if not form.is_valid(): print(form.cleaned_data) print(form.errors) self.assertTrue(form.is_valid()) response = self.c.post(url, form_data, follow=True) expected_url = reverse('virtualevents_view') self.assertRedirects(response, expected_url=expected_url, status_code=302, target_status_code=200) self.assertEqual(response.status_code,200) @patch('django.contrib.gis.geoip2.GeoIP2.city', side_effect=mocked_requests) def test_fastestrace_view(self, mock_get): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) race = self.FastestRace if self.r.birthdate: age = calculate_age(self.r.birthdate) else: age = 25 # look at event url = reverse('virtualevent_view',kwargs={'id':race.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) # register url = reverse('virtualevent_register_view',kwargs={'id':race.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) form_data = { 'teamname': 'ApeTeam', 'boatclass': 'water', 'boattype': '1x', 'weightcategory': 'hwt', 'adaptiveclass': 'None', 'age': age, 'mix': False, 'acceptsocialmedia': True, } form = VirtualRaceResultForm(form_data) self.assertTrue(form.is_valid()) response = self.c.post(url,form_data,follow=True) expected_url = reverse('virtualevent_view',kwargs={'id':race.id}) self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) # submit workout url = reverse('virtualevent_submit_result_view',kwargs={'id':race.id,'workoutid':self.wthyro.id}) response = self.c.get(url) self.assertEqual(response.status_code, 200) records = IndoorVirtualRaceResult.objects.filter(userid=self.u.id) self.assertEqual(len(records),1) record = records[0] form_data = { 'workouts':[self.wthyro.id], 'record':record.id, } response = self.c.post(url,form_data,follow=True) self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) # repeat previous test for self.w_strava, but the response status of virtualevent_submit_result_view should be 403 and len(records) should be 0 @patch('django.contrib.gis.geoip2.GeoIP2.city', side_effect=mocked_requests) def test_fastestrace_view_strava(self, mock_get): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) race = self.FastestRace if self.r.birthdate: age = calculate_age(self.r.birthdate) else: age = 25 # look at event url = reverse('virtualevent_view',kwargs={'id':race.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) # register url = reverse('virtualevent_register_view',kwargs={'id':race.id}) response = self.c.get(url) self.assertEqual(response.status_code,200) form_data = { 'teamname': 'ApeTeam', 'boatclass': 'water', 'boattype': '1x', 'weightcategory': 'hwt', 'adaptiveclass': 'None', 'age': age, 'mix': False, 'acceptsocialmedia': True, } form = VirtualRaceResultForm(form_data) self.assertTrue(form.is_valid()) response = self.c.post(url,form_data,follow=True) expected_url = reverse('virtualevent_view',kwargs={'id':race.id}) self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) # submit workout url = reverse('virtualevent_submit_result_view',kwargs={'id':race.id,'workoutid':self.w_strava.id}) response = self.c.get(url) self.assertEqual(response.status_code, 200) # response.content should have a form with only one instance of