def unserialize(self, data, request):
""" Takes API objects and unserializes on existing comment """
- # Do initial checks to verify the object is correct
- required_attributes = ["content", "inReplyTo"]
- for attr in required_attributes:
- if attr not in data:
+ # Handle changing the reply ID
+ if "inReplyTo" in data:
+ # Validate that the ID is correct
+ try:
+ media_id = int(extract_url_arguments(
+ url=data["inReplyTo"]["id"],
+ urlmap=request.app.url_map
+ )["id"])
+ except ValueError:
return False
- # Validate inReplyTo has ID
- if "id" not in data["inReplyTo"]:
- return False
+ media = MediaEntry.query.filter_by(id=media_id).first()
+ if media is None:
+ return False
- # Validate that the ID is correct
- try:
- media_id = int(extract_url_arguments(
- url=data["inReplyTo"]["id"],
- urlmap=request.app.url_map
- )["id"])
- except ValueError:
- return False
-
- media = MediaEntry.query.filter_by(id=media_id).first()
- if media is None:
- return False
-
- self.media_entry = media.id
- self.content = data["content"]
+ self.media_entry = media.id
+
+ if "content" in data:
+ self.content = data["content"]
if "location" in data:
Location.create(data["location"], self)
status=403
)
- if not comment.unserialize(data["object"]):
+ if not comment.unserialize(data["object"], request):
return json_error(
- "Invalid 'comment' with id '{0}'".format(obj_id)
+ "Invalid 'comment' with id '{0}'".format(obj["id"])
)
comment.save()
image = MediaEntry.query.filter_by(id=obj_id).first()
if image is None:
return json_error(
- "No such 'image' with the id '{0}'.".format(obj_id)
+ "No such 'image' with the id '{0}'.".format(obj["id"])
)
# Check that the person trying to update the comment is
assert "object" in delete
assert delete["object"]["id"] == comment["object"]["id"]
assert delete["object"]["objectType"] == "comment"
+
+ def test_edit_comment(self, test_app):
+ """ Test that someone can update their own comment """
+ # First upload an image to comment against
+ response, data = self._upload_image(test_app, GOOD_JPG)
+ response, data = self._post_image_to_feed(test_app, data)
+
+ # Post a comment to edit
+ activity = {
+ "verb": "post",
+ "object": {
+ "objectType": "comment",
+ "content": "This is a comment",
+ "inReplyTo": data["object"],
+ }
+ }
+
+ comment = self._activity_to_feed(test_app, activity)[1]
+
+ # Now create an update activity to change the content
+ activity = {
+ "verb": "update",
+ "object": {
+ "id": comment["object"]["id"],
+ "content": "This is my fancy new content string!",
+ "objectType": "comment",
+ },
+ }
+
+ comment = self._activity_to_feed(test_app, activity)[1]
+
+ # Verify the comment reflects the changes
+ comment_id = int(comment["object"]["id"].split("/")[-2])
+ model = MediaComment.query.filter_by(id=comment_id).first()
+
+ assert model.content == activity["object"]["content"]
+