2ff353bebb
This is enough code to start using the tool to debug itself, so it's time to start committing individual bugfixes.
106 lines
3.9 KiB
Python
106 lines
3.9 KiB
Python
"""test_client.py - Unit tests for PayPal API client class"""
|
|
# Copyright © 2020 Brett Smith
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
import datetime
|
|
import re
|
|
|
|
import pytest
|
|
import requests
|
|
|
|
from . import MockSession, MockResponse
|
|
|
|
from paypal_rest import client as client_mod
|
|
from paypal_rest import transaction as txn_mod
|
|
|
|
START_DATE = datetime.datetime(2020, 10, 1, 12, tzinfo=datetime.timezone.utc)
|
|
END_DATE = START_DATE.replace(month=START_DATE.month + 1)
|
|
|
|
def test_transaction_type():
|
|
txn_id = 'TYPETEST123456789'
|
|
session = MockSession(
|
|
MockResponse({'page': 1, 'total_pages': 1, 'transaction_details': [
|
|
{'transaction_info': {'transaction_id': txn_id}},
|
|
]}),
|
|
)
|
|
paypal = client_mod.PayPalAPIClient(session)
|
|
txn, = paypal.iter_transactions(START_DATE, END_DATE)
|
|
assert isinstance(txn, txn_mod.Transaction)
|
|
assert txn.transaction_id() == txn_id
|
|
|
|
@pytest.mark.parametrize('pages', range(1, 4))
|
|
def test_transaction_pagination(pages):
|
|
session = MockSession(
|
|
*(MockResponse({'page': page, 'total_pages': pages, 'transaction_details': []})
|
|
for page in range(1, pages + 1))
|
|
)
|
|
paypal = client_mod.PayPalAPIClient(session)
|
|
actual = list(paypal.iter_transactions(START_DATE, END_DATE))
|
|
assert len(session._requests) == pages
|
|
for expect_page, request in enumerate(session._requests, 1):
|
|
assert request.params.get('page') == str(expect_page)
|
|
|
|
@pytest.mark.parametrize('index,key', enumerate(['start_date', 'end_date']))
|
|
def test_transaction_date_formatting(index, key):
|
|
session = MockSession(
|
|
MockResponse({'page': 1, 'total_pages': 1, 'transaction_details': []}),
|
|
)
|
|
paypal = client_mod.PayPalAPIClient(session)
|
|
args = [START_DATE, END_DATE]
|
|
new_date = START_DATE.replace(day=15)
|
|
args[index] = new_date
|
|
actual = list(paypal.iter_transactions(*args))
|
|
assert session._requests
|
|
assert session._requests[0].params.get(key) == new_date.isoformat(timespec='seconds')
|
|
|
|
@pytest.mark.parametrize('fields', [
|
|
{'transaction'},
|
|
{'cart'},
|
|
{'transaction', 'payer'},
|
|
{'cart', 'transaction', 'payer'},
|
|
])
|
|
def test_transaction_fields_formatting(fields):
|
|
fields_iter = (name.upper() for name in fields)
|
|
fields_arg = client_mod.TransactionFields[next(fields_iter)]
|
|
for name in fields_iter:
|
|
fields_arg |= client_mod.TransactionFields[name]
|
|
session = MockSession(
|
|
MockResponse({'page': 1, 'total_pages': 1, 'transaction_details': []}),
|
|
)
|
|
paypal = client_mod.PayPalAPIClient(session)
|
|
_ = list(paypal.iter_transactions(START_DATE, END_DATE, fields_arg))
|
|
assert session._requests
|
|
assert fields == {
|
|
re.sub(r'_info$', '', name)
|
|
for name in session._requests[0].params.get('fields', '').split(',')
|
|
}
|
|
|
|
@pytest.mark.parametrize('name', [
|
|
'BAD_REQUEST',
|
|
'UNAUTHORIZED',
|
|
'FORBIDDEN',
|
|
'NOT_FOUND',
|
|
'INTERNAL_SERVER_ERROR',
|
|
])
|
|
def test_error_handling(name, caplog):
|
|
session = MockSession(MockResponse.error(name, status_code=requests.codes[name]))
|
|
paypal = client_mod.PayPalAPIClient(session)
|
|
with pytest.raises(requests.HTTPError):
|
|
paypal.get_transaction('ABCDEFGHIJKLMNOPQ')
|
|
assert any(
|
|
log.levelname == 'ERROR'
|
|
and log.message == f'{name}: Test error'
|
|
for log in caplog.records
|
|
)
|