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