コード例 #1
0
 def setUp(self):
     homepage = Page.objects.get(url_path='/home/').specific
     self.page = homepage.add_child(instance=SimplePage(
         title="A simple page"))
     self.page_revision = self.page.save_revision()
     self.reviewer = ReviewerFactory.create_external()
     self.token = Token(self.reviewer, self.page_revision)
     self.share = Share.objects.create(
         external_user=self.reviewer.external,
         page=self.page,
         can_comment=True,
         shared_by=User.objects.get(username="******"),
     )
コード例 #2
0
    def test_post_review_token_for_different_task(self):
        # This may happen if someone uses an old token (clicked from email history) and the page happens
        # to be in another review task
        past_workflow_state = WorkflowState.objects.create(
            workflow=self.workflow,
            page=self.page_revision.page,
            status=WorkflowState.STATUS_APPROVED,
        )

        past_task_state = ReviewTaskState.objects.create(
            workflow_state=past_workflow_state,
            task=self.workflow_task,
            page_revision=self.page_revision,
            status=ReviewTaskState.STATUS_APPROVED,
        )

        past_workflow_state.current_task_state = past_task_state
        past_workflow_state.save(update_fields=['current_task_state'])

        post_data = {
            'taskAction': 'approve',
            'comment': "This is the comment",
        }
        response = self.client.post(reverse('wagtail_review:api:respond'),
                                    post_data,
                                    HTTP_X_REVIEW_TOKEN=Token(
                                        self.reviewer, self.page_revision,
                                        past_task_state).encode())

        self.assertEqual(response.status_code, 403)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(
            response.json(),
            {'detail': "The provided token isn't for the current task."})
コード例 #3
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_post_new_comment(self):
        post_data = {
            'quote': "This is a test",
            'text': "blah blah blah",
            'content_path': "title",
            'start_xpath': "/foo",
            'start_offset': 1,
            'end_xpath': "/foo",
            'end_offset': 10,
        }

        response = self.client.post(reverse('wagtail_review:api:comment_list'),
                                    post_data,
                                    HTTP_X_REVIEW_TOKEN=Token(
                                        self.reviewer,
                                        self.page_revision).encode())

        self.assertEqual(response.status_code, 201)
        self.assertEqual(response['Content-Type'], 'application/json')

        comment = Comment.objects.get(text="blah blah blah")

        check_comment_api_representation(self, comment, response.json())

        self.assertEqual(comment.page_revision, self.page_revision)
        self.assertEqual(comment.reviewer, self.reviewer)
コード例 #4
0
    def setUp(self):
        homepage = Page.objects.get(url_path='/home/').specific
        self.page = homepage.add_child(instance=SimplePage(
            title="A simple page"))
        self.page_revision = self.page.save_revision()
        self.reviewer = ReviewerFactory.create_external()
        self.token = Token(self.reviewer, self.page_revision)
        self.share = Share.objects.create(
            external_user=self.reviewer.external,
            page=self.page,
            can_comment=True,
            shared_by=User.objects.get(username="******"),
        )

        # Need to update site record so the hostname matches what Django will sent to the view
        # This prevents a 400 (Bad Request) error when the preview is generated
        Site.objects.update(hostname="testserver")
コード例 #5
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_can_unresolve_comment_from_another_reviewer(self):
        response = self.client.delete(
            reverse('wagtail_review:api:comment_resolved',
                    args=[self.comment_from_another_reviewer.id]),
            HTTP_X_REVIEW_TOKEN=Token(self.reviewer,
                                      self.page_revision).encode())

        self.assertEqual(response.status_code, 200)
コード例 #6
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_delete_comment(self):
        response = self.client.delete(reverse('wagtail_review:api:comment',
                                              args=[self.comment.id]),
                                      HTTP_X_REVIEW_TOKEN=Token(
                                          self.reviewer,
                                          self.page_revision).encode())

        self.assertEqual(response.status_code, 204)
        self.assertFalse(Comment.objects.filter(id=self.comment.id).exists())
コード例 #7
0
class TestReviewView(TestCase):
    fixtures = ['test.json']

    def setUp(self):
        homepage = Page.objects.get(url_path='/home/').specific
        self.page = homepage.add_child(instance=SimplePage(
            title="A simple page"))
        self.page_revision = self.page.save_revision()
        self.reviewer = ReviewerFactory.create_external()
        self.token = Token(self.reviewer, self.page_revision)
        self.share = Share.objects.create(
            external_user=self.reviewer.external,
            page=self.page,
            can_comment=True,
            shared_by=User.objects.get(username="******"),
        )

        # Need to update site record so the hostname matches what Django will sent to the view
        # This prevents a 400 (Bad Request) error when the preview is generated
        Site.objects.update(hostname="testserver")

    def test_get_review(self):
        response = self.client.get(
            reverse('wagtail_review:review', args=[self.token.encode()]))
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'tests/simple_page.html')

        self.share.refresh_from_db()
        self.assertTrue(self.share.first_accessed_at)
        self.assertTrue(self.share.last_accessed_at)

    def test_get_review_without_share(self):
        self.share.delete()
        response = self.client.get(
            reverse('wagtail_review:review', args=[self.token.encode()]))
        self.assertEqual(response.status_code, 403)

    def test_get_review_with_expired_share(self):
        self.share.expires_at = timezone.now()
        self.share.save()

        response = self.client.get(
            reverse('wagtail_review:review', args=[self.token.encode()]))
        self.assertEqual(response.status_code, 403)
コード例 #8
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_get_reply_comment_id_must_be_correct_in_url(self):
        response = self.client.get(
            reverse('wagtail_review:api:commentreply',
                    args=[self.other_comment.id, self.reply.id]),
            HTTP_X_REVIEW_TOKEN=Token(self.reviewer,
                                      self.page_revision).encode())

        self.assertEqual(response.status_code, 404)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(response.json(), {'detail': 'Not found.'})
コード例 #9
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_cant_unresolve_comment_on_another_revision(self):
        response = self.client.delete(
            reverse('wagtail_review:api:comment_resolved',
                    args=[self.comment_on_another_revision.id]),
            HTTP_X_REVIEW_TOKEN=Token(self.reviewer,
                                      self.page_revision).encode())

        self.assertEqual(response.status_code, 404)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(response.json(), {'detail': 'Not found.'})
コード例 #10
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_get_without_comments(self):
        Share.objects.update(can_comment=False)
        response = self.client.get(reverse('wagtail_review:api:base'),
                                   HTTP_X_REVIEW_TOKEN=Token(
                                       self.reviewer,
                                       self.page_revision).encode())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertFalse(response.json()['can_comment'])
        self.assertFalse(response.json()['can_review'])
コード例 #11
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_get_comment(self):
        response = self.client.get(reverse('wagtail_review:api:comment',
                                           args=[self.comment.id]),
                                   HTTP_X_REVIEW_TOKEN=Token(
                                       self.reviewer,
                                       self.page_revision).encode())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')

        check_comment_api_representation(self, self.comment, response.json())
コード例 #12
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_cant_delete_comment_from_another_reviewer(self):
        response = self.client.delete(
            reverse('wagtail_review:api:comment',
                    args=[self.comment_from_another_reviewer.id]),
            HTTP_X_REVIEW_TOKEN=Token(self.reviewer,
                                      self.page_revision).encode())

        self.assertEqual(response.status_code, 403)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(
            response.json(),
            {'detail': 'You do not have permission to perform this action.'})
コード例 #13
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_get_comments(self):
        response = self.client.get(reverse('wagtail_review:api:comment_list'),
                                   HTTP_X_REVIEW_TOKEN=Token(
                                       self.reviewer,
                                       self.page_revision).encode())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(set(comment['id'] for comment in response.json()),
                         {self.comment_a.id, self.comment_b.id})

        check_comment_api_representation(self, self.comment_a,
                                         response.json()[0])
コード例 #14
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_post_long_comment(self):
        post_data = {
            'status': 'approved',
            'comment': "A" * 201,
        }
        response = self.client.post(reverse('wagtail_review:api:respond'),
                                    post_data,
                                    HTTP_X_REVIEW_TOKEN=Token(
                                        self.reviewer, self.page_revision,
                                        self.review_request).encode())

        self.assertEqual(response.status_code, 400)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(response.json(), {'comment': ['TODO']})
コード例 #15
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_get_with_review_request(self):
        review_request = ReviewRequest.objects.create(
            page_revision=self.page_revision,
            submitted_by=User.objects.get(username="******"),
        )

        response = self.client.get(reverse('wagtail_review:api:base'),
                                   HTTP_X_REVIEW_TOKEN=Token(
                                       self.reviewer, self.page_revision,
                                       review_request).encode())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertTrue(response.json()['can_comment'])
        self.assertTrue(response.json()['can_review'])
コード例 #16
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_post_invalid_status(self):
        post_data = {
            'status': 'foo',
            'comment': "This is the comment",
        }
        response = self.client.post(reverse('wagtail_review:api:respond'),
                                    post_data,
                                    HTTP_X_REVIEW_TOKEN=Token(
                                        self.reviewer, self.page_revision,
                                        self.review_request).encode())

        self.assertEqual(response.status_code, 400)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(response.json(),
                         {'status': ['"foo" is not a valid choice.']})
コード例 #17
0
    def test_post_invalid_action(self):
        post_data = {
            'taskAction': 'foo',
            'comment': "This is the comment",
        }
        response = self.client.post(reverse('wagtail_review:api:respond'),
                                    post_data,
                                    HTTP_X_REVIEW_TOKEN=Token(
                                        self.reviewer, self.page_revision,
                                        self.task_state).encode())

        self.assertEqual(response.status_code, 403)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(
            response.json(),
            {'detail': 'You do not have permission to perform this action.'})
コード例 #18
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_get(self):
        response = self.client.get(reverse('wagtail_review:api:base'),
                                   HTTP_X_REVIEW_TOKEN=Token(
                                       self.reviewer,
                                       self.page_revision).encode())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(
            response.json(), {
                'you': {
                    'id': self.reviewer.id,
                    'name': self.reviewer.get_name(),
                },
                'can_comment': True,
                'can_review': False,
            })
コード例 #19
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_update_comment(self):
        data = self.get_update_comment_data()
        previous_updated_at = self.comment.updated_at

        response = self.client.put(reverse('wagtail_review:api:comment',
                                           args=[self.comment.id]),
                                   data,
                                   HTTP_X_REVIEW_TOKEN=Token(
                                       self.reviewer,
                                       self.page_revision).encode())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')

        self.comment.refresh_from_db()
        self.assertEqual(self.comment.text, "This is the new text")
        self.assertNotEqual(self.comment.updated_at, previous_updated_at)
コード例 #20
0
    def test_post_needs_changes_response(self):
        post_data = {
            'taskAction': 'reject',
            'comment': "This is the comment",
        }
        response = self.client.post(reverse('wagtail_review:api:respond'),
                                    post_data,
                                    HTTP_X_REVIEW_TOKEN=Token(
                                        self.reviewer, self.page_revision,
                                        self.task_state).encode())

        self.assertEqual(response.status_code, 200)

        self.task_state.refresh_from_db()
        self.assertEqual(self.task_state.reviewer, self.reviewer)
        self.assertTrue(self.task_state.finished_at)
        self.assertEqual(self.task_state.status, 'rejected')
        self.assertEqual(self.task_state.comment, "This is the comment")
コード例 #21
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_post_new_reply(self):
        post_data = {
            'text': "blah blah blah",
        }

        response = self.client.post(
            reverse('wagtail_review:api:commentreply_list',
                    args=[self.comment.id]),
            post_data,
            HTTP_X_REVIEW_TOKEN=Token(self.reviewer,
                                      self.page_revision).encode())

        self.assertEqual(response.status_code, 201)
        self.assertEqual(response['Content-Type'], 'application/json')

        reply = CommentReply.objects.get(text="blah blah blah")

        check_comment_reply_api_representation(self, reply, response.json())

        self.assertEqual(reply.comment, self.comment)
        self.assertEqual(reply.reviewer, self.reviewer)
コード例 #22
0
ファイル: test_api.py プロジェクト: ninjabit/wagtail-review
    def test_post_needs_changes_response(self):
        post_data = {
            'status': 'needs-changes',
            'comment': "This is the comment",
        }
        response = self.client.post(reverse('wagtail_review:api:respond'),
                                    post_data,
                                    HTTP_X_REVIEW_TOKEN=Token(
                                        self.reviewer, self.page_revision,
                                        self.review_request).encode())

        self.assertEqual(response.status_code, 201)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertEqual(response.json(), {
            'comment': 'This is the comment',
            'status': 'needs-changes'
        })

        review_reponse = ReviewResponse.objects.get()
        self.assertEqual(review_reponse.request, self.review_request)
        self.assertEqual(review_reponse.submitted_by, self.reviewer)
        self.assertEqual(review_reponse.status, 'needs-changes')
        self.assertEqual(review_reponse.comment, "This is the comment")
コード例 #23
0
    def test_get_with_task_state(self):
        workflow_state = WorkflowState.objects.create(
            workflow=self.workflow,
            page=self.page_revision.page,
        )

        task_state = ReviewTaskState.objects.create(
            workflow_state=workflow_state,
            task=self.workflow_task,
            page_revision=self.page_revision,
        )

        workflow_state.current_task_state = task_state
        workflow_state.save(update_fields=['current_task_state'])

        response = self.client.get(reverse('wagtail_review:api:base'),
                                   HTTP_X_REVIEW_TOKEN=Token(
                                       self.reviewer, self.page_revision,
                                       task_state).encode())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')
        self.assertTrue(response.json()['can_comment'])
        self.assertTrue(response.json()['can_review'])