Exemplo n.º 1
0
    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])
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
    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])
Exemplo n.º 8
0
    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)
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
    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))
Exemplo n.º 13
0
    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))
Exemplo n.º 14
0
    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))
Exemplo n.º 15
0
    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))
Exemplo n.º 16
0
    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))
Exemplo n.º 17
0
    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)
Exemplo n.º 18
0
 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)