def test_delete_with_local_site_no_access(self):
        """Testing the
        DELETE review-requests/<id>/reviews/<id>/screenshot-comments/<id> API
        with a local site and Permission Denied error
        """
        comment_text = 'This is a test comment.'
        x, y, w, h = (2, 2, 10, 10)

        user = self._login_user(local_site=True)

        review_request = self.create_review_request(with_local_site=True,
                                                    publish=True)
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=user)
        comment = self.create_screenshot_comment(review, screenshot,
                                                 comment_text, x, y, w, h)

        self.apiDelete(
            get_review_screenshot_comment_item_url(review, comment.pk,
                                                   self.local_site_name))

        self._login_user()

        rsp = self.apiDelete(
            get_review_screenshot_comment_item_url(review, comment.pk,
                                                   self.local_site_name),
            expected_status=403)
        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
    def setup_review_request_child_test(self, review_request):
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=self.user)
        comment = self.create_screenshot_comment(review, screenshot)

        return (get_review_screenshot_comment_item_url(review, comment.pk),
                screenshot_comment_item_mimetype)
    def setup_basic_delete_test(self, user, with_local_site, local_site_name):
        review_request = self.create_review_request(with_local_site=with_local_site, submitter=user, publish=True)
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=user)
        comment = self.create_screenshot_comment(review, screenshot)

        return (get_review_screenshot_comment_item_url(review, comment.pk, local_site_name), [comment, review])
    def test_delete_with_local_site(self):
        """Testing the
        DELETE review-requests/<id>/reviews/<id>/screenshot-comments/<id> API
        with a local site
        """
        comment_text = 'This is a test comment.'
        x, y, w, h = (2, 2, 10, 10)

        user = self._login_user(local_site=True)

        review_request = self.create_review_request(with_local_site=True,
                                                    publish=True)
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=user)
        comment = self.create_screenshot_comment(review, screenshot,
                                                 comment_text, x, y, w, h)

        self.apiDelete(
            get_review_screenshot_comment_item_url(review, comment.pk,
                                                   self.local_site_name))

        rsp = self.apiGet(
            get_review_screenshot_comment_list_url(review,
                                                   self.local_site_name),
            expected_mimetype=screenshot_comment_list_mimetype)
        self.assertEqual(rsp['stat'], 'ok')
        self.assertTrue('screenshot_comments' in rsp)
        self.assertEqual(len(rsp['screenshot_comments']), 0)
    def test_put_with_extra_fields(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        with extra fields
        """
        extra_fields = {"extra_data.foo": "abc", "extra_data.bar": "", "ignored": "foo"}

        comment_text = "This is a test comment."

        review_request = self.create_review_request(submitter=self.user, publish=True)
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=self.user)
        comment = self.create_screenshot_comment(
            review, screenshot, text=comment_text, extra_fields={"foo": "123", "bar": "456"}
        )

        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk),
            extra_fields,
            expected_mimetype=screenshot_comment_item_mimetype,
        )
        self.assertEqual(rsp["stat"], "ok")

        comment = ScreenshotComment.objects.get(pk=rsp["screenshot_comment"]["id"])

        self.assertTrue("foo" in comment.extra_data)
        self.assertFalse("bar" in comment.extra_data)
        self.assertFalse("ignored" in comment.extra_data)
        self.assertEqual(len(comment.extra_data), 1)
        self.assertEqual(comment.extra_data["foo"], extra_fields["extra_data.foo"])
    def test_delete_screenshot_comment_with_does_not_exist_error(self):
        """Testing the DELETE review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API with Does Not Exist error"""
        x, y, w, h = (2, 2, 10, 10)

        review_request = self.create_review_request(publish=True)
        self.create_screenshot(review_request)
        review = self.create_review(review_request, user=self.user)

        self.apiDelete(get_review_screenshot_comment_item_url(review, 123),
                       expected_status=404)
    def test_put_deleted_screenshot_comment_issue_status(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>
        API with an issue and a deleted screenshot
        """
        comment_text = "Test screenshot comment with an opened issue"
        x, y, w, h = (2, 2, 10, 10)

        review_request = self.create_review_request(publish=True,
                                                    submitter=self.user,
                                                    target_people=[self.user])
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=self.user)
        comment = self.create_screenshot_comment(review, screenshot,
                                                 comment_text, x, y, w, h,
                                                 issue_opened=True)

        # First, let's ensure that the user that has created the comment
        # cannot alter the issue_status while the review is unpublished.
        rsp = self.api_put(
            get_review_screenshot_comment_item_url(review, comment.pk),
            {'issue_status': 'resolved'},
            expected_mimetype=screenshot_comment_item_mimetype)

        self.assertEqual(rsp['stat'], 'ok')

        # The issue_status should still be "open"
        self.assertEqual(rsp['screenshot_comment']['issue_status'], 'open')

        # Next, let's publish the review, and try altering the issue_status.
        # This should be allowed, since the review request was made by the
        # current user.
        review.public = True
        review.save()

        rsp = self.api_put(
            rsp['screenshot_comment']['links']['self']['href'],
            {'issue_status': 'resolved'},
            expected_mimetype=screenshot_comment_item_mimetype)
        self.assertEqual(rsp['stat'], 'ok')
        self.assertEqual(rsp['screenshot_comment']['issue_status'], 'resolved')

        # Delete the screenshot.
        self._delete_screenshot(review_request, screenshot)
        review_request.publish(review_request.submitter)

        # Try altering the issue_status. This should be allowed.
        rsp = self.api_put(
            rsp['screenshot_comment']['links']['self']['href'],
            {'issue_status': 'open'},
            expected_mimetype=screenshot_comment_item_mimetype)
        self.assertEqual(rsp['stat'], 'ok')
        self.assertEqual(rsp['screenshot_comment']['issue_status'], 'open')
    def setup_basic_put_test(self, user, with_local_site, local_site_name, put_valid_data):
        review_request = self.create_review_request(with_local_site=with_local_site, submitter=user, publish=True)
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=user)
        comment = self.create_screenshot_comment(review, screenshot)

        return (
            get_review_screenshot_comment_item_url(review, comment.pk, local_site_name),
            screenshot_comment_item_mimetype,
            {"text": "Test comment"},
            comment,
            [],
        )
    def test_put_issue_status_after_publish(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        with an issue, after review is published
        """
        comment, review, review_request = self._create_screenshot_review_with_issue(publish=True)

        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk),
            {"issue_status": "resolved"},
            expected_mimetype=screenshot_comment_item_mimetype,
        )
        self.assertEqual(rsp["stat"], "ok")
        self.assertEqual(rsp["screenshot_comment"]["issue_status"], "resolved")
    def test_put_with_issue(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        with an issue, removing issue_opened
        """
        comment, review, review_request = self._create_screenshot_review_with_issue()

        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk),
            {"issue_opened": False},
            expected_mimetype=screenshot_comment_item_mimetype,
        )
        self.assertEqual(rsp["stat"], "ok")
        self.assertFalse(rsp["screenshot_comment"]["issue_opened"])
    def test_put_issue_status_after_publish(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        with an issue, after review is published
        """
        comment, review, review_request = \
            self._create_screenshot_review_with_issue(publish=True)

        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk),
            {'issue_status': 'resolved'},
            expected_mimetype=screenshot_comment_item_mimetype)
        self.assertEqual(rsp['stat'], 'ok')
        self.assertEqual(rsp['screenshot_comment']['issue_status'], 'resolved')
    def test_put_with_issue(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        with an issue, removing issue_opened
        """
        comment, review, review_request = \
            self._create_screenshot_review_with_issue()

        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk),
            {'issue_opened': False},
            expected_mimetype=screenshot_comment_item_mimetype)
        self.assertEqual(rsp['stat'], 'ok')
        self.assertFalse(rsp['screenshot_comment']['issue_opened'])
    def test_put_issue_status_before_publish(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id> API
        with an issue, before review is published
        """
        comment, review, review_request = \
            self._create_screenshot_review_with_issue()

        # The issue_status should not be able to be changed while the review is
        # unpublished.
        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk),
            {'issue_status': 'resolved'},
            expected_mimetype=screenshot_comment_item_mimetype)

        self.assertEqual(rsp['stat'], 'ok')

        # The issue_status should still be "open"
        self.assertEqual(rsp['screenshot_comment']['issue_status'], 'open')
    def test_put_issue_status_by_uninvolved_user(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        permissions for an uninvolved user
        """
        comment, review, review_request = self._create_screenshot_review_with_issue(publish=True)

        # Change the owner of the review request and review so that they're not
        # owned by self.user.
        new_owner = User.objects.get(username="******")
        review_request.submitter = new_owner
        review_request.save()
        review.user = new_owner
        review.save()

        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk), {"issue_status": "dropped"}, expected_status=403
        )
        self.assertEqual(rsp["stat"], "fail")
        self.assertEqual(rsp["err"]["code"], PERMISSION_DENIED.code)
    def test_put_issue_status_by_issue_creator(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        permissions for issue creator
        """
        comment, review, review_request = \
            self._create_screenshot_review_with_issue(publish=True)

        # Change the owner of the review request so that it's not owned by
        # self.user
        review_request.submitter = User.objects.get(username='******')
        review_request.save()

        # The review/comment (and therefore issue) is still owned by self.user,
        # so we should be able to change the issue status.
        rsp = self.api_put(get_review_screenshot_comment_item_url(
            review, comment.pk), {'issue_status': 'dropped'},
                           expected_mimetype=screenshot_comment_item_mimetype)
        self.assertEqual(rsp['stat'], 'ok')
        self.assertEqual(rsp['screenshot_comment']['issue_status'], 'dropped')
    def test_delete(self):
        """Testing the
        DELETE review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        """
        comment_text = "This is a test comment."
        x, y, w, h = (2, 2, 10, 10)

        review_request = self.create_review_request(publish=True)
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=self.user)
        comment = self.create_screenshot_comment(review, screenshot, comment_text, x, y, w, h)

        self.apiDelete(get_review_screenshot_comment_item_url(review, comment.pk))

        rsp = self.apiGet(
            get_review_screenshot_comment_list_url(review), expected_mimetype=screenshot_comment_list_mimetype
        )
        self.assertEqual(rsp["stat"], "ok")
        self.assertTrue("screenshot_comments" in rsp)
        self.assertEqual(len(rsp["screenshot_comments"]), 0)
    def test_put_with_extra_fields(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        with extra fields
        """
        extra_fields = {
            'extra_data.foo': 'abc',
            'extra_data.bar': '',
            'ignored': 'foo',
        }

        comment_text = "This is a test comment."

        review_request = self.create_review_request(submitter=self.user,
                                                    publish=True)
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=self.user)
        comment = self.create_screenshot_comment(
            review,
            screenshot,
            text=comment_text,
            extra_fields={
                'foo': '123',
                'bar': '456',
            })

        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk),
            extra_fields,
            expected_mimetype=screenshot_comment_item_mimetype)
        self.assertEqual(rsp['stat'], 'ok')

        comment = ScreenshotComment.objects.get(
            pk=rsp['screenshot_comment']['id'])

        self.assertTrue('foo' in comment.extra_data)
        self.assertFalse('bar' in comment.extra_data)
        self.assertFalse('ignored' in comment.extra_data)
        self.assertEqual(len(comment.extra_data.keys()), 1)
        self.assertEqual(comment.extra_data['foo'],
                         extra_fields['extra_data.foo'])
    def test_put_issue_status_by_issue_creator(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        permissions for issue creator
        """
        comment, review, review_request = \
            self._create_screenshot_review_with_issue(publish=True)

        # Change the owner of the review request so that it's not owned by
        # self.user
        review_request.submitter = User.objects.get(username='******')
        review_request.save()

        # The review/comment (and therefore issue) is still owned by self.user,
        # so we should be able to change the issue status.
        rsp = self.apiPut(
            get_review_screenshot_comment_item_url(review, comment.pk),
            {'issue_status': 'dropped'},
            expected_mimetype=screenshot_comment_item_mimetype)
        self.assertEqual(rsp['stat'], 'ok')
        self.assertEqual(rsp['screenshot_comment']['issue_status'], 'dropped')
    def test_put_issue_status_by_uninvolved_user(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        permissions for an uninvolved user
        """
        comment, review, review_request = \
            self._create_screenshot_review_with_issue(publish=True)

        # Change the owner of the review request and review so that they're not
        # owned by self.user.
        new_owner = User.objects.get(username='******')
        review_request.submitter = new_owner
        review_request.save()
        review.user = new_owner
        review.save()

        rsp = self.api_put(get_review_screenshot_comment_item_url(
            review, comment.pk), {'issue_status': 'dropped'},
                           expected_status=403)
        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
    def test_put_with_extra_fields(self):
        """Testing the
        PUT review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API
        with extra fields
        """
        extra_fields = {
            'extra_data.foo': 'abc',
            'extra_data.bar': '',
            'ignored': 'foo',
        }

        comment_text = "This is a test comment."

        review_request = self.create_review_request(submitter=self.user,
                                                    publish=True)
        screenshot = self.create_screenshot(review_request)
        review = self.create_review(review_request, user=self.user)
        comment = self.create_screenshot_comment(review,
                                                 screenshot,
                                                 text=comment_text,
                                                 extra_fields={
                                                     'foo': '123',
                                                     'bar': '456',
                                                 })

        rsp = self.apiPut(get_review_screenshot_comment_item_url(
            review, comment.pk),
                          extra_fields,
                          expected_mimetype=screenshot_comment_item_mimetype)
        self.assertEqual(rsp['stat'], 'ok')

        comment = ScreenshotComment.objects.get(
            pk=rsp['screenshot_comment']['id'])

        self.assertTrue('foo' in comment.extra_data)
        self.assertFalse('bar' in comment.extra_data)
        self.assertFalse('ignored' in comment.extra_data)
        self.assertEqual(len(comment.extra_data), 1)
        self.assertEqual(comment.extra_data['foo'],
                         extra_fields['extra_data.foo'])