Ronald Portier (Therp BV)
2 years ago
No known key found for this signature in database
GPG Key ID: A181F8124D7101D3
4 changed files with 223 additions and 76 deletions
-
5account_bank_statement_import_online_ponto/models/online_bank_statement_provider_ponto.py
-
1account_bank_statement_import_online_ponto/tests/__init__.py
-
155account_bank_statement_import_online_ponto/tests/test_account_statement_import_online_ponto.py
-
124account_bank_statement_import_online_ponto/tests/test_ponto_interface.py
@ -1,3 +1,4 @@ |
|||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). |
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from . import test_ponto_interface |
||||
from . import test_account_statement_import_online_ponto |
from . import test_account_statement_import_online_ponto |
@ -0,0 +1,124 @@ |
|||||
|
# Copyright 2022 Therp BV <https://therp.nl>. |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). |
||||
|
from dateutil.relativedelta import relativedelta |
||||
|
import json |
||||
|
|
||||
|
from unittest.mock import MagicMock, patch |
||||
|
|
||||
|
from odoo import fields |
||||
|
from odoo.tests import common |
||||
|
|
||||
|
from .test_account_statement_import_online_ponto import THREE_TRANSACTIONS |
||||
|
|
||||
|
|
||||
|
class TestPontoInterface(common.TransactionCase): |
||||
|
post_install = True |
||||
|
|
||||
|
@patch("requests.post") |
||||
|
def test_login(self, requests_post): |
||||
|
"""Check Ponto API login.""" |
||||
|
mock_response = MagicMock() |
||||
|
mock_response.status_code = 200 |
||||
|
mock_response.text = json.dumps( |
||||
|
{ |
||||
|
"access_token": "live_the_token", |
||||
|
"expires_in": 1799, |
||||
|
"scope": "ai", |
||||
|
"token_type": "bearer", |
||||
|
} |
||||
|
) |
||||
|
requests_post.return_value = mock_response |
||||
|
interface_model = self.env["ponto.interface"] |
||||
|
access_data = interface_model._login("uncle_john", "secret") |
||||
|
self.assertEqual(access_data["access_token"], "live_the_token") |
||||
|
self.assertIn("token_expiration", access_data) |
||||
|
|
||||
|
@patch("requests.get") |
||||
|
def test_set_access_account(self, requests_get): |
||||
|
"""Test getting account data for Ponto access.""" |
||||
|
mock_response = MagicMock() |
||||
|
mock_response.status_code = 200 |
||||
|
mock_response.text = json.dumps( |
||||
|
{ |
||||
|
"data": [ |
||||
|
{ |
||||
|
"id": "wrong_id", |
||||
|
"attributes": { |
||||
|
"reference": "NL66ABNA123456789", |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
"id": "2ad3df83-be01-47cf-a6be-cf0de5cb4c99", |
||||
|
"attributes": { |
||||
|
"reference": "NL66RABO123456789", |
||||
|
}, |
||||
|
}, |
||||
|
], |
||||
|
} |
||||
|
) |
||||
|
requests_get.return_value = mock_response |
||||
|
# Start of actual test. |
||||
|
access_data = self._get_access_dict(include_account=False) |
||||
|
interface_model = self.env["ponto.interface"] |
||||
|
interface_model._set_access_account(access_data, "NL66RABO123456789") |
||||
|
self.assertIn("ponto_account", access_data) |
||||
|
self.assertEqual( |
||||
|
access_data["ponto_account"], |
||||
|
"2ad3df83-be01-47cf-a6be-cf0de5cb4c99" |
||||
|
) |
||||
|
|
||||
|
@patch("requests.post") |
||||
|
def test_ponto_synchronisation(self, requests_post): |
||||
|
"""Test requesting Ponto synchronization.""" |
||||
|
mock_response = MagicMock() |
||||
|
mock_response.status_code = 400 |
||||
|
mock_response.text = json.dumps( |
||||
|
{ |
||||
|
"errors": [ |
||||
|
{ |
||||
|
"code": "accountRecentlySynchronized", |
||||
|
"detail": |
||||
|
"This type of synchronization was already created recently" |
||||
|
" for the account. Try again later or on the Dashboard.", |
||||
|
"meta": {} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
) |
||||
|
requests_post.return_value = mock_response |
||||
|
# Start of actual test (succeeds if no Exceptions occur). |
||||
|
access_data = self._get_access_dict() |
||||
|
interface_model = self.env["ponto.interface"] |
||||
|
interface_model._ponto_synchronisation(access_data) |
||||
|
|
||||
|
@patch("requests.get") |
||||
|
def test_get_transactions(self, requests_get): |
||||
|
"""Test getting transactions from Ponto.""" |
||||
|
mock_response = MagicMock() |
||||
|
mock_response.status_code = 200 |
||||
|
# Key "data" will contain a list of transactions. |
||||
|
mock_response.text = json.dumps({"data": THREE_TRANSACTIONS}) |
||||
|
requests_get.return_value = mock_response |
||||
|
# Start of actual test. |
||||
|
access_data = self._get_access_dict() |
||||
|
interface_model = self.env["ponto.interface"] |
||||
|
transactions = interface_model._get_transactions(access_data, False) |
||||
|
self.assertEqual(len(transactions), 3) |
||||
|
self.assertEqual(transactions[2]["id"], "b21a6c65-1c52-4ba6-8cbc-127d2b2d85ff") |
||||
|
self.assertEqual( |
||||
|
transactions[2]["attributes"]["counterpartReference"], |
||||
|
"BE10325927501996" |
||||
|
) |
||||
|
|
||||
|
def _get_access_dict(self, include_account=True): |
||||
|
"""Get access dict that caches login/account information.""" |
||||
|
token_expiration = fields.Datetime.now() + relativedelta(seconds=1800) |
||||
|
access_data = { |
||||
|
"username": "uncle_john", |
||||
|
"password": "secret", |
||||
|
"access_token": "live_the_token", |
||||
|
"token_expiration": token_expiration, |
||||
|
} |
||||
|
if include_account: |
||||
|
access_data["ponto_account"] = "2ad3df83-be01-47cf-a6be-cf0de5cb4c99" |
||||
|
return access_data |
Write
Preview
Loading…
Cancel
Save
Reference in new issue