def testPost(self): request = { u"data": { u"type": u"article", u"attributes": { u"title": u"Test entry" }, u"relationships": { u"author": { u"data": { u"id": u"1", u"type": u"person" } } } } } JsonAPIValidator.validate_jsonapi(request, True) result = self.app.post_json("/articles", params=request) self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertIn("relationships", result.json["data"]) for key, rel in result.json["data"]["relationships"].iteritems(): self.assertIn(key, ["comments", "cover", "author", "revisions"]) self.assertIn("links", rel) self.assertIn("related", rel["links"]) self.assertIn("self", rel["links"])
def testList(self): result = self.app.get("/articles") self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertIn("data", result.json) self.assertIs(len(result.json["data"]), len(ARTICLE_TITLES)) for row in result.json["data"]: self.assertEqual(row["type"], "article") self.assertIn("attributes", row) # expected attributes: title, created self.assertIs(len(row["attributes"]), 2) self.assertIn("title", row["attributes"]) self.assertIn("created", row["attributes"]) self.assertNotIn("author", row["attributes"]) self.assertIn(row["attributes"]["title"], ARTICLE_TITLES) self.assertIn("relationships", row) for key, relationship in row["relationships"].iteritems(): self.assertIn(key, ["comments", "cover", "author", "revisions"]) self.assertIn("links", relationship) self.assertIn("related", relationship["links"]) self.assertIn("self", relationship["links"])
def testPatch(self): request = { u"data": { u"type": u"article", u"id": u"1", u"attributes": { u"title": u"Changed First Entry" } } } JsonAPIValidator.validate_jsonapi(request) result = self.app.patch_json("/articles/1", params=request) self.assertIn(result.status, ["202 Accepted", "200 OK", "204 No Content"]) if result.status == "204 No Content": # nothing more to test return JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertEqual(result.json["data"]["attributes"]["title"], "Changed First Entry")
def testPost(self): request = { u"data": { u"type": u"article", u"attributes": { u"title": u"Test entry" }, u"relationships": { u"author": { u"data": {u"id": u"1", u"type": u"person"} } } } } JsonAPIValidator.validate_jsonapi(request, True) result = self.app.post_json("/articles", params=request) self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertIn("relationships", result.json["data"]) for key, rel in result.json["data"]["relationships"].iteritems(): self.assertIn(key, ["comments", "cover", "author", "revisions"]) self.assertIn("links", rel) self.assertIn("related", rel["links"]) self.assertIn("self", rel["links"])
def testPatchRelationship(self): result = self.app.get("/articles/1") self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) rel = result.json["data"]["relationships"]["author"]["links"]["self"] request = { u"data": {u"type": u"person", u"id": u"2"} } JsonAPIValidator.validate_jsonapi(request) result = self.app.patch_json(rel, params=request) self.assertIn( result.status, ["200 OK", "202 Accepted", "204 No Content"] ) if result.status == "204 No Content": self.assertIs(len(result.body), 0) elif result.status == "200 OK": self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json)
def testCreatingResourceWithReferences(self): request = { u"data": { u"type": u"photo", u"attributes": { u"title": u"Ember Hamster", u"src": u"http://example.com/images/productivity.png" }, u"relationships": { u"photographer": { u"data": { u"type": u"people", u"id": u"2" } } } } } JsonAPIValidator.validate_jsonapi(request, True) result = self.app.post_json("/photos", params=request) JsonAPIValidator.validate_content_type(result.content_type) JsonAPIValidator.validate_jsonapi(result.json) if not result.location: warnings.warn( "The response SHOULD include a Location header identifying the" "location of the newly created resource.") else: res = self.app.get(result.location) self.assertIsNotNone(res.json) JsonAPIValidator.validate_jsonapi(res.json)
def testList(self): result = self.app.get("/articles") self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertIn("data", result.json) self.assertIs(len(result.json["data"]), len(ARTICLE_TITLES)) for row in result.json["data"]: self.assertEqual(row["type"], "article") self.assertIn("attributes", row) # expected attributes: title, created self.assertIs(len(row["attributes"]), 2) self.assertIn("title", row["attributes"]) self.assertIn("created", row["attributes"]) self.assertNotIn("author", row["attributes"]) self.assertIn(row["attributes"]["title"], ARTICLE_TITLES) self.assertIn("relationships", row) for key, relationship in row["relationships"].iteritems(): self.assertIn( key, ["comments", "cover", "author", "revisions"] ) self.assertIn("links", relationship) self.assertIn("related", relationship["links"]) self.assertIn("self", relationship["links"])
def testPatch(self): request = { u"data": { u"type": u"article", u"id": u"1", u"attributes": { u"title": u"Changed First Entry" } } } JsonAPIValidator.validate_jsonapi(request) result = self.app.patch_json("/articles/1", params=request) self.assertIn( result.status, ["202 Accepted", "200 OK", "204 No Content"] ) if result.status == "204 No Content": # nothing more to test return JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertEqual( result.json["data"]["attributes"]["title"], "Changed First Entry" )
def testCreatingResourceWithReferences(self): request = { u"data": { u"type": u"photo", u"attributes": { u"title": u"Ember Hamster", u"src": u"http://example.com/images/productivity.png" }, u"relationships": { u"photographer": { u"data": {u"type": u"people", u"id": u"2"} } } } } JsonAPIValidator.validate_jsonapi(request, True) result = self.app.post_json("/photos", params=request) JsonAPIValidator.validate_content_type(result.content_type) JsonAPIValidator.validate_jsonapi(result.json) if not result.location: warnings.warn( "The response SHOULD include a Location header identifying the" "location of the newly created resource." ) else: res = self.app.get(result.location) self.assertIsNotNone(res.json) JsonAPIValidator.validate_jsonapi(res.json)
def testFetchingNullRelationship(self): result = self.app.get("/articles/1") rel = result.json["data"]["relationships"]["cover"]["links"]["related"] result = self.app.get(rel) JsonAPIValidator.validate_content_type(result.content_type) self.assertEqual(result.status, "200 OK") self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertIsNone(result.json["data"])
def testCreatingResourceWithMissingRequiredAttributeShouldFail(self): request = { u"data": { u"type": u"person", u"attributes": { u"name": u"Eve Bobbington" # attribute 'age' is missing } } } JsonAPIValidator.validate_jsonapi(request, True) result = self.app.post_json("/people", params=request, status=400) JsonAPIValidator.validate_content_type(result.content_type) JsonAPIValidator.validate_jsonapi(result.json)
def testGetRelationship(self): result = self.app.get("/articles/1") self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) result = self.app.get( result.json["data"]["relationships"]["author"]["links"]["self"]) self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertIn("data", result.json) self.assertIsInstance(result.json["data"], dict) self.assertEqual(result.json["data"]["type"], "person") self.assertEqual(result.json["data"]["id"], "1")
def testGetRelationship(self): result = self.app.get("/articles/1") self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) result = self.app.get( result.json["data"]["relationships"]["author"]["links"]["self"] ) self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertIn("data", result.json) self.assertIsInstance(result.json["data"], dict) self.assertEqual(result.json["data"]["type"], "person") self.assertEqual(result.json["data"]["id"], "1")
def testFetchingDataCollection(self): result = self.app.get("/articles") JsonAPIValidator.validate_content_type(result.content_type) self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_jsonapi(result.json) self.assertIs(len(result.json["data"]), 2) for entry in result.json["data"]: self.assertEqual(entry["type"], "article") self.assertIsInstance(entry["id"], unicode) self.assertIn(entry["attributes"]["title"], ARTICLE_TITLES) Article.delete().where(True).execute() result = self.app.get("/articles") JsonAPIValidator.validate_content_type(result.content_type) self.assertEqual(result.status, "200 OK") self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) self.assertIs(len(result.json["data"]), 0)
def testPatchRelationship(self): result = self.app.get("/articles/1") self.assertEqual(result.status, "200 OK") JsonAPIValidator.validate_content_type(result.content_type) self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json) rel = result.json["data"]["relationships"]["author"]["links"]["self"] request = {u"data": {u"type": u"person", u"id": u"2"}} JsonAPIValidator.validate_jsonapi(request) result = self.app.patch_json(rel, params=request) self.assertIn(result.status, ["200 OK", "202 Accepted", "204 No Content"]) if result.status == "204 No Content": self.assertIs(len(result.body), 0) elif result.status == "200 OK": self.assertIsNotNone(result.json) JsonAPIValidator.validate_jsonapi(result.json)
def testUpdatingResourceViaSelfLink(self): UPDATE_TITLE = u"Five Ways You Have Never Tried To Access Your Data" result = self.app.get("/articles/1") update_uri = result.json["data"]["links"]["self"] request = { u"data": { u"type": u"article", u"id": u"1", u"attributes": { u"title": UPDATE_TITLE } } } JsonAPIValidator.validate_jsonapi(request) res = self.app.patch_json(update_uri, params=request) if "204" not in res.status: JsonAPIValidator.validate_content_type(res.content_type) res = self.app.get("/articles/1") self.assertEqual(res.json["data"]["attributes"]["title"], UPDATE_TITLE)