def test_pagination(self): """ Test that we access all the pages """ b1 = { "meta": { "limit": 2, "next": "/api/v1/measurement/?offset=2&limit=2", "offset": 0, "previous": None, "total_count": 4}, "objects": [{"id": 1}, {"id": 2}] } b2 = { "meta": { "limit": 2, "next": None, "offset": 2, "previous": "/api/v1/measurement/?offset=0&limit=2", "total_count": 4}, "objects": [{"id": 3}, {"id": 4}] } adapter = PredictableTestAdapter([make_json_response(b1), make_json_response(b2)]) self.client._session.mount(TEST_ENDPOINT, adapter) measurements = self.client.measurements.list() self.assertEqual(0, len(adapter.responses)) self.assertEqual(4, len(measurements)) self.assertEqual([1,2,3,4], [measurement["id"] for measurement in measurements])
def test_not_found(self): adapter = PredictableTestAdapter([ make_json_response(self.list_response), make_json_response(OBJ_1) ]) self.client._session.mount(TEST_ENDPOINT, adapter) self.assertRaises(NoSuchObject, self.client.measurements.get)
def test_duplicate(self): """ Test that we raise an error if we have multiple objects """ self.list_response["objects"] = [OBJ_1_PARTIAL, OBJ_2_PARTIAL] self.list_response["meta"]["total_count"] = 1 adapter = PredictableTestAdapter([make_json_response(self.list_response), make_json_response(OBJ_1)]) self.client._session.mount(TEST_ENDPOINT, adapter) self.assertRaises(MultipleObjectsReturned, self.client.measurements.get)
def test_get_return(self): """ Test that GET returns a single object, and that we don't use the result from list """ self.list_response["objects"] = [OBJ_1_PARTIAL] self.list_response["meta"]["total_count"] = 1 adapter = PredictableTestAdapter([make_json_response(self.list_response), make_json_response(OBJ_1)]) self.client._session.mount(TEST_ENDPOINT, adapter) ret = self.client.measurements.get() self.assertDictEqual(OBJ_1, ret)
def test_get_return(self): """ Test that GET returns a single object, and that we don't use the result from list """ self.list_response["objects"] = [OBJ_1_PARTIAL] self.list_response["meta"]["total_count"] = 1 adapter = PredictableTestAdapter([ make_json_response(self.list_response), make_json_response(OBJ_1) ]) self.client._session.mount(TEST_ENDPOINT, adapter) ret = self.client.measurements.get() self.assertDictEqual(OBJ_1, ret)
def test_duplicate(self): """ Test that we raise an error if we have multiple objects """ self.list_response["objects"] = [OBJ_1_PARTIAL, OBJ_2_PARTIAL] self.list_response["meta"]["total_count"] = 1 adapter = PredictableTestAdapter([ make_json_response(self.list_response), make_json_response(OBJ_1) ]) self.client._session.mount(TEST_ENDPOINT, adapter) self.assertRaises(MultipleObjectsReturned, self.client.measurements.get)
def test_pagination(self): """ Test that we access all the pages """ b1 = { "meta": { "limit": 2, "next": "/api/v1/measurement/?offset=2&limit=2", "offset": 0, "previous": None, "total_count": 4 }, "objects": [{ "id": 1 }, { "id": 2 }] } b2 = { "meta": { "limit": 2, "next": None, "offset": 2, "previous": "/api/v1/measurement/?offset=0&limit=2", "total_count": 4 }, "objects": [{ "id": 3 }, { "id": 4 }] } adapter = PredictableTestAdapter( [make_json_response(b1), make_json_response(b2)]) self.client._session.mount(TEST_ENDPOINT, adapter) measurements = self.client.measurements.list() self.assertEqual(0, len(adapter.responses)) self.assertEqual(4, len(measurements)) self.assertEqual([1, 2, 3, 4], [measurement["id"] for measurement in measurements])
def setUp(self): self.client = Client(TEST_ENDPOINT) # We'll never hit that anyway test_loc = path_join(TEST_ENDPOINT, "/created/loc/1") created = Response() created.status_code = 201 created.headers["location"] = test_loc self.adapter = PredictableTestAdapter([created, make_json_response(OBJ_RESPONSE)]) self.client._session.mount(TEST_ENDPOINT, self.adapter)
def test_get_workflow(self): """ Test that the GET workflow is correct (list + retrieve) """ self.list_response["objects"] = [OBJ_1_PARTIAL] self.list_response["meta"]["total_count"] = 1 adapter = PredictableTestAdapter([make_json_response(self.list_response), make_json_response(OBJ_1)]) self.client._session.mount(TEST_ENDPOINT, adapter) self.client.measurements.get() self.assertEqual(2, len(adapter.requests)) l, retrieve = adapter.requests self.assertEqual("GET", l.method) self.assertEqual("GET", retrieve.method) self.assertEqual(path_join(TEST_ENDPOINT, "this/path"), retrieve.url)
def setUp(self): self.client = Client(TEST_ENDPOINT) # We'll never hit that anyway test_loc = path_join(TEST_ENDPOINT, "/created/loc/1") created = Response() created.status_code = 201 created.headers["location"] = test_loc self.adapter = PredictableTestAdapter( [created, make_json_response(OBJ_RESPONSE)]) self.client._session.mount(TEST_ENDPOINT, self.adapter)
def test_get_workflow(self): """ Test that the GET workflow is correct (list + retrieve) """ self.list_response["objects"] = [OBJ_1_PARTIAL] self.list_response["meta"]["total_count"] = 1 adapter = PredictableTestAdapter([ make_json_response(self.list_response), make_json_response(OBJ_1) ]) self.client._session.mount(TEST_ENDPOINT, adapter) self.client.measurements.get() self.assertEqual(2, len(adapter.requests)) l, retrieve = adapter.requests self.assertEqual("GET", l.method) self.assertEqual("GET", retrieve.method) self.assertEqual(path_join(TEST_ENDPOINT, "this/path"), retrieve.url)
def test_race_condition(self): self.client = Client(TEST_ENDPOINT) # We'll never hit that anyway response_data = dict(BASE_RESPONSE) absent = make_json_response(response_data) exists = Response() exists.status_code = 400 exists.reason = "BAD REQUEST" exists._content = six.b('{"configuration": {"__all__": ["Configuration with this I/O Mode, Block Size and I/O Depth already exists."]}}') response_data = dict(BASE_RESPONSE) response_data["objects"] = [OBJ_1_PARTIAL] response_data["total_count"] = 1 success_response = make_json_response(response_data) self.adapter = PredictableTestAdapter([absent, exists, success_response, make_json_response(OBJ_RESPONSE)]) self.client._session.mount(TEST_ENDPOINT, self.adapter) ret = self.client.configurations.get_or_create() self.assertDictEqual(OBJ_RESPONSE, ret) self.assertEqual(4, len(self.adapter.requests))
def test_related_filters(self): """ Test that we replace related objects with their IDs """ adapter = RepeatingTestAdapter(make_json_response(EMPTY_RESPONSE)) self.client._session.mount(TEST_ENDPOINT, adapter) self.client.measurements.list(related_obj={"id": "5", "arg2": "4"}) self.client.measurements.list(related_obj={"id": "5"}, other="1") r1, r2 = adapter.requests self.assertDictEqual({"related_obj": "5"}, extract_qs(r1.url)) self.assertDictEqual({"related_obj": "5", "other": "1"}, extract_qs(r2.url))
def test_filters(self): """ Test that arguments are translated as filters """ adapter = RepeatingTestAdapter(make_json_response(EMPTY_RESPONSE)) self.client._session.mount(TEST_ENDPOINT, adapter) self.client.measurements.list() self.client.measurements.list(arg1="1", arg2="2") self.client.measurements.list(arg1="1", arg2="2", arg3="a") r1, r2, r3 = adapter.requests self.assertDictEqual({}, extract_qs(r1.url)) self.assertDictEqual({"arg1": "1", "arg2": "2"}, extract_qs(r2.url)) self.assertDictEqual({"arg1": "1", "arg2": "2", "arg3": "a"}, extract_qs(r3.url))
def test_related_filters(self): """ Test that we replace related objects with their IDs """ adapter = RepeatingTestAdapter(make_json_response(EMPTY_RESPONSE)) self.client._session.mount(TEST_ENDPOINT, adapter) self.client.measurements.list(related_obj={"id": "5", "arg2": "4"}) self.client.measurements.list(related_obj={"id": "5"}, other="1") r1, r2 = adapter.requests self.assertDictEqual({"related_obj": "5"}, extract_qs(r1.url)) self.assertDictEqual({ "related_obj": "5", "other": "1" }, extract_qs(r2.url))
def test_filters(self): """ Test that arguments are translated as filters """ adapter = RepeatingTestAdapter(make_json_response(EMPTY_RESPONSE)) self.client._session.mount(TEST_ENDPOINT, adapter) self.client.measurements.list() self.client.measurements.list(arg1="1", arg2="2") self.client.measurements.list(arg1="1", arg2="2", arg3="a") r1, r2, r3 = adapter.requests self.assertDictEqual({}, extract_qs(r1.url)) self.assertDictEqual({"arg1": "1", "arg2": "2"}, extract_qs(r2.url)) self.assertDictEqual({ "arg1": "1", "arg2": "2", "arg3": "a" }, extract_qs(r3.url))
def test_retry(self): retry_max = 2 retry_wait = 7 client = Client(TEST_ENDPOINT, retry_max=retry_max, retry_wait=retry_wait) err_response = Response() err_response.status_code = 500 err_response.reason = "INTERNAL SERVER ERROR" response_data = dict(BASE_RESPONSE) response_data["objects"] = [OBJ_1_PARTIAL] response_data["total_count"] = 1 success_response = make_json_response(response_data) adapter = PredictableTestAdapter([err_response, err_response, success_response]) client._session.mount(TEST_ENDPOINT, adapter) mock_sleep = MockTimeSleep() with mock_sleep: try: response = client.measurements.list() except APIError as e: self.fail("API call wasn't retried: %s" % e) self.assertEqual([OBJ_1_PARTIAL], response) self.assertEqual([retry_wait, retry_wait], mock_sleep.calls) adapter = PredictableTestAdapter([err_response, err_response, err_response, success_response]) client._session.mount(TEST_ENDPOINT, adapter) mock_sleep = MockTimeSleep() with mock_sleep: self.assertRaises(APIError, client.measurements.list) self.assertEqual([retry_wait, retry_wait], mock_sleep.calls)
def test_not_found(self): adapter = PredictableTestAdapter([make_json_response(self.list_response), make_json_response(OBJ_1)]) self.client._session.mount(TEST_ENDPOINT, adapter) self.assertRaises(NoSuchObject, self.client.measurements.get)