Fix #1077 - Fix updating comment via API and add test

This commit is contained in:
Jessica Tallon 2014-12-16 12:05:18 +00:00
parent 9a51bf1ebc
commit 9e715bb07f
3 changed files with 55 additions and 24 deletions

View File

@ -803,31 +803,25 @@ class MediaComment(Base, MediaCommentMixin):
def unserialize(self, data, request): def unserialize(self, data, request):
""" Takes API objects and unserializes on existing comment """ """ Takes API objects and unserializes on existing comment """
# Do initial checks to verify the object is correct # Handle changing the reply ID
required_attributes = ["content", "inReplyTo"] if "inReplyTo" in data:
for attr in required_attributes: # Validate that the ID is correct
if attr not in data: try:
media_id = int(extract_url_arguments(
url=data["inReplyTo"]["id"],
urlmap=request.app.url_map
)["id"])
except ValueError:
return False return False
# Validate inReplyTo has ID media = MediaEntry.query.filter_by(id=media_id).first()
if "id" not in data["inReplyTo"]: if media is None:
return False return False
# Validate that the ID is correct self.media_entry = media.id
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 "content" in data:
if media is None: self.content = data["content"]
return False
self.media_entry = media.id
self.content = data["content"]
if "location" in data: if "location" in data:
Location.create(data["location"], self) Location.create(data["location"], self)

View File

@ -360,9 +360,9 @@ def feed_endpoint(request, outbox=None):
status=403 status=403
) )
if not comment.unserialize(data["object"]): if not comment.unserialize(data["object"], request):
return json_error( return json_error(
"Invalid 'comment' with id '{0}'".format(obj_id) "Invalid 'comment' with id '{0}'".format(obj["id"])
) )
comment.save() comment.save()
@ -382,7 +382,7 @@ def feed_endpoint(request, outbox=None):
image = MediaEntry.query.filter_by(id=obj_id).first() image = MediaEntry.query.filter_by(id=obj_id).first()
if image is None: if image is None:
return json_error( 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 # Check that the person trying to update the comment is

View File

@ -561,3 +561,40 @@ class TestAPI(object):
assert "object" in delete assert "object" in delete
assert delete["object"]["id"] == comment["object"]["id"] assert delete["object"]["id"] == comment["object"]["id"]
assert delete["object"]["objectType"] == "comment" 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"]