From 7a3fa8fe307f8692f97f87d8cb365f995678622e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 19 Nov 2024 15:49:44 +0100 Subject: [PATCH] passing tests --- rowers/braintreestuff.py | 30 ++++++++-------- rowers/idoklad.py | 22 ++++++------ rowers/tests/mocks.py | 49 ++++++++++++++++++++++++++ rowers/tests/test_braintree.py | 7 ++-- rowers/tests/test_payments.py | 2 +- rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 4000 bytes 6 files changed, 82 insertions(+), 28 deletions(-) diff --git a/rowers/braintreestuff.py b/rowers/braintreestuff.py index 7cb162d1..df39ecd6 100644 --- a/rowers/braintreestuff.py +++ b/rowers/braintreestuff.py @@ -17,7 +17,7 @@ from rowers.tasks import ( # handle_send_email_transaction_notification, ) from rowers.utils import myqueue -import rowers.fakturoid as fakturoid +import rowers.idoklad as idoklad from braintree.exceptions.invalid_signature_error import InvalidSignatureError from braintree.exceptions.not_found_error import NotFoundError import time @@ -114,18 +114,18 @@ def send_invoice(subscription): else: r = rs[0] dologging('braintreewebhooks.log','Rower '+str(r)+'\n') - fakturoid_contact_id = fakturoid.get_contacts(r) - dologging('braintreewebhooks.log','Fakturoid Contact ID '+str(fakturoid_contact_id)+'\n') - if not fakturoid_contact_id: # pragma: no cover - fakturoid_contact_id = fakturoid.create_contact(r) - dologging('braintreewebhooks.log','Created Fakturoid Contact ID ' + - str(fakturoid_contact_id)+'\n') + idoklad_contact_id = idoklad.get_contacts(r) + dologging('braintreewebhooks.log','Idoklad Contact ID '+str(idoklad_contact_id)+'\n') + if not idoklad_contact_id: # pragma: no cover + idoklad_contact_id = idoklad.create_contact(r) + dologging('braintreewebhooks.log','Created Idoklad Contact ID ' + + str(idoklad_contact_id)+'\n') transactions = subscription.transactions if transactions: amount = transactions[0].amount dologging('braintreewebhooks.log','Transaction amount '+str(amount)+'\n') - id = fakturoid.create_invoice(r, amount, subscription_id, dosend=True, - contact_id=fakturoid_contact_id) + id = idoklad.create_invoice(r, amount, subscription_id, dosend=True, + contact_id=idoklad_contact_id) return id return 0 # pragma: no cover @@ -212,11 +212,13 @@ def make_payment(rower, data): l=rower.user.last_name, ) - fakturoid_contact_id = fakturoid.get_contacts(rower) - if not fakturoid_contact_id: - fakturoid_contact_id = fakturoid.create_contact(rower) - _ = fakturoid.create_invoice(rower, amount, transaction.id, dosend=True, contact_id=fakturoid_contact_id, - name=additional_text) + idoklad_contact_id = idoklad.get_contacts(rower) + if not idoklad_contact_id: + idoklad_contact_id = idoklad.create_contact(rower) + + _ = idoklad.create_invoice(rower, amount, transaction.id, dosend=True, + contact_id=idoklad_contact_id, + name=additional_text) _ = myqueue(queuehigh, handle_send_email_transaction, name, rower.user.email, amount) diff --git a/rowers/idoklad.py b/rowers/idoklad.py index 1da50022..2f74ac86 100644 --- a/rowers/idoklad.py +++ b/rowers/idoklad.py @@ -77,7 +77,6 @@ def get_contacts(rower): if res.status_code != 200: # pragma: no cover return None - data = res.json()['Data']['Items'] if len(data) >= 1: @@ -141,7 +140,7 @@ def create_invoice(rower, amount, braintreeid, dosend=True, contact_id=None, nam token = idoklad_token() if token is None: - return None + return 0 dologging('idoklad.log','Creating idoklad invoice for '+str(rower.user.email)+'\n') @@ -177,26 +176,29 @@ def create_invoice(rower, amount, braintreeid, dosend=True, contact_id=None, nam id = res.json()['Data']['Id'] if dosend: - url = invoice_url+'/'+str(id)+'/Send' - print(url) data = { - 'AttachmentIds': [id], - 'DocumentId': braintreeid, + 'AttachmentIds': [], + 'DocumentId': id, 'EmailBody': 'Dear customer, we are sending you the invoice for your subscription. Please do not hesitate to contact us if you have any questions. Best regards, Rowsandall Team', 'EmailSubject': 'Rowsandall Subscription Invoice', 'Method': 1, 'ReportLanguage': 3, - 'SendToSelf': True, + 'SendToSelf': True, + 'SendToPartner': True, + 'SendToAccountant': False, } - print(data) - print(email_url) + headers = { + 'Authorization': 'Bearer {access_token}'.format(access_token=token.access_token), + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } res = requests.post(email_url, json=data, headers=headers) dologging('idoklad.log','Invoice Sent - status code '+str(res.status_code)+'\n') if res.status_code not in [200, 201]: - dologging('idoklad.log','Invoice Sent - reason '+str(res.reason)+'\n') + dologging('idoklad.log','Invoice Sent - reason '+str(res.text)+'\n') return id diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index 0942905b..512b2429 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -57,6 +57,14 @@ from rowers.dataprep import delete_strokedata from redis import StrictRedis redis_connection = StrictRedis() +def mocked_idoklad_token(*args, **kwargs): # pragma: no cover + class MockToken: + def __init__(self, *args,**kwargs): + self.access_token = "aap" + + return MockToken() + + def mocked_grpc(*args, **kwargs): # pragma: no cover class insecure_channel: @@ -773,6 +781,9 @@ def mocked_requests(*args, **kwargs): with open('rowers/tests/testdata/rp3_list.json','r') as infile: rp3workoutlist = json.load(infile) + with open('rowers/tests/testdata/idoklad_default.json','r') as infile: + idokladdefault = json.load(infile) + rp3linkready = {'data': {'download': {'id': 591621, 'status': 'ready', 'link': 'https://rp3rowing-app.com/api/workouts/591621/download?type=csv'}}} with open('rowers/tests/testdata/example-session-strokes-with-impeller-data.json','r') as infile: @@ -1117,6 +1128,7 @@ def mocked_requests(*args, **kwargs): rp3tester = re.compile(r'.*?rp3rowing-app\.com') garmintester = re.compile(r'.*?garmin\.com') fakturoidtester = re.compile(r'.*?fakturoid\.cz') + idokladtester = re.compile(r'.*?idoklad\.cz') polarlistregex = r'.*?polaraccesslink\.com\/.*\/(\d+)$' polarlisttester = re.compile(polarlistregex) @@ -1487,6 +1499,43 @@ def mocked_requests(*args, **kwargs): else: # pragma: no cover return MockResponse(c2workoutdata,200) + + if idokladtester.match(args[0]): + if 'Invoices' in args[0]: + if 'Default' in args[0]: + response_data = idokladdefault + + return MockResponse(response_data,200) + + response = { + 'Data': { + 'Id': 1, + } + } + return MockResponse(response,200) + + if 'Contacts' in args[0]: + response = { + 'Data': { + 'Items': [ + { + 'Id': 1, + 'url':'aap', + } + ] + } + } + + return MockResponse(response,200) + + response = [ + { + 'Id':1, + 'url':'aap', + } + ] + return MockResponse(response, 200) + if fakturoidtester.match(args[0]): if 'invoices' in args[0]: response = { diff --git a/rowers/tests/test_braintree.py b/rowers/tests/test_braintree.py index ca540e2b..3d32d19c 100644 --- a/rowers/tests/test_braintree.py +++ b/rowers/tests/test_braintree.py @@ -74,11 +74,12 @@ class BraintreeUnits(TestCase): self.p2 = PaidPlan.objects.create(price=25,paymentprocessor='braintree') - @patch('rowers.fakturoid.requests.get',side_effect=mocked_requests) - @patch('rowers.fakturoid.requests.post',side_effect=mocked_requests) + @patch('rowers.idoklad.idoklad_token', side_effect=mocked_idoklad_token) + @patch('rowers.idoklad.requests.get',side_effect=mocked_requests) + @patch('rowers.idoklad.requests.post',side_effect=mocked_requests) @patch('rowers.braintreestuff.gateway', side_effect=MockBraintreeGateway) @patch('rowers.braintreestuff.myqueue') - def test_process_webhook(self,mock_get,mockpost,mocked_gateway,mocked_myqueue): + def test_process_webhook(self,mock_token, mock_get,mockpost,mocked_gateway,mocked_myqueue): n = notification() res = process_webhook(n) self.assertEqual(res,1) diff --git a/rowers/tests/test_payments.py b/rowers/tests/test_payments.py index 5f1cf614..0ecd7776 100644 --- a/rowers/tests/test_payments.py +++ b/rowers/tests/test_payments.py @@ -405,7 +405,7 @@ description: "" @patch('rowers.views.braintreestuff.gateway', side_effect=MockBraintreeGateway) - @patch('rowers.fakturoid.create_invoice',side_effect=mocked_invoiceid) + @patch('rowers.idoklad.create_invoice',side_effect=mocked_invoiceid) @patch('rowers.utils.myqueue') def test_purchase_trainingplan_view(self, mocked_gateway,mocked_invoiceid, mocked_myqueue): u = UserFactory() diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 0dcea5ecc29cb4ae8bce7f4ae92765a75e52c1cd..c7efdd5312a7dff0a614eb0c3858df24994204bc 100644 GIT binary patch literal 4000 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 literal 4001 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 H#DD<+r2IaO