This repository has been archived on 2022-08-04. You can view files and clone it, but cannot push or open issues or pull requests.
pyurbantz/urbantz/tests/test_delivery.py

84 lines
2.8 KiB
Python

from unittest import TestCase
from unittest.mock import patch, call
from datetime import datetime
from urbantz import Delivery
from urbantz.exceptions import APIError
class TestDelivery(TestCase):
@classmethod
def setUpClass(cls):
cls.delivery = Delivery('123456')
def test_repr(self):
self.assertEqual(repr(self.delivery), "Delivery('123456')")
def test_api_url(self):
self.assertEqual(
self.delivery.api_url,
'https://backend.urbantz.com/public/task/tracking/123456',
)
@patch('urbantz.delivery.Delivery.use')
@patch('urbantz.delivery.requests')
def test_update(self, requests_mock, use_mock):
requests_mock.get.return_value.json.return_value = {'some': 'payload'}
self.assertIsNone(self.delivery.last_updated)
self.delivery.update()
self.assertEqual(requests_mock.get.call_count, 1)
self.assertEqual(
requests_mock.get.call_args,
call(self.delivery.api_url),
)
self.assertEqual(requests_mock.get().raise_for_status.call_count, 1)
self.assertEqual(requests_mock.get().json.call_count, 1)
self.assertEqual(use_mock.call_count, 1)
self.assertEqual(use_mock.call_args, call({'some': 'payload'}))
self.assertIsInstance(self.delivery.last_updated, datetime)
@patch('urbantz.delivery.requests')
def test_update_error(self, requests_mock):
requests_mock.get.return_value.json.return_value = {
'error': {
'code': 42,
'message': 'Oh snap!',
}
}
with self.assertRaises(APIError) as excinfo:
self.delivery.update()
self.assertEqual(requests_mock.get.call_count, 1)
self.assertEqual(
requests_mock.get.call_args,
call(self.delivery.api_url),
)
self.assertEqual(requests_mock.get().json.call_count, 1)
self.assertEqual(
excinfo.exception,
APIError({'code': 42, 'message': 'Oh snap!'}),
)
@patch('urbantz.delivery.requests')
def test_update_error_empty(self, requests_mock):
"""
Test that a Delivery will raise an APIError with a failed JSON parsing
"""
requests_mock.get.return_value.json.side_effect = ValueError
with self.assertRaises(APIError) as excinfo:
self.delivery.update()
self.assertEqual(requests_mock.get.call_count, 1)
self.assertEqual(
requests_mock.get.call_args,
call(self.delivery.api_url),
)
self.assertEqual(requests_mock.get().raise_for_status.call_count, 1)
self.assertEqual(requests_mock.get().json.call_count, 1)
self.assertEqual(
excinfo.exception,
APIError({'message': 'API returned an empty payload'}),
)