Esempio n. 1
0
    def test_update_item(self):
        """Test API DataModel update_item functionality."""
        model = webservice.SimpleDataModel("test")
        for context in self.CONTEXTS:
            items = ["%s/foo%d" % (context, i) for i in [0, 1, 2]]
            id_, item = model.add_item(items[0], {}, context=context)
            self.assertNotEqual(item, items[1], "item not yet updated")
            ret = model.update_item(id_, items[1], {}, context=context)
            self.assertEqual(ret, items[1],
                             "update_item returned updated item")
            ret = model.get_item(id_, {}, context=context)
            self.assertEqual(ret, items[1],
                             "get_item(updated_item_id) returns updated item")

            self.assertNotEqual(item, items[2], "item not yet reupdated")
            ret = model.update_item(id_, items[2], {}, context=context)
            self.assertEqual(ret, items[2],
                             "update_item returned reupdated item")
            ret = model.get_item(id_, {}, context=context)
            self.assertEqual(
                ret, items[2],
                "get_item(reupdated_item_id) returns reupdated item")

            self.assertRaises(KeyError, model.update_item, self.UNADDED_ID,
                              'blah', {}, context)
Esempio n. 2
0
    def test__exception(self):
        model = webservice.SimpleDataModel("test")
        for method in [m for m in dir(model) if "_item" in m]:
            setattr(model, method, mock.Mock(side_effect=Exception()))

        resource_mgr = application.ResourceManager()
        app = application.ApiApplication(resource_mgr)

        collection_handler = webservice.CollectionHandler(r'/c', model)
        resource_mgr.register_handler(collection_handler)
        for method in ['GET', 'POST']:
            request = webob.Request.blank('/c',
                                          body='{}'.encode('utf-8'),
                                          method=method)
            response = app(request)
            self._check_base_exc_response(method, response, 500)

        element_handler = webservice.ElementHandler(r'/e', model)
        resource_mgr.register_handler(element_handler)
        for method in ['GET', 'PUT', 'PATCH', 'DELETE']:
            request = webob.Request.blank('/e',
                                          body='{}'.encode('utf-8'),
                                          method=method)
            response = app(request)
            self._check_base_exc_response(method, response, 500)

            # Tests that making a request to an invalid url returns 404.
            request = webob.Request.blank('/invalid',
                                          body='{}'.encode('utf-8'),
                                          method=method)
            response = app(request)
            self._check_base_exc_response(method, response, 404)
Esempio n. 3
0
    def test_data_model_exception(self):
        exc = webservice.DataModelException(1, "error1", [1, {'a': 'b'}], 409)
        model = webservice.SimpleDataModel("test")
        for method in [m for m in dir(model) if "_item" in m]:
            setattr(model, method, mock.Mock(side_effect=exc))

        resource_mgr = application.ResourceManager()
        app = application.ApiApplication(resource_mgr)

        collection_handler = webservice.CollectionHandler(r'/c', model)
        resource_mgr.register_handler(collection_handler)
        for method in ['GET', 'POST']:
            request = webob.Request.blank('/c',
                                          body='{}'.encode('utf-8'),
                                          method=method)
            response = app(request)
            self._check_data_model_exc_response(method, exc, response)

        element_handler = webservice.ElementHandler(r'/e', model)
        resource_mgr.register_handler(element_handler)
        for method in ['GET', 'PUT', 'PATCH', 'DELETE']:
            request = webob.Request.blank('/e',
                                          body='{}'.encode('utf-8'),
                                          method=method)
            response = app(request)
            self._check_data_model_exc_response(method, exc, response)
Esempio n. 4
0
    def test_replace_members(self):
        collection_handler = webservice.CollectionHandler(r'/', '')
        collection_handler.model = webservice.SimpleDataModel('test')
        request = webob.Request.blank('/')
        request.content_type = 'application/json'
        request.body = '{"key1": "value1", "key2": "value2"}'.encode('utf-8')
        response = collection_handler.replace_members(request)

        self.assertEqual('application/json', response.content_type)
        self.assertEqual(str(int(httplib.OK)) + " OK", response.status)
        expected_items = {
            "key1": "value1",
            "key2": "value2",
        }
        self.assertEqual(expected_items, collection_handler.model.items)
Esempio n. 5
0
 def test_create_member(self):
     collection_handler = webservice.CollectionHandler(r'/', '')
     collection_handler.model = webservice.SimpleDataModel("test")
     request = mock.MagicMock()
     request.body = '{"key": "value"}'
     request.path = "/"
     response = collection_handler.create_member(request, id_='123')
     self.assertEqual('application/json', response.content_type)
     self.assertEqual(str(httplib.CREATED) + " Created", response.status)
     self.assertEqual("%s/%s" % (request.path, '123'), response.location)
     actual_response = json.loads(response.body)
     actual_id = actual_response.get("id")
     actual_value = actual_response.get("key")
     self.assertEqual('123', actual_id)
     self.assertEqual('value', actual_value)
Esempio n. 6
0
    def test_add_item(self):
        """Test API DataModel add_item functionality."""
        model = webservice.SimpleDataModel("test")
        assigned_ids = set()
        for context in self.CONTEXTS:
            items = ["%s/foo" % context, "%s/bar" % context]
            ret = model.add_item(items[0], {}, context=context)
            self.assertIsInstance(ret, tuple, "add_item returns a tuple")
            self.assertEqual(len(ret), 2, "add_item returns tuple of length 2")
            self.assertNotIn(ret[0], assigned_ids,
                             "add_item assigned unique ID")
            assigned_ids.add(ret[0])
            self.assertEqual(ret[1], items[0], "add_item returned added item")

            ret = model.add_item(items[1], {}, 'myid', context=context)
            self.assertEqual(ret[0], 'myid', "add_item returned provided ID")
            self.assertEqual(ret[1], items[1], "add_item returned added item")
Esempio n. 7
0
    def test_list_members(self):
        collection_handler = webservice.CollectionHandler(r'/', '')
        collection_handler.model = webservice.SimpleDataModel("test")
        request = mock.MagicMock()
        request.body = '{"key": "value"}'
        request.params = mock.MagicMock()
        request.path = "/"
        response = collection_handler.list_members(request)
        items = collection_handler.model.get_items(
            request.params, context=collection_handler._get_context(request))

        expected_body = ("%s\n" % json.dumps(items, indent=2)).encode('utf-8')
        self.assertEqual('application/json', response.content_type)

        self.assertEqual(expected_body, response.body)
        self.assertEqual('application/json', response.content_type)
        self.assertEqual(str(int(httplib.OK)) + " OK", response.status)
Esempio n. 8
0
 def test_get_items(self):
     """Test API DataModel get_items functionality."""
     model = webservice.SimpleDataModel("test")
     for context in self.CONTEXTS:
         ret = model.get_items({}, context=context)
         self.assertEqual(
             ret.keys(), ['results'],
             "get_items returns dict with single 'results' key")
         self.assertEqual(
             tuple(ret['results']), tuple(),
             "get_items of empty model returns empty results list")
         items = [{"i1": "%s/foo" % context}, {"i2": "%s/bar" % context}]
         for item in items:
             model.add_item(item, {}, context=context)
         ret2 = model.get_items({}, context=context)
         self.assertEqual(sorted(ret2['results']), sorted(items),
                          "get_items() returns all items added to model")
Esempio n. 9
0
    def test_action(self):
        element_handler = webservice.ElementHandler(r'/', '')
        element_handler.model = webservice.SimpleDataModel("test")
        request = mock.MagicMock()
        request.path = "/"

        response = element_handler.action(request)
        self.assertEqual(400, response.status_code)
        self.assertEqual('application/json', response.content_type)
        self.assertEqual(
            json.loads(response.body.decode('utf-8'))['error']['message'],
            "Missing required action parameter.")

        request.params = mock.MagicMock()
        request.params.getall.return_value = ['do_test']
        request.params["action"] = "do_test"
        request.path = "/"
        response = element_handler.action(request)
        self.assertEqual(501, response.status_code)
        self.assertEqual('application/json', response.content_type)
        self.assertEqual(
            json.loads(response.body.decode('utf-8'))['error']['message'],
            "Method not supported")

        # test action impl returning python primitives
        simple_data = [1, 2]
        element_handler.model.do_test_action = lambda *a, **kwa: simple_data
        response = element_handler.action(request)
        self.assertEqual(200, response.status_code)
        self.assertEqual('application/json', response.content_type)
        self.assertEqual(json.loads(response.body.decode('utf-8')),
                         simple_data)

        # test action impl returning custom webob response
        custom_data = webob.Response(body="test".encode('utf-8'),
                                     status=599,
                                     content_type="custom/test")
        element_handler.model.do_test_action = lambda *a, **kwa: custom_data
        response = element_handler.action(request)
        self.assertEqual(599, response.status_code)
        self.assertEqual('custom/test', response.content_type)
        self.assertEqual(response.body.decode('utf-8'), "test")
Esempio n. 10
0
    def test_get_item(self):
        """Test API DataModel get_item functionality."""
        model = webservice.SimpleDataModel("test")
        for context in self.CONTEXTS:
            items = ["%s/foo" % context, "%s/bar" % context]
            id_ = model.add_item(items[0], {}, context=context)[0]
            ret = model.get_item(id_, {}, context=context)
            self.assertEqual(ret, items[0],
                             "get_item(assigned_id) returns proper item")

            id_ = 'myid'
            ret = model.get_item(id_, {}, context=context)
            self.assertIsNone(ret,
                              "get_item(unadded_provided_id) returns None")
            model.add_item(items[1], {}, id_, context=context)
            ret = model.get_item(id_, {}, context=context)
            self.assertEqual(ret, items[1],
                             "get_item(provided_id) returned added item")

            ret = model.get_item(self.UNADDED_ID, {}, context=context)
            self.assertIsNone(ret, "get_item(unadded_id) returns None")
Esempio n. 11
0
    def test_delete_item(self):
        """Test API DataModel delete_item functionality."""
        model = webservice.SimpleDataModel("test")

        for context in self.CONTEXTS:
            item_ids = []
            items = ["%s/foo%d" % (context, i) for i in [0, 1, 2]]
            for i in range(len(items)):
                id_, item = model.add_item(items[i], {}, context=context)
                item_ids.append(id_)

            for i in range(len(items)):
                ret = model.delete_item(item_ids[i], {}, context=context)
                self.assertEqual(ret, items[i],
                                 "delete_item returned deleted item")
                self.assertRaises(KeyError, model.delete_item, item_ids[i], {},
                                  context)
            self.assertEqual(
                len(model.get_items({}, context=context)['results']), 0,
                "all items deleted")

            self.assertRaises(KeyError, model.delete_item, self.UNADDED_ID, {},
                              context)