def test_004_request_method(self): # Using requests.request directly also work (kind of an edge case for coverage) test_url = "http://test.work4labs.com" mapping = { test_url: { 'response': 'Nothingness', 'http_code': 200 } } with patch_requests(mapping) as m_requests: resp = requests.request('GET', test_url) self.assertEqual(m_requests['request'].call_count, 1) self.assertEqual(m_requests['request'].call_args[0][0], 'GET') self.assertEqual(m_requests['request'].call_args[0][1], test_url) self.assertEqual(resp.url, test_url) self.assertEqual(resp.status_code, 200) self.assertIn('Nothingness', resp.text)
def test_custom_headers_and_json(self): # B. Custom headers and json test_url = "https://whatever.work4labs.com" headers = {"x-api-key": 'Blablabla'} mapping = { test_url: { 'headers': headers, 'json': True, 'response': ['Nothingness'] } } with patch_requests(mapping) as m_requests: resp = requests.post(test_url) self.assertEqual(m_requests['post'].call_count, 1) self.assertEqual(m_requests['post'].call_args[0][0], test_url) self.assertEqual(resp.url, test_url) self.assertEqual(resp.headers, headers) self.assertEqual(resp.status_code, 200) self.assertEqual('["Nothingness"]', resp.text)
def test_stream_response(self): # Using requests.request directly also work (kind of an edge case for coverage) test_url = "http://test.work4labs.com" mapping = { test_url: { 'response': 'Nothingness', 'json': False, 'stream': True, 'http_code': 200, } } with patch_requests(mapping) as m_requests: resp = requests.request('GET', test_url, stream=True) self.assertEqual(m_requests['request'].call_count, 1) self.assertEqual(m_requests['request'].call_args[0][0], 'GET') self.assertEqual(m_requests['request'].call_args[0][1], test_url) self.assertEqual(resp.url, test_url) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.raw.stream(), 'Nothingness')
def test_base_case(self): # Check that the mock behaves when used properly test_url = "http://test.work4labs.com" fail_test_url = "http://kaboom.work4labs.com" mapping = { test_url: { 'response': 'Nothingness', 'http_code': 200 }, fail_test_url: { 'response': 'Nope', 'http_code': 500 } } with patch_requests(mapping) as m_requests: # All good, take 1 resp = requests.post(test_url) self.assertEqual(m_requests['post'].call_count, 1) self.assertEqual(m_requests['post'].call_args[0][0], test_url) self.assertEqual(resp.url, test_url) self.assertEqual(resp.status_code, 200) self.assertIn('Nothingness', resp.text) # All good, take 2 resp = requests.get(test_url) self.assertEqual(m_requests['get'].call_count, 1) self.assertEqual(m_requests['get'].call_args[0][0], test_url) self.assertEqual(resp.url, test_url) self.assertEqual(resp.status_code, 200) self.assertIn('Nothingness', resp.text) # Uh oh resp = requests.get(fail_test_url) self.assertEqual(m_requests['get'].call_count, 2) self.assertEqual(m_requests['get'].call_args[0][0], fail_test_url) self.assertEqual(resp.url, fail_test_url) self.assertEqual(resp.status_code, 500) self.assertIn('Nope', resp.text) with self.assertRaises(HTTPError): resp.raise_for_status() # The mock behaves like a proper requests' Response
def test_specific_domain(self): with patch_requests(allowed_domains=["work4labs.com"], allowed_methods=["get"]): resp = requests.get("https://app.work4labs.com") self.assertEqual(resp.status_code, 200)
def test_no_mapping_no_domains(self): with self.assertRaises(ValueError): with patch_requests(): pass
def test_empty_mapping(self): # An empty mapping does not crash − but using it will fail mapping = {} with patch_requests(mapping): with self.assertRaises(Exception): # "called with unexpected URL…" requests.get("https://whatever.work4labs.com")