Пример #1
0
    def test_resolution_support_with_integration(self, mock_sync_status_outbound):
        org = self.create_organization()
        integration = Integration.objects.create(provider="example", name="Example")
        integration.add_organization(org, self.user)

        OrganizationIntegration.objects.filter(
            integration_id=integration.id, organization_id=org.id
        ).update(
            config={
                "sync_comments": True,
                "sync_status_outbound": True,
                "sync_status_inbound": True,
                "sync_assignee_outbound": True,
                "sync_assignee_inbound": True,
            }
        )
        project = self.create_project(organization=org, name="foo")
        group = self.create_group(project=project)
        add_group_to_inbox(group, GroupInboxReason.MANUAL)
        assert GroupInbox.objects.filter(group=group).exists()
        external_issue = ExternalIssue.objects.get_or_create(
            organization_id=org.id, integration_id=integration.id, key="APP-%s" % group.id
        )[0]

        GroupLink.objects.get_or_create(
            group_id=group.id,
            project_id=group.project_id,
            linked_type=GroupLink.LinkedType.issue,
            linked_id=external_issue.id,
            relationship=GroupLink.Relationship.references,
        )[0]

        repo = Repository.objects.create(organization_id=org.id, name="test/repo")
        commit = Commit.objects.create(
            organization_id=org.id,
            repository_id=repo.id,
            message="fixes %s" % (group.qualified_short_id),
            key="alksdflskdfjsldkfajsflkslk",
        )

        release = self.create_release(project=project, version="abcdabc")

        with self.tasks():
            with self.feature({"organizations:integrations-issue-sync": True}):
                release.set_commits([{"id": commit.key, "repository": repo.name}])

        mock_sync_status_outbound.assert_called_once_with(external_issue, True, group.project_id)

        assert GroupLink.objects.filter(
            group_id=group.id, linked_type=GroupLink.LinkedType.commit, linked_id=commit.id
        ).exists()

        resolution = GroupResolution.objects.get(group=group)
        assert resolution.status == GroupResolution.Status.resolved
        assert resolution.release == release
        assert resolution.type == GroupResolution.Type.in_release
        assert resolution.actor_id is None

        assert Group.objects.get(id=group.id).status == GroupStatus.RESOLVED
        assert not GroupInbox.objects.filter(group=group).exists()
Пример #2
0
 def test_remove_from_inbox(self):
     add_group_to_inbox(self.group, GroupInboxReason.NEW)
     assert GroupInbox.objects.filter(
         group=self.group, reason=GroupInboxReason.NEW.value).exists()
     remove_group_from_inbox(self.group)
     assert not GroupInbox.objects.filter(
         group=self.group, reason=GroupInboxReason.NEW.value).exists()
Пример #3
0
    def test_matching_author_without_assignment(self):
        group = self.create_group()
        add_group_to_inbox(group, GroupInboxReason.MANUAL)
        user = self.create_user(name="Foo Bar", email="*****@*****.**", is_active=True)
        email = UserEmail.get_primary_email(user=user)
        email.is_verified = True
        email.save()
        repo = Repository.objects.create(name="example", organization_id=self.group.organization.id)
        OrganizationMember.objects.create(organization=group.project.organization, user=user)
        UserOption.objects.set_value(user=user, key="self_assign_issue", value="0")

        commit = Commit.objects.create(
            key=sha1(uuid4().hex.encode("utf-8")).hexdigest(),
            organization_id=group.organization.id,
            repository_id=repo.id,
            message=u"Foo Biz\n\nFixes {}".format(group.qualified_short_id),
            author=CommitAuthor.objects.create(
                organization_id=group.organization.id, name=user.name, email=user.email
            ),
        )

        self.assertResolvedFromCommit(group, commit)

        assert not Activity.objects.filter(
            project=group.project, group=group, type=Activity.ASSIGNED, user=user
        ).exists()

        assert GroupSubscription.objects.filter(group=group, user=user).exists()
Пример #4
0
 def test_add_to_inbox(self):
     add_group_to_inbox(self.group, GroupInboxReason.NEW)
     assert GroupInbox.objects.filter(
         group=self.group, reason=GroupInboxReason.NEW.value).exists()
     add_group_to_inbox(self.group, GroupInboxReason.REGRESSION)
     assert GroupInbox.objects.filter(
         group=self.group, reason=GroupInboxReason.NEW.value).exists()
Пример #5
0
    def test_resolution_support_without_author(self):
        org = self.create_organization()
        project = self.create_project(organization=org, name="foo")
        group = self.create_group(project=project)
        add_group_to_inbox(group, GroupInboxReason.MANUAL)
        assert GroupInbox.objects.filter(group=group).exists()
        repo = Repository.objects.create(organization_id=org.id,
                                         name="test/repo")
        commit = Commit.objects.create(
            organization_id=org.id,
            repository_id=repo.id,
            message="fixes %s" % (group.qualified_short_id),
            key="alksdflskdfjsldkfajsflkslk",
        )

        release = self.create_release(project=project, version="abcdabc")
        release.set_commits([{"id": commit.key, "repository": repo.name}])

        assert GroupLink.objects.filter(
            group_id=group.id,
            linked_type=GroupLink.LinkedType.commit,
            linked_id=commit.id).exists()

        resolution = GroupResolution.objects.get(group=group)
        assert resolution.status == GroupResolution.Status.resolved
        assert resolution.release == release
        assert resolution.type == GroupResolution.Type.in_release
        assert resolution.actor_id is None

        assert Group.objects.get(id=group.id).status == GroupStatus.RESOLVED
        assert not GroupInbox.objects.filter(group=group).exists()
Пример #6
0
    def test_simple(self):
        org = self.create_organization()
        project = self.create_project(organization=org, name="foo")
        group = self.create_group(project=project)
        add_group_to_inbox(group, GroupInboxReason.MANUAL)
        assert GroupInbox.objects.filter(group=group).exists()

        repo = Repository.objects.create(organization_id=org.id, name="test/repo")
        commit = Commit.objects.create(
            organization_id=org.id,
            repository_id=repo.id,
            message="fixes %s" % (group.qualified_short_id),
            key="alksdflskdfjsldkfajsflkslk",
        )
        commit2 = Commit.objects.create(
            organization_id=org.id,
            repository_id=repo.id,
            message="i fixed something",
            key="lskfslknsdkcsnlkdflksfdkls",
        )

        assert GroupLink.objects.filter(
            group_id=group.id, linked_type=GroupLink.LinkedType.commit, linked_id=commit.id
        ).exists()

        release = Release.objects.create(version="abcdabc", organization=org)
        release.add_project(project)
        release.set_commits(
            [
                {"id": commit.key, "repository": repo.name},
                {"id": commit2.key, "repository": repo.name},
                {"id": "a" * 40, "repository": repo.name},
                {"id": "b" * 40, "repository": repo.name, "message": "#skipsentry"},
            ]
        )

        assert ReleaseCommit.objects.filter(commit=commit, release=release).exists()
        assert ReleaseCommit.objects.filter(commit=commit2, release=release).exists()

        assert Group.objects.get(id=group.id).status == GroupStatus.RESOLVED
        # test that backfilling works
        assert Commit.objects.filter(key="a" * 40, repository_id=repo.id).exists()
        assert not Commit.objects.filter(key="b" * 40, repository_id=repo.id).exists()

        release = Release.objects.get(id=release.id)
        assert release.commit_count == 3
        assert release.authors == []
        assert release.last_commit_id == commit.id

        assert ReleaseHeadCommit.objects.filter(
            release_id=release.id, commit_id=commit.id, repository_id=repo.id
        ).exists()

        assert not GroupInbox.objects.filter(group=group).exists()
Пример #7
0
 def test_remove_from_inbox(self, inbox_out):
     add_group_to_inbox(self.group, GroupInboxReason.NEW)
     assert GroupInbox.objects.filter(
         group=self.group, reason=GroupInboxReason.NEW.value).exists()
     remove_group_from_inbox(self.group,
                             user=self.user,
                             action=GroupInboxRemoveAction.MARK_REVIEWED)
     assert not GroupInbox.objects.filter(
         group=self.group, reason=GroupInboxReason.NEW.value).exists()
     activities = Activity.objects.all()
     assert len(activities) == 1
     assert activities[0].type == Activity.MARK_REVIEWED
     assert inbox_out.called
Пример #8
0
    def test_simple_no_author(self):
        group = self.create_group()
        add_group_to_inbox(group, GroupInboxReason.MANUAL)

        repo = Repository.objects.create(name="example", organization_id=self.group.organization.id)

        commit = Commit.objects.create(
            key=sha1(uuid4().hex.encode("utf-8")).hexdigest(),
            repository_id=repo.id,
            organization_id=group.organization.id,
            message=u"Foo Biz\n\nFixes {}".format(group.qualified_short_id),
        )

        self.assertResolvedFromCommit(group, commit)
Пример #9
0
    def test_ignoring_group(self, send_robust):
        group = self.create_group()
        add_group_to_inbox(group, GroupInboxReason.NEW)

        request = self.make_request(user=self.user, method="GET")
        request.user = self.user
        request.data = {"status": "ignored"}
        request.GET = QueryDict(query_string="id={}".format(group.id))

        search_fn = Mock()
        update_groups(request, [self.project], self.organization.id, search_fn)

        group.refresh_from_db()

        assert group.status == GroupStatus.IGNORED
        assert send_robust.called
Пример #10
0
    def test_mark_reviewed_group(self, send_robust):
        group = self.create_group()
        add_group_to_inbox(group, GroupInboxReason.NEW)

        request = self.make_request(user=self.user, method="GET")
        request.user = self.user
        request.data = {"inbox": False}
        request.GET = QueryDict(query_string=f"id={group.id}")

        search_fn = Mock()
        update_groups(request, request.GET.getlist("id"), [self.project],
                      self.organization.id, search_fn)

        group.refresh_from_db()

        assert not GroupInbox.objects.filter(group=group).exists()
        assert send_robust.called
Пример #11
0
    def test_resolving_unresolved_group(self, send_robust):
        unresolved_group = self.create_group(status=GroupStatus.UNRESOLVED)
        add_group_to_inbox(unresolved_group, GroupInboxReason.NEW)
        assert unresolved_group.status == GroupStatus.UNRESOLVED

        request = self.make_request(user=self.user, method="GET")
        request.user = self.user
        request.data = {"status": "resolved"}
        request.GET = QueryDict(query_string=f"id={unresolved_group.id}")

        search_fn = Mock()
        update_groups(request, [self.project], self.organization.id, search_fn)

        unresolved_group.refresh_from_db()

        assert unresolved_group.status == GroupStatus.RESOLVED
        assert not GroupInbox.objects.filter(group=unresolved_group).exists()
        assert send_robust.called
Пример #12
0
    def test_resolution_support_full_featured(self):
        org = self.create_organization(owner=self.user)
        project = self.create_project(organization=org, name="foo")
        group = self.create_group(project=project)
        add_group_to_inbox(group, GroupInboxReason.MANUAL)
        assert GroupInbox.objects.filter(group=group).exists()
        repo = Repository.objects.create(organization_id=org.id,
                                         name="test/repo")
        author = CommitAuthor.objects.create(organization_id=org.id,
                                             name="Foo Bar",
                                             email=self.user.email)
        commit = Commit.objects.create(
            organization_id=org.id,
            repository_id=repo.id,
            message="fixes %s" % (group.qualified_short_id),
            key="alksdflskdfjsldkfajsflkslk",
            author=author,
        )

        old_release = self.create_release(project=project, version="pre-1.0")

        resolution = GroupResolution.objects.create(
            group=group,
            release=old_release,
            type=GroupResolution.Type.in_next_release,
            status=GroupResolution.Status.pending,
        )

        release = self.create_release(project=project, version="abcdabc")
        release.set_commits([{"id": commit.key, "repository": repo.name}])

        assert GroupLink.objects.filter(
            group_id=group.id,
            linked_type=GroupLink.LinkedType.commit,
            linked_id=commit.id).exists()

        resolution = GroupResolution.objects.get(group=group)
        assert resolution.status == GroupResolution.Status.resolved
        assert resolution.release == release
        assert resolution.type == GroupResolution.Type.in_release
        assert resolution.actor_id == self.user.id

        assert Group.objects.get(id=group.id).status == GroupStatus.RESOLVED
        assert not GroupInbox.objects.filter(group=group).exists()
Пример #13
0
    def test_resolving_unresolved_group(self, send_robust):
        unresolved_group = self.create_group(status=GroupStatus.UNRESOLVED)
        add_group_to_inbox(unresolved_group, GroupInboxReason.NEW)
        assert unresolved_group.status == GroupStatus.UNRESOLVED

        request = self.make_request(user=self.user, method="GET")
        request.user = self.user
        request.data = {"status": "resolved"}
        request.GET = QueryDict(query_string="id={}".format(unresolved_group.id))

        search_fn = Mock()
        update_groups(request, [self.project], self.organization.id, search_fn)

        unresolved_group.refresh_from_db()

        assert unresolved_group.status == GroupStatus.RESOLVED
        # TODO: Chris F.: This is temporarily removed while we perform some migrations.
        # assert not GroupInbox.objects.filter(group=unresolved_group).exists()
        assert send_robust.called
Пример #14
0
    def test_updating_commit_with_existing_grouplink(self):
        group = self.create_group()
        add_group_to_inbox(group, GroupInboxReason.MANUAL)

        repo = Repository.objects.create(
            name="example", organization_id=self.group.organization.id)

        commit = Commit.objects.create(
            key=sha1(uuid4().hex.encode("utf-8")).hexdigest(),
            repository_id=repo.id,
            organization_id=group.organization.id,
            message=f"Foo Biz\n\nFixes {group.qualified_short_id}",
        )

        self.assertResolvedFromCommit(group, commit)

        commit.message = f"Foo Bar Biz\n\nFixes {group.qualified_short_id}"
        commit.save()

        self.assertResolvedFromCommit(group, commit)
Пример #15
0
    def test_removes_group_link_when_message_changes(self):
        group = self.create_group()
        add_group_to_inbox(group, GroupInboxReason.MANUAL)

        repo = Repository.objects.create(name="example", organization_id=self.group.organization.id)

        commit = Commit.objects.create(
            key=sha1(uuid4().hex.encode("utf-8")).hexdigest(),
            repository_id=repo.id,
            organization_id=group.organization.id,
            message="Foo Biz\n\nFixes {}".format(group.qualified_short_id),
        )

        self.assertResolvedFromCommit(group, commit)

        commit.message = "no groups here"
        commit.save()

        add_group_to_inbox(group, GroupInboxReason.MANUAL)
        self.assertNotResolvedFromCommit(group, commit)
Пример #16
0
 def test_invalid_reason_details(self):
     reason_details = {"meow": 123}
     add_group_to_inbox(self.group, GroupInboxReason.NEW, reason_details)
     assert GroupInbox.objects.get(group=self.group.id).reason_details is None
Пример #17
0
    def test_backfilling_commits(self):
        org = self.create_organization()
        project = self.create_project(organization=org, name="foo")
        group = self.create_group(project=project)
        add_group_to_inbox(group, GroupInboxReason.MANUAL)
        assert GroupInbox.objects.filter(group=group).exists()
        repo = Repository.objects.create(organization_id=org.id,
                                         name="test/repo")

        commit = Commit.objects.create(repository_id=repo.id,
                                       organization_id=org.id,
                                       key="b" * 40)

        release = Release.objects.create(version="abcdabc", organization=org)
        release.add_project(project)
        release.set_commits([
            {
                "id": "a" * 40,
                "repository": repo.name,
                "author_email":
                "*****@*****.**",  # throw in an upper case letter
                "author_name": "foo bar baz",
                "message": "i fixed a bug",
            },
            {
                "id": "b" * 40,
                "repository": repo.name,
                "author_email": "*****@*****.**",
                "author_name": "foo bar baz",
                "message": "i fixed another bug",
            },
            {
                "id": "c" * 40,
                "repository": repo.name,
                "author_email": "*****@*****.**",
                "author_name": "foo bar baz",
                "message": "fixes %s" % (group.qualified_short_id),
            },
        ])

        author = CommitAuthor.objects.get(name="foo bar baz",
                                          email="*****@*****.**",
                                          organization_id=org.id)

        commit_a = Commit.objects.get(repository_id=repo.id,
                                      organization_id=org.id,
                                      key="a" * 40)
        assert commit_a
        assert commit_a.message == "i fixed a bug"
        assert commit_a.author_id == author.id

        commit_c = Commit.objects.get(repository_id=repo.id,
                                      organization_id=org.id,
                                      key="c" * 40)
        assert commit_c
        assert "fixes" in commit_c.message
        assert commit_c.author_id == author.id

        # test that backfilling fills in missing message and author
        commit = Commit.objects.get(id=commit.id)
        assert commit.message == "i fixed another bug"
        assert commit.author_id == author.id

        assert ReleaseCommit.objects.filter(commit__key="a" * 40,
                                            commit__repository_id=repo.id,
                                            release=release).exists()
        assert ReleaseCommit.objects.filter(commit__key="b" * 40,
                                            commit__repository_id=repo.id,
                                            release=release).exists()
        assert ReleaseCommit.objects.filter(commit__key="c" * 40,
                                            commit__repository_id=repo.id,
                                            release=release).exists()

        assert GroupLink.objects.filter(
            group_id=group.id,
            linked_type=GroupLink.LinkedType.commit,
            linked_id=commit_c.id).exists()

        assert GroupResolution.objects.filter(group=group,
                                              release=release).exists()
        assert (GroupResolution.objects.get(
            group=group,
            release=release).status == GroupResolution.Status.resolved)
        assert Group.objects.get(id=group.id).status == GroupStatus.RESOLVED

        latest_commit = Commit.objects.get(repository_id=repo.id, key="a" * 40)

        release = Release.objects.get(id=release.id)
        assert release.commit_count == 3
        assert release.authors == [six.text_type(author.id)]
        assert release.last_commit_id == latest_commit.id
        assert not GroupInbox.objects.filter(group=group).exists()