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

96 lines
3.2 KiB
Python

from unittest import TestCase
from unittest.mock import patch, call
from datetime import datetime
from urbantz import Delivery
from urbantz.delivery import Location
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'}),
)
def test_empty_eta(self):
self.delivery.eta_margin = None
self.delivery.eta_rounding = None
self.delivery.arrival_time = None
self.assertIsNone(self.delivery.eta)
def test_empty_location(self):
loc = Location()
with self.assertRaises(AttributeError):
loc.coordinates