diff --git a/rowers/braintreestuff.py b/rowers/braintreestuff.py index 5466c1cc..4af5920f 100644 --- a/rowers/braintreestuff.py +++ b/rowers/braintreestuff.py @@ -118,7 +118,7 @@ def make_payment(rower,data): job = myqueue(queuehigh,handle_send_email_transaction, name, rower.user.email, amount) - return amount + return amount,'' else: return 0,'' @@ -415,12 +415,4 @@ def get_transactions(start_date,end_date): def mocktest(rower): - nonce_from_the_client = 'aap' - result = gateway.payment_method.create({ - "customer_id": rower.customer_id, - "payment_method_nonce": nonce_from_the_client - }) - - - return result.subscription.id - + return '5' diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index b9e2eda7..d5c8119e 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -107,6 +107,8 @@ class mocked_canvas(): def print_figure(*args, **kwargs): return True +# Mocked Dataprep + def mocked_fetchcperg(*args, **kwargs): df = pd.read_csv('rowers/tests/testdata/cpdataerg.csv') @@ -156,6 +158,8 @@ def mocked_read_df_cols_sql_multiflex(ids, columns, convertnewtons=True): return df, extracols +# Mocked Strava + def mocked_stravaexport(f2,workoutname,stravatoken,description='', activity_type='Rowing'): print "this is mocked strava export" @@ -172,6 +176,62 @@ class MockStravalibClient(): def update_activity(*args, **kwargs): return StravaActivity() +# Mocked Braintree + +## Higher level - unfortunately didn't succeed in mocking the gateway + +def mock_create_customer(*args, **kwargs): + return 121 + +def mock_make_payment(*args, **kwargs): + return 15,'' + +def mock_update_subscription(*args, **kwargs): + try: + rower = args[0] + data = args[1] + planid = data['plan'] + plan = PaidPlan.objects.get(id=planid) + amount = data['amount'] + + rower.paidplan = plan + rower.planexpires = (datetime.datetime.now()+datetime.timedelta(days=365)).date() + rower.clubsize = plan.clubsize + rower.paymenttype = plan.paymenttype + rower.rowerplan = plan.shortname + rower.subscription_id = 12 + rower.save() + except: + amount = 20 + + return True,amount + +def mock_create_subscription(*args, **kwargs): + return mock_update_subscription(*args, **kwargs) + +def mock_cancel_subscription(*args, **kwargs): + themessages = [] + errormessages = [] + try: + basicplans = PaidPlan.objects.filter(price=0,paymentprocessor='braintree') + rower.paidplan = basicplans[0] + rower.teamplanexpires = timezone.now() + rower.planexpires = timezone.now() + rower.clubsize = 0 + rower.rowerplan = 'basic' + rower.subscription_id = None + rower.save() + themessages.append("Your plan was reset to basic") + except: + pass + + return True, themessages,errormessages + +def mock_mocktest(*args, **kwargs): + return '121' + +## Gateway stuff (not working) + class gatewayresult(): def __init__(self,*args,**kwargs): self.is_success = kwargs.pop('is_success',True) @@ -309,7 +369,9 @@ def mocked_gateway(*args, **kwargs): return MockBraintreeGateway() - + +# Mocked Rowingdata + class mocked_rowingdata(rowingdata): def __init__(self, *args, **kwargs): super(mocked_rowingdata).__init__(*args, **kwargs) @@ -354,7 +416,9 @@ class mocked_rowingdata(rowingdata): fig1 = figure.Figure(figsize(12,10)) return fig1 - + +# Mocked Requests + # 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/statements.py b/rowers/tests/statements.py index af2b577f..c609fee7 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -72,7 +72,14 @@ from rowers.utils import calculate_age from rowers.tasks import handle_getagegrouprecords +import inspect + def get_random_file(filename='rowers/tests/testdata/testdata.csv',name=''): + + frm = inspect.stack()[3] + mod = inspect.getmodule(frm[0]) + fromstring = 'test_%s_' % mod.__name__ + row = rdata(filename) totaldist = row.df['cum_dist'].max() totaltime = row.df['TimeStamp (sec)'].max()-row.df['TimeStamp (sec)'].min() @@ -93,9 +100,9 @@ def get_random_file(filename='rowers/tests/testdata/testdata.csv',name=''): extension = filename[-3:] if name != '': - newfilename = 'rowers/tests/testdata/temp/'+name+'.'+extension + newfilename = 'rowers/tests/testdata/temp/'+fromstring+name+'.'+extension else: - newfilename = 'rowers/tests/testdata/temp/'+uuid4().hex[:16]+'.'+extension + newfilename = 'rowers/tests/testdata/temp/'+fromstring+uuid4().hex[:16]+'.'+extension copyfile(filename,newfilename) @@ -127,13 +134,18 @@ class WorkoutFactory(factory.DjangoModelFactory): name = factory.LazyAttribute(lambda _: faker.word()) notes = faker.text() - startdatetime = get_random_file(name=faker.word())['startdatetime'] - starttime = get_random_file(name=faker.word())['starttime'] + startdatetime = factory.LazyAttribute( + lambda _:get_random_file(name=faker.word())['startdatetime']) + starttime = factory.LazyAttribute( + lambda _:get_random_file(name=faker.word())['starttime']) workouttype='water' date=timezone.now().date() - duration=get_random_file(name=faker.word())['duration'] - distance=get_random_file(name=faker.word())['totaldist'] - csvfilename=get_random_file(name=faker.word())['filename'] + duration=factory.LazyAttribute( + lambda _:get_random_file(name=faker.word())['duration']) + distance=factory.LazyAttribute( + lambda _:get_random_file(name=faker.word())['totaldist']) + csvfilename=factory.LazyAttribute( + lambda _:get_random_file(name=faker.word())['filename']) class SessionFactory(factory.DjangoModelFactory): diff --git a/rowers/tests/test_aaa.py b/rowers/tests/test_payments.py similarity index 71% rename from rowers/tests/test_aaa.py rename to rowers/tests/test_payments.py index b095438b..df08f1d9 100644 --- a/rowers/tests/test_aaa.py +++ b/rowers/tests/test_payments.py @@ -53,8 +53,8 @@ class PaymentTest(TestCase): # def tearDown(self): # settings.DEBUG = False - @patch('rowers.braintreestuff.gateway',side_effect=MockBraintreeGateway) - def test_billing_view(self,mocked_gateway): + @patch('rowers.views.braintreestuff.create_customer',side_effect=mock_create_customer) + def test_billing_view(self,mocked_create_customer): u = UserFactory() r = Rower.objects.create(user=u, birthdate=faker.profile()['birthdate'], @@ -102,16 +102,16 @@ class PaymentTest(TestCase): form = PlanSelectForm(form_data,paymentprocessor='braintree') self.assertTrue(form.is_valid) - #response = self.c.post(url,form_data,follow=True) - #self.assertEqual(response.status_code,200) + response = self.c.post(url,form_data,follow=True) + self.assertEqual(response.status_code,200) - #expected_url = '/rowers/checkout/'+str(plan.id)+'/' + expected_url = '/rowers/checkout/'+str(plan.id)+'/' - #self.assertRedirects(response, - # expected_url = expected_url, - # status_code=302,target_status_code=200) + self.assertRedirects(response, + expected_url = expected_url, + status_code=302,target_status_code=200) - @patch('rowers.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) def test_upgrade_view(self,mocked_gateway): u = UserFactory() r = Rower.objects.create(user=u, @@ -174,7 +174,7 @@ class PaymentTest(TestCase): expected_url = expected_url, status_code=302,target_status_code=200) - @patch('rowers.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) def test_down_view(self,mocked_gateway): u = UserFactory() r = Rower.objects.create(user=u, @@ -240,7 +240,7 @@ class PaymentTest(TestCase): expected_url = expected_url, status_code=302,target_status_code=200) - @patch('rowers.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) def test_planstop_view(self,mocked_gateway): u = UserFactory() r = Rower.objects.create(user=u, @@ -278,7 +278,7 @@ class PaymentTest(TestCase): self.assertEqual(response.status_code,200) - @patch('rowers.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) def test_planstobasic_view(self,mocked_gateway): u = UserFactory() r = Rower.objects.create(user=u, @@ -318,8 +318,8 @@ class PaymentTest(TestCase): expected_url = '/rowers/me/cancelsubscriptions/', status_code=302,target_status_code=200) - @patch('rowers.braintreestuff.gateway', return_value = MockBraintreeGateway) - def test_patch(self, MockBraintreeGateway): + @patch('rowers.tests.test_payments.mocktest', side_effect=mock_mocktest) + def test_patch(self, mock_mocktest): u = UserFactory() r = Rower.objects.create(user=u, birthdate=faker.profile()['birthdate'], @@ -339,8 +339,8 @@ class PaymentTest(TestCase): result = mocktest(r) self.assertEqual(result,'121') - @patch('rowers.braintreestuff.gateway', side_effect=MockBraintreeGateway) - def test_checkouts_view(self,mocked_gateway): + @patch('rowers.views.braintreestuff.create_subscription', side_effect=mock_create_subscription) + def test_checkouts_view(self,mock_subscription): u = UserFactory() r = Rower.objects.create(user=u, birthdate=faker.profile()['birthdate'], @@ -373,11 +373,99 @@ class PaymentTest(TestCase): login = self.c.login(username=u.username, password=self.password) self.assertTrue(login) - # url = '/rowers/checkouts/' + url = '/rowers/checkouts/' - # response = self.c.post(url, form_data,follow=True) - # self.assertEqual(response.status_code,200) + response = self.c.post(url, form_data,follow=True) + self.assertEqual(response.status_code,200) - #self.assertRedirects(response, - # expected_url = '/rowers/paymentcompleted/', - # status_code=302,target_status_code=200) + self.assertRedirects(response, + expected_url = '/rowers/paymentcompleted/?amount=20.00', + status_code=302,target_status_code=200) + + + @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) + def test_upgrade_checkouts_view(self,mock_subscription): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach', + paymentprocessor='braintree', + street_address = faker.street_address(), + city = faker.city(), + postal_code = faker.postalcode(), + country = faker.country(), + ) + + r.save() + u.set_password(self.password) + u.save() + + plans = PaidPlan.objects.all().order_by('price') + plan = plans[1] + + form_data = { + 'amount':'15.00', + 'plan': plans[1].id, + 'payment_method_nonce': 'aap', + } + + form = BillingForm(form_data) + self.assertTrue(form.is_valid) + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/upgradecheckouts/' + + response = self.c.post(url, form_data,follow=True) + self.assertEqual(response.status_code,200) + + self.assertRedirects(response, + expected_url = '/rowers/paymentcompleted/?amount=20.00', + status_code=302,target_status_code=200) + + @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) + def test_downgrade_checkouts_view(self,mock_subscription): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach', + paymentprocessor='braintree', + street_address = faker.street_address(), + city = faker.city(), + postal_code = faker.postalcode(), + country = faker.country(), + ) + + r.save() + u.set_password(self.password) + u.save() + + plans = PaidPlan.objects.all().order_by('price') + plan = plans[1] + + form_data = { + 'amount':'15.00', + 'plan': plans[1].id, + 'payment_method_nonce': 'aap', + } + + form = BillingForm(form_data) + self.assertTrue(form.is_valid) + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/downgradecheckouts/' + + response = self.c.post(url, form_data,follow=True) + self.assertEqual(response.status_code,200) + + self.assertRedirects(response, + expected_url = '/rowers/downgradecompleted/', + status_code=302,target_status_code=200) + diff --git a/rowers/tests/test_simplefunctions.py b/rowers/tests/test_simplefunctions.py index 18e5fa94..08bc2493 100644 --- a/rowers/tests/test_simplefunctions.py +++ b/rowers/tests/test_simplefunctions.py @@ -44,8 +44,32 @@ class SimpleViewTest(TestCase): response = self.c.get(url) self.assertIn(response.status_code,[403,404]) - + def test_sendmail(self): + login = self.c.login(username=self.u.username, password=self.password) + self.assertTrue(login) + url = '/rowers/email/send/' + + form_data = { + 'firstname': 'John', + 'lastname':'Doe', + 'email':'roosendaalsander@gmail.com', + 'subject':'testing', + 'botcheck': True, + 'message': faker.text() + } + + form = EmailForm(form_data) + + self.assertTrue(form.is_valid) + + response = self.c.post(url,form_data,follow=True) + self.assertEqual(response.status_code,200) + + self.assertRedirects(response, + expected_url='/rowerss/email/', + status_code=302,target_status_code=200) + def test_getworkout(self): with assert_raises(Http404): diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 7b858bd5..3a9b7c02 100644 Binary files a/rowers/tests/testdata/testdata.csv.gz and b/rowers/tests/testdata/testdata.csv.gz differ diff --git a/rowers/tests/testdata/testdata.tcx b/rowers/tests/testdata/testdata.tcx index 05f3e4af..15c2daa8 100644 --- a/rowers/tests/testdata/testdata.tcx +++ b/rowers/tests/testdata/testdata.tcx @@ -2502,7 +2502,7 @@ - <Element 'Notes' at 0x13e2d080> + <Element 'Notes' at 0x13397b70>