def test_post_no_history_allowed(self):
        """Testing the POST <URL> API for a review request created without
        history support
        """
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=self.user,
            create_with_history=False)
        ReviewRequestDraft.create(review_request)
        diffset = self.create_diffset(review_request, draft=True)

        diff = SimpleUploadedFile('diff',
                                  self._DEFAULT_DIFF_CONTENTS,
                                  content_type='text/x-patch')

        with override_feature_checks(self.override_features):
            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(self._DEFAULT_POST_DATA, **{
                    'diff': diff,
                }),
                expected_status=400)

        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], INVALID_ATTRIBUTE.code)
        self.assertEqual(
            rsp['reason'],
            'This review request was not created with support for multiple '
            'commits.\n\n'
            'Use the draft_diff resource to upload diffs instead. See the '
            'draft_diff link on the parent resource for the URL.')
    def test_post_too_large(self):
        """Testing the POST <URL> API with a diff that is too large"""
        siteconfig = SiteConfiguration.objects.get_current()
        max_diff_size = siteconfig.get('diffviewer_max_diff_size')
        siteconfig.set('diffviewer_max_diff_size', 1)
        siteconfig.save()

        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=self.user,
            create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        diff = SimpleUploadedFile('diff',
                                  self._DEFAULT_DIFF_CONTENTS,
                                  content_type='text/x-patch')

        try:
            with override_feature_checks(self.override_features):
                rsp = self.api_post(
                    get_draft_diffcommit_list_url(review_request,
                                                  diffset.revision),
                    dict(self._DEFAULT_POST_DATA, **{
                        'diff': diff,
                    }),
                    expected_status=400)
        finally:
            siteconfig.set('diffviewer_max_diff_size', max_diff_size)
            siteconfig.save()

        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], DIFF_TOO_BIG.code)
        self.assertEqual(rsp['max_size'], 1)
    def setup_basic_post_test(self,
                              user,
                              with_local_site=False,
                              local_site_name=None,
                              post_valid_data=False):
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=user,
            with_local_site=with_local_site,
            create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        if post_valid_data:
            diff = SimpleUploadedFile('diff', self._DEFAULT_DIFF_CONTENTS)
            post_data = dict(self._DEFAULT_POST_DATA, **{'diff': diff})
        else:
            post_data = {}

        return (
            get_draft_diffcommit_list_url(review_request,
                                          diffset.revision,
                                          local_site_name=local_site_name),
            draft_diffcommit_item_mimetype,
            post_data,
            [],
        )
    def setup_basic_post_test(self, user, with_local_site=False,
                              local_site_name=None, post_valid_data=False):
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=user,
            with_local_site=with_local_site,
            create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        if post_valid_data:
            diff = SimpleUploadedFile('diff', self._DEFAULT_DIFF_CONTENTS)
            post_data = dict(self._DEFAULT_POST_DATA,
                             **{'diff': diff})
        else:
            post_data = {}

        return (
            get_draft_diffcommit_list_url(review_request,
                                          diffset.revision,
                                          local_site_name=local_site_name),
            draft_diffcommit_item_mimetype,
            post_data,
            [],
        )
    def test_post_no_history_allowed(self):
        """Testing the POST <URL> API for a review request created without
        history support
        """
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(repository=repository,
                                                    submitter=self.user,
                                                    create_with_history=False)
        ReviewRequestDraft.create(review_request)
        diffset = self.create_diffset(review_request, draft=True)

        diff = SimpleUploadedFile('diff',
                                  self._DEFAULT_DIFF_CONTENTS,
                                  content_type='text/x-patch')

        with override_feature_checks(self.override_features):
            rsp = self.api_post(get_draft_diffcommit_list_url(
                review_request, diffset.revision),
                                dict(self._DEFAULT_POST_DATA, **{
                                    'diff': diff,
                                }),
                                expected_status=400)

        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], INVALID_ATTRIBUTE.code)
        self.assertEqual(
            rsp['reason'],
            'This review request was not created with support for multiple '
            'commits.\n\n'
            'Use the draft_diff resource to upload diffs instead. See the '
            'draft_diff link on the parent resource for the URL.')
    def test_post_too_large(self):
        """Testing the POST <URL> API with a diff that is too large"""
        siteconfig = SiteConfiguration.objects.get_current()
        max_diff_size = siteconfig.get('diffviewer_max_diff_size')
        siteconfig.set('diffviewer_max_diff_size', 1)
        siteconfig.save()

        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(repository=repository,
                                                    submitter=self.user,
                                                    create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        diff = SimpleUploadedFile('diff',
                                  self._DEFAULT_DIFF_CONTENTS,
                                  content_type='text/x-patch')

        try:
            with override_feature_checks(self.override_features):
                rsp = self.api_post(get_draft_diffcommit_list_url(
                    review_request, diffset.revision),
                                    dict(self._DEFAULT_POST_DATA, **{
                                        'diff': diff,
                                    }),
                                    expected_status=400)
        finally:
            siteconfig.set('diffviewer_max_diff_size', max_diff_size)
            siteconfig.save()

        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], DIFF_TOO_BIG.code)
        self.assertEqual(rsp['max_size'], 1)
    def test_post_subsequent(self):
        """Testing the POST <URL> API with a subsequent commit"""
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=self.user,
            create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        commit = self.create_diffcommit(
            repository,
            diffset,
            diff_contents=self._DEFAULT_DIFF_CONTENTS)

        validation_info = serialize_validation_info({
            commit.commit_id: {
                'parent_id': commit.parent_id,
                'tree': {
                    'added': [],
                    'modified': [{
                        'filename': 'readme',
                        'revision': '5b50866',
                    }],
                    'removed': [],
                },
            },
        })

        diff = SimpleUploadedFile(
            'diff',
            (b'diff --git a/readme b/readme\n'
             b'index 5b50866..f00f00f 100644\n'
             b'--- a/readme\n'
             b'+++ a/readme\n'
             b'@@ -1 +1,4 @@\n'
             b' Hello there\n'
             b' \n'
             b' Oh hi!\n'
             b'+Goodbye!\n'),
            content_type='text/x-patch')

        with override_feature_checks(self.override_features):
            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(self._DEFAULT_POST_DATA, **{
                    'commit_id': 'r2',
                    'parent_id': 'r1',
                    'diff': diff,
                    'validation_info': validation_info,
                }),
                expected_mimetype=draft_diffcommit_item_mimetype)

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

        item_rsp = rsp['draft_commit']
        self.compare_item(item_rsp, DiffCommit.objects.get(pk=item_rsp['id']))
    def test_post_parent_diff_subsequent(self):
        """Testing the POST <URL> API with a parent diff on a subsequent commit
        """
        parent_diff_contents = (
            b'diff --git a/foo b/foo\n'
            b'new file mode 100644\n'
            b'index 0000000..e69de29\n'
        )

        diff_contents = (
            b'diff --git a/foo b/foo\n'
            b'index e69ded29..03b37a0 100644\n'
            b'--- a/foo\n'
            b'+++ b/foo\n'
            b'@@ -0,0 +1 @@'
            b'+foo bar baz qux\n'
        )

        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=self.user,
            create_with_history=True)

        diffset = self.create_diffset(review_request, draft=True)
        self.create_diffcommit(repository, diffset)

        diff = SimpleUploadedFile('diff', diff_contents,
                                  content_type='text/x-patch')
        parent_diff = SimpleUploadedFile('parent_diff', parent_diff_contents,
                                         content_type='text/x-patch')

        with override_feature_checks(self.override_features):
            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(self._DEFAULT_POST_DATA, **{
                    'commit_id': 'r0',
                    'parent_id': 'r1',
                    'diff': diff,
                    'parent_diff': parent_diff,
                }),
                expected_mimetype=draft_diffcommit_item_mimetype,
                expected_status=201)

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

        item_rsp = rsp['draft_commit']
        commit = DiffCommit.objects.get(pk=item_rsp['id'])
        self.compare_item(item_rsp, commit)

        files = list(commit.files.all())
        self.assertEqual(len(files), 1)

        f = files[0]
        self.assertIsNotNone(f.parent_diff)
    def test_post_subsequent(self):
        """Testing the POST <URL> API with a subsequent commit"""
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(repository=repository,
                                                    submitter=self.user,
                                                    create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        commit = self.create_diffcommit(
            repository, diffset, diff_contents=self._DEFAULT_DIFF_CONTENTS)

        validation_info = \
            resources.validate_diffcommit.serialize_validation_info({
                commit.commit_id: {
                    'parent_id': commit.parent_id,
                    'tree': {
                        'added': [],
                        'modified': [{
                            'filename': 'readme',
                            'revision': '5b50866',
                        }],
                        'removed': [],
                    },
                },
            })

        diff = SimpleUploadedFile('diff', (b'diff --git a/readme b/readme\n'
                                           b'index 5b50866..f00f00f 100644\n'
                                           b'--- a/readme\n'
                                           b'+++ a/readme\n'
                                           b'@@ -1 +1,4 @@\n'
                                           b' Hello there\n'
                                           b' \n'
                                           b' Oh hi!\n'
                                           b'+Goodbye!\n'),
                                  content_type='text/x-patch')

        with override_feature_checks(self.override_features):
            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(
                    self._DEFAULT_POST_DATA, **{
                        'commit_id': 'r2',
                        'parent_id': 'r1',
                        'diff': diff,
                        'validation_info': validation_info,
                    }),
                expected_mimetype=draft_diffcommit_item_mimetype)

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

        item_rsp = rsp['draft_commit']
        self.compare_item(item_rsp, DiffCommit.objects.get(pk=item_rsp['id']))
    def test_post_parent_diff_subsequent(self):
        """Testing the POST <URL> API with a parent diff on a subsequent commit
        """
        parent_diff_contents = (b'diff --git a/foo b/foo\n'
                                b'new file mode 100644\n'
                                b'index 0000000..e69de29\n')

        diff_contents = (b'diff --git a/foo b/foo\n'
                         b'index e69ded29..03b37a0 100644\n'
                         b'--- a/foo\n'
                         b'+++ b/foo\n'
                         b'@@ -0,0 +1 @@'
                         b'+foo bar baz qux\n')

        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(repository=repository,
                                                    submitter=self.user,
                                                    create_with_history=True)

        diffset = self.create_diffset(review_request, draft=True)
        self.create_diffcommit(repository, diffset)

        diff = SimpleUploadedFile('diff',
                                  diff_contents,
                                  content_type='text/x-patch')
        parent_diff = SimpleUploadedFile('parent_diff',
                                         parent_diff_contents,
                                         content_type='text/x-patch')

        with override_feature_checks(self.override_features):
            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(
                    self._DEFAULT_POST_DATA, **{
                        'commit_id': 'r0',
                        'parent_id': 'r1',
                        'diff': diff,
                        'parent_diff': parent_diff,
                    }),
                expected_mimetype=draft_diffcommit_item_mimetype,
                expected_status=201)

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

        item_rsp = rsp['draft_commit']
        commit = DiffCommit.objects.get(pk=item_rsp['id'])
        self.compare_item(item_rsp, commit)

        files = list(commit.files.all())
        self.assertEqual(len(files), 1)

        f = files[0]
        self.assertIsNotNone(f.parent_diff)
Exemple #11
0
    def test_post_finalized(self):
        """Testing the POST <URL> API after the parent DiffSet has been
        finalized
        """
        with override_feature_checks(self.override_features):
            review_request = self.create_review_request(
                create_repository=True,
                submitter=self.user,
                create_with_history=True)

            diffset = self.create_diffset(review_request, draft=True)
            diffset.finalize_commit_series(
                cumulative_diff=self.DEFAULT_GIT_FILEDIFF_DATA_DIFF,
                validation_info=None,
                validate=False,
                save=True)

            diff = SimpleUploadedFile('diff',
                                      self._DEFAULT_DIFF_CONTENTS,
                                      content_type='text/x-patch')

            rsp = self.api_post(get_draft_diffcommit_list_url(
                review_request, diffset.revision),
                                dict(
                                    self._DEFAULT_POST_DATA, **{
                                        'validation_info':
                                        serialize_validation_info({}),
                                        'diff':
                                        diff,
                                    }),
                                expected_status=400)

            self.assertEqual(
                rsp, {
                    'stat': 'fail',
                    'err': {
                        'code': INVALID_ATTRIBUTE.code,
                        'msg': INVALID_ATTRIBUTE.msg,
                    },
                    'reason': 'The diff has already been finalized.',
                })
    def test_post_empty(self):
        """Testing the POST <URL> API with an empty diff"""
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=self.user,
            create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        with override_feature_checks(self.override_features):
            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(self._DEFAULT_POST_DATA, **{
                    'diff': SimpleUploadedFile('diff', b'     ',
                                               content_type='text/x-patch'),
                }),
                expected_status=400)

        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], DIFF_EMPTY.code)
    def test_post_finalized(self):
        """Testing the POST <URL> API after the parent DiffSet has been
        finalized
        """
        with override_feature_checks(self.override_features):
            review_request = self.create_review_request(
                create_repository=True,
                submitter=self.user,
                create_with_history=True)

            diffset = self.create_diffset(review_request, draft=True)
            diffset.finalize_commit_series(
                cumulative_diff=self.DEFAULT_GIT_FILEDIFF_DATA_DIFF,
                validation_info=None,
                validate=False,
                save=True)

            diff = SimpleUploadedFile(
                'diff',
                self._DEFAULT_DIFF_CONTENTS,
                content_type='text/x-patch')

            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(self._DEFAULT_POST_DATA, **{
                    'validation_info': serialize_validation_info({}),
                    'diff': diff,
                }),
                expected_status=400)

            self.assertEqual(rsp, {
                'stat': 'fail',
                'err': {
                    'code': INVALID_ATTRIBUTE.code,
                    'msg': INVALID_ATTRIBUTE.msg,
                },
                'reason': 'The diff has already been finalized.',
            })
    def setup_basic_get_test(self, user, with_local_site, local_site_name,
                             populate_items):
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=user,
            publish=True,
            with_local_site=with_local_site,
            create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)
        items = []

        if populate_items:
            items.append(
                self.create_diffcommit(diffset=diffset, repository=repository))

        return (
            get_draft_diffcommit_list_url(review_request,
                                          diffset.revision,
                                          local_site_name=local_site_name),
            draft_diffcommit_list_mimetype,
            items,
        )
    def test_post_empty(self):
        """Testing the POST <URL> API with an empty diff"""
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(repository=repository,
                                                    submitter=self.user,
                                                    create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        with override_feature_checks(self.override_features):
            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(
                    self._DEFAULT_POST_DATA, **{
                        'diff':
                        SimpleUploadedFile('diff',
                                           b'     ',
                                           content_type='text/x-patch'),
                    }),
                expected_status=400)

        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], DIFF_EMPTY.code)
    def test_post_invalid_date_format(self):
        """Testing the POST <URL> API with an invalid date format"""
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=self.user,
            create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        diff = SimpleUploadedFile('diff',
                                  self._DEFAULT_DIFF_CONTENTS,
                                  content_type='text/x-patch')

        with override_feature_checks(self.override_features):
            rsp = self.api_post(
                get_draft_diffcommit_list_url(review_request,
                                              diffset.revision),
                dict(self._DEFAULT_POST_DATA, **{
                    'commit_id': 'r0',
                    'parent_id': 'r1',
                    'diff': diff,
                    'committer_date': 'Jun 1 1990',
                    'author_date': 'Jun 1 1990',
                }),
                expected_status=400)

        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], INVALID_FORM_DATA.code)

        err_fields = rsp['fields']
        self.assertIn('author_date', err_fields)
        self.assertIn('committer_date', err_fields)

        self.assertEqual(err_fields['author_date'],
                         ['This date must be in ISO 8601 format.'])
        self.assertEqual(err_fields['committer_date'],
                         ['This date must be in ISO 8601 format.'])
    def test_post_invalid_date_format(self):
        """Testing the POST <URL> API with an invalid date format"""
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(repository=repository,
                                                    submitter=self.user,
                                                    create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)

        diff = SimpleUploadedFile('diff',
                                  self._DEFAULT_DIFF_CONTENTS,
                                  content_type='text/x-patch')

        with override_feature_checks(self.override_features):
            rsp = self.api_post(get_draft_diffcommit_list_url(
                review_request, diffset.revision),
                                dict(
                                    self._DEFAULT_POST_DATA, **{
                                        'commit_id': 'r0',
                                        'parent_id': 'r1',
                                        'diff': diff,
                                        'committer_date': 'Jun 1 1990',
                                        'author_date': 'Jun 1 1990',
                                    }),
                                expected_status=400)

        self.assertEqual(rsp['stat'], 'fail')
        self.assertEqual(rsp['err']['code'], INVALID_FORM_DATA.code)

        err_fields = rsp['fields']
        self.assertIn('author_date', err_fields)
        self.assertIn('committer_date', err_fields)

        self.assertEqual(err_fields['author_date'],
                         ['This date must be in ISO 8601 format.'])
        self.assertEqual(err_fields['committer_date'],
                         ['This date must be in ISO 8601 format.'])
    def setup_basic_get_test(self, user, with_local_site, local_site_name,
                             populate_items):
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(
            repository=repository,
            submitter=user,
            publish=True,
            with_local_site=with_local_site,
            create_with_history=True)
        diffset = self.create_diffset(review_request, draft=True)
        items = []

        if populate_items:
            items.append(self.create_diffcommit(diffset=diffset,
                                                repository=repository))

        return (
            get_draft_diffcommit_list_url(
                review_request,
                diffset.revision,
                local_site_name=local_site_name),
            draft_diffcommit_list_mimetype,
            items,
        )
 def setup_http_not_allowed_list_test(self, user):
     review_request = self.create_review_request(create_repository=True,
                                                 public=True)
     diffset = self.create_diffset(review_request=review_request)
     return get_draft_diffcommit_list_url(review_request, diffset.revision)
 def setup_http_not_allowed_list_test(self, user):
     review_request = self.create_review_request(
         create_repository=True,
         public=True)
     diffset = self.create_diffset(review_request=review_request)
     return get_draft_diffcommit_list_url(review_request, diffset.revision)