class TestRetrieverMethods(unittest.TestCase): def setUp(self): self.retriever = Retriever() self.output = [] def fake_print(content): self.output.append(content) self.retriever.print = fake_print self.text_response = '{"success": true, "data": [209], "length": 1, "type": "uint8"}' self.json_response = {'type': 'uint8', 'data': [209], 'length': 1, 'success': True} def tearDown(self): self.output = None self.retriever = None def test_fetch(self): self.retriever.render = MagicMock() # Check empty url response = self.retriever.fetch("") self.assertIsNone(response) self.retriever.render.assert_not_called() # Check invalid url response = self.retriever.fetch("Invalidurl") self.assertIsNone(response.value) # Still None, still loading response.join() # Force the response to be retrieved self.assertIsInstance(response.value.exception, Exception) self.retriever.render.assert_not_called() def test_process_response(self): response = Mock() response.status_code = 200 response.text = self.text_response processed_response = self.retriever.process_response(response) self.assertEqual(response, processed_response) self.assertEqual(len(self.output), 3) self.assertEqual(self.output[2], 209) # The single value we have in our data self.output = [] # Reset output empty_response = Mock() empty_response.status_code = 400 self.retriever.process_response(empty_response) self.assertEqual(len(self.output), 2) self.assertEqual(self.output[1], "Response not valid. Status Code 400") def test_render(self): self.retriever.render(self.json_response) self.assertEqual(len(self.output), 2) self.assertEqual(self.output[1], 209) # The single value we have in our data self.output = [] self.retriever.render(self.text_response) # Bad response. Still a text self.assertEqual(len(self.output), 1) self.assertEqual(self.output[0], "Response not valid, please provide a valid API")
from retriever import Retriever from time import sleep url = "https://qrng.anu.edu.au/API/jsonI.php?length=1&type=uint8" retriever = Retriever() response = retriever.fetch(url=url) # Now to visually "see" how much an asynchronous process is, we will render some numbers for i in range(10): print("Waiting", 10 - i) sleep(.5) # Just to give it some time to finish if needed while not response.ready(): print(".") sleep(.5) # Just to give it some time to finish if needed if response.successful(): print("Thank you for your time. Process completed.") else: print("There was some error. Retriever wasn't able to fetch a response.")