diff options
-rw-r--r-- | mediagoblin/db/models.py | 38 | ||||
-rw-r--r-- | mediagoblin/federation/views.py | 6 | ||||
-rw-r--r-- | mediagoblin/tests/test_api.py | 37 |
3 files changed, 56 insertions, 25 deletions
diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 440aa682..fba58ca8 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -803,31 +803,25 @@ class MediaComment(Base, MediaCommentMixin): 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) diff --git a/mediagoblin/federation/views.py b/mediagoblin/federation/views.py index 69dee7fb..5b10fb5b 100644 --- a/mediagoblin/federation/views.py +++ b/mediagoblin/federation/views.py @@ -360,9 +360,9 @@ def feed_endpoint(request, outbox=None): 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() @@ -382,7 +382,7 @@ def feed_endpoint(request, outbox=None): 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 diff --git a/mediagoblin/tests/test_api.py b/mediagoblin/tests/test_api.py index a4cb21d6..83003875 100644 --- a/mediagoblin/tests/test_api.py +++ b/mediagoblin/tests/test_api.py @@ -561,3 +561,40 @@ class TestAPI(object): 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"] + |