class _BaseCollectionTest(object): """ A base class for tests of a collection. """ def setUp(self): self.collection = self.collectionClass() self.resource = IResource(self.collection) def addElements(self, elements=None): """ Adds some element to the collection. If no elements are specified, create the default elements specified by the elementClass and elementArgs class attributes. """ if elements is None: elements = [self.elementClass(*a) for a in self.elementArgs] for e in elements: self.collection.add(e) def _makeRequest(self, resource, request): """ Makes a request to a particular resource. """ self.request = request self.response = resource.render(request) def _decodeResponse(self): """ Tries to decode the body of a response. """ self.responseContent = json.loads(self.response) def _checkContentType(self, expectedContentType="application/json"): """ Verifies the content type of a response. If the type is ``None``, verifies that the header is not passed. This is intended for cases where an empty response body is expected. """ headers = self.request.responseHeaders.getRawHeaders("Content-Type") if expectedContentType is None: self.assertEqual(headers, None) else: self.assertEqual(headers, [expectedContentType]) def _checkBadRequest(self, expectedCode): """ Tests that a failed request has a particular response code, and that the response content has an error message and some details in it. """ self.assertEqual(self.request.code, expectedCode) self.assertIn("errorMessage", self.responseContent) self.assertIn("errorDetails", self.responseContent) def _getResource(self, args=None, headers=None, path=()): """ Generalized GET for a particular resource. """ request = _FakeRequest(args=args, requestHeaders=headers) resource = self.resource for childName in path: resource = resource.getChildWithDefault(childName, request) self._makeRequest(resource, request) self._checkContentType() self._decodeResponse() def getElements(self, args=None, headers=None): """ Gets a bunch of elements from a collection. """ self._getResource(args, headers) def getElement(self, element, args=None, headers=None): """ Gets a particular element from a collection. """ self._getResource(args, headers, [element]) def getElementChild(self, element, child, args=None, headers=None): """ Gets a child of a particular element from a collection. """ self._getResource(args, headers, [element, child]) def updateElement(self, name, body, headers=None): """ Update an element. For a successful update, the headers should contain a Content-Type. """ request = _FakePUTRequest(body=body, requestHeaders=headers) elementResource = self.resource.getChild(name, request) self._makeRequest(elementResource, request) def deleteElement(self, name): """ Delete an element. """ request = _FakeDELETERequest() elementResource = self.resource.getChild(name, request) self._makeRequest(elementResource, request) def createElement(self, name, body, headers=None, method="PUT"): """ Create a new element. """ if method == "PUT": self.updateElement(name, body, headers) elif method == "POST": request = _FakePOSTRequest(body=body, requestHeaders=headers) self._makeRequest(self.resource, request)