Example #1
0
    def test_reopen_a_closed_bug(self):
        bug = BugFactory(status=False)

        edit_bug_data = {"bug": bug.pk, "text": "Reopen the bug.", "action": "reopen"}

        redirect_url = reverse("bugs-get", args=[bug.pk])
        response = self.client.post(self.comment_bug_url, edit_bug_data, follow=True)

        self.assertContains(response, markdown2html(_("*bug reopened*")))
        self.assertContains(response, "Reopen the bug.")
        self.assertRedirects(response, redirect_url)
        bug.refresh_from_db()
        self.assertTrue(bug.status)
Example #2
0
    def setUpTestData(cls):
        super().setUpTestData()
        user_should_have_perm(cls.tester, "django_comments.add_comment")
        user_should_have_perm(cls.tester, "bugs.view_bug")

        cls.bug = BugFactory()
        cls.url = reverse("bugs-comment")
Example #3
0
    def test_notify_assignee_on_bug_creation(self, send_mail):  # pylint: disable=no-self-use
        assignee = UserFactory()
        bug = BugFactory(assignee=assignee)

        expected_subject = _("Bug #%(pk)d - %(summary)s") % {
            "pk": bug.pk,
            "summary": bug.summary,
        }
        expected_body = render_to_string(
            "email/post_bug_save/email.txt",
            {
                "bug": bug,
                "comment": get_comments(bug).last()
            },
        )
        expected_recipients = [assignee.email, bug.reporter.email]
        expected_recipients.sort()

        send_mail.assert_called_once_with(
            settings.EMAIL_SUBJECT_PREFIX + expected_subject,
            expected_body,
            settings.DEFAULT_FROM_EMAIL,
            expected_recipients,
            fail_silently=False,
        )
Example #4
0
    def test_reopen_a_closed_bug(self):
        bug = BugFactory(status=False)

        edit_bug_data = {
            'bug': bug.pk,
            'text': 'Reopen the bug.',
            'action': 'reopen'
        }

        redirect_url = reverse('bugs-get', args=[bug.pk])
        response = self.client.post(self.comment_bug_url, edit_bug_data, follow=True)

        self.assertContains(response, markdown2html(_('*bug reopened*')))
        self.assertContains(response, 'Reopen the bug.')
        self.assertRedirects(response, redirect_url)
        bug.refresh_from_db()
        self.assertTrue(bug.status)
Example #5
0
    def setUpTestData(cls):
        cls.bug = BugFactory()

        cls.url = reverse("bugs-comment")
        cls.post_data = {
            "bug": cls.bug.pk,
            "text": "A comment text",
        }

        super().setUpTestData()
        tests.user_should_have_perm(cls.tester, "bugs.view_bug")
Example #6
0
    def setUpTestData(cls):
        cls.bug = BugFactory()

        cls.url = reverse('bugs-comment')
        cls.post_data = {
            'bug': cls.bug.pk,
            'text': 'A comment text',
        }

        super().setUpTestData()
        tests.user_should_have_perm(cls.tester, 'bugs.view_bug')
Example #7
0
    def _fixture_setup(self):
        super()._fixture_setup()

        self.existing_bug = BugFactory()

        self.execution_1 = TestExecutionFactory()
        self.execution_1.case.text = "Given-When-Then"
        self.execution_1.case.save()  # will generate history object

        self.component = ComponentFactory(
            name='KiwiTCMS integration',
            product=self.execution_1.run.plan.product)
        self.execution_1.case.add_component(self.component)

        bug_system = BugSystem.objects.create(  # nosec:B106:hardcoded_password_funcarg
            name='KiwiTCMS internal bug tracker',
            tracker_type='tcms.issuetracker.types.KiwiTCMS',
            base_url="https://%s" %
            Site.objects.get(id=settings.SITE_ID).domain,
            # note: ^^^ this is https just because .get_full_url() default to that !
        )
        self.integration = KiwiTCMS(bug_system, None)
Example #8
0
    def test_email_sent_when_bug_reopened(self, send_mail):
        bug = BugFactory(assignee=self.assignee, reporter=self.tester)
        bug.status = False
        bug.save()
        self.client.post(self.url, {
            "bug": bug.pk,
            "text": "",
            "action": "reopen"
        },
                         follow=True)

        expected_body = render_to_string(
            "email/post_bug_save/email.txt",
            {
                "bug": bug,
                "comment": get_comments(bug).last()
            },
        )
        expected_recipients = [self.assignee.email, self.tester.email]
        expected_recipients.sort()

        expected_subject = _("Bug #%(pk)d - %(summary)s") % {
            "pk": bug.pk,
            "summary": bug.summary,
        }

        self.assertTrue(send_mail.called)
        self.assertEqual(
            settings.EMAIL_SUBJECT_PREFIX + expected_subject,
            send_mail.call_args.args[0],
        )
        self.assertEqual(expected_body, send_mail.call_args.args[1])
        self.assertEqual(settings.DEFAULT_FROM_EMAIL,
                         send_mail.call_args.args[2])
        self.assertTrue(
            len(send_mail.call_args.args[3]) == len(expected_recipients))
        self.assertIn(expected_recipients[0], send_mail.call_args.args[3])
        self.assertIn(expected_recipients[1], send_mail.call_args.args[3])
Example #9
0
    def setUpTestData(cls):
        cls.bug = BugFactory()

        cls.url = reverse("bugs-edit", args=(cls.bug.pk,))
        cls.post_data = {
            "summary": "An edited summary",
            "reporter": cls.bug.reporter.pk,
            "assignee": cls.bug.assignee.pk,
            "product": cls.bug.product.pk,
            "version": cls.bug.version.pk,
            "build": cls.bug.build.pk,
        }

        super().setUpTestData()
        tests.user_should_have_perm(cls.tester, "bugs.view_bug")
Example #10
0
    def setUpTestData(cls):
        cls.bug = BugFactory()

        cls.url = reverse('bugs-edit', args=(cls.bug.pk, ))
        cls.post_data = {
            'summary': 'An edited summary',
            'reporter': cls.bug.reporter.pk,
            'assignee': cls.bug.assignee.pk,
            'product': cls.bug.product.pk,
            'version': cls.bug.version.pk,
            'build': cls.bug.build.pk,
        }

        super().setUpTestData()
        tests.user_should_have_perm(cls.tester, 'bugs.view_bug')
Example #11
0
    def test_notify_assignee_on_bug_creation(self, send_mail):
        assignee = UserFactory()
        bug = BugFactory(assignee=assignee)

        expected_subject = _('NEW: Bug #%(pk)d - %(summary)s') % {
            'pk': bug.pk,
            'summary': bug.summary
        }
        expected_body = render_to_string('email/post_bug_save/email.txt',
                                         {'bug': bug})
        expected_recipients = [assignee.email]

        send_mail.assert_called_once_with(settings.EMAIL_SUBJECT_PREFIX +
                                          expected_subject,
                                          expected_body,
                                          settings.DEFAULT_FROM_EMAIL,
                                          expected_recipients,
                                          fail_silently=False)
        self.assertTrue(send_mail.called)
Example #12
0
    def test_email_sent_to_all_commenters(self, send_mail):
        bug = BugFactory(assignee=self.assignee, reporter=self.tester)
        commenter = UserFactory()
        tracker = UserFactory()
        add_comment([bug], _("*bug created*"), tracker)
        add_comment([bug], _("*bug created*"), commenter)

        expected_body = render_to_string(
            "email/post_bug_save/email.txt",
            {
                "bug": bug,
                "comment": get_comments(bug).last()
            },
        )
        expected_recipients = [
            self.assignee.email,
            self.tester.email,
            commenter.email,
            tracker.email,
        ]
        expected_recipients.sort()

        expected_subject = _("Bug #%(pk)d - %(summary)s") % {
            "pk": bug.pk,
            "summary": bug.summary,
        }

        self.assertTrue(send_mail.called)
        self.assertEqual(
            settings.EMAIL_SUBJECT_PREFIX + expected_subject,
            send_mail.call_args.args[0],
        )
        self.assertEqual(expected_body, send_mail.call_args.args[1])
        self.assertEqual(settings.DEFAULT_FROM_EMAIL,
                         send_mail.call_args.args[2])
        self.assertTrue(
            len(send_mail.call_args.args[3]) == len(expected_recipients))
        self.assertIn(expected_recipients[0], send_mail.call_args.args[3])
        self.assertIn(expected_recipients[1], send_mail.call_args.args[3])
Example #13
0
    def _fixture_setup(self):
        super()._fixture_setup()

        self.bug = BugFactory()
        self.another_bug = BugFactory()
        self.yet_another_bug = BugFactory()
Example #14
0
class TestKiwiTCMSIntegration(APITestCase):
    def _fixture_setup(self):
        super()._fixture_setup()

        self.existing_bug = BugFactory()

        self.execution_1 = TestExecutionFactory()
        self.execution_1.case.text = "Given-When-Then"
        self.execution_1.case.save()  # will generate history object

        self.component = ComponentFactory(
            name='KiwiTCMS integration',
            product=self.execution_1.run.plan.product)
        self.execution_1.case.add_component(self.component)

        bug_system = BugSystem.objects.create(  # nosec:B106:hardcoded_password_funcarg
            name='KiwiTCMS internal bug tracker',
            tracker_type='tcms.issuetracker.types.KiwiTCMS',
            base_url="https://%s" %
            Site.objects.get(id=settings.SITE_ID).domain,
            # note: ^^^ this is https just because .get_full_url() default to that !
        )
        self.integration = KiwiTCMS(bug_system, None)

    def test_bug_id_from_url(self):
        result = self.integration.bug_id_from_url(
            self.existing_bug.get_full_url())
        self.assertEqual(self.existing_bug.pk, result)

    def test_details_for_url(self):
        result = self.integration.details(self.existing_bug.get_full_url())

        self.assertEqual(self.existing_bug.summary, result['title'])

        expected_description = render_to_string('include/bug_details.html',
                                                {'object': self.existing_bug})
        self.assertEqual(expected_description, result['description'])

    def test_auto_update_bugtracker(self):
        # make sure bug is not associated with execution
        self.assertFalse(
            self.existing_bug.executions.filter(
                pk=self.execution_1.pk).exists())

        # simulate user adding a new bug URL to a TE and clicking
        # 'Automatically update bug tracker'
        result = self.rpc_client.TestExecution.add_link(
            {
                'execution_id': self.execution_1.pk,
                'is_defect': True,
                'url': self.existing_bug.get_full_url(),
            }, True)

        # making sure RPC above returned the same URL
        self.assertEqual(self.existing_bug.get_full_url(), result['url'])

        # bug is now associated with execution
        self.assertTrue(
            self.existing_bug.executions.filter(
                pk=self.execution_1.pk).exists())

    def test_report_issue_from_test_execution_1click_works(self):
        # simulate user clicking the 'Report bug' button in TE widget, TR page
        result = self.rpc_client.Bug.report(self.execution_1.pk,
                                            self.integration.bug_system.pk)
        self.assertEqual(result['rc'], 0)
        self.assertIn(self.integration.bug_system.base_url, result['response'])
        self.assertIn('/bugs/', result['response'])

        new_bug_id = self.integration.bug_id_from_url(result['response'])
        bug = Bug.objects.get(pk=new_bug_id)

        self.assertEqual("Failed test: %s" % self.execution_1.case.summary,
                         bug.summary)
        first_comment = get_comments(bug).first()
        for expected_string in [
                "Filed from execution %s" % self.execution_1.get_full_url(),
                self.execution_1.run.plan.product.name, self.component.name,
                "Steps to reproduce", self.execution_1.case.text
        ]:
            self.assertIn(expected_string, first_comment.comment)

        # verify that LR has been added to TE
        self.assertTrue(
            LinkReference.objects.filter(
                execution=self.execution_1,
                url=result['response'],
                is_defect=True,
            ).exists())
Example #15
0
    def test_notification_even_there_is_no_assignee(self, send_mail):
        BugFactory(assignee=None)

        self.assertTrue(send_mail.called)
Example #16
0
class TestEditBug(LoggedInTestCase):
    @classmethod
    def setUpTestData(cls):
        super().setUpTestData()
        user_should_have_perm(cls.tester, "bugs.change_bug")
        user_should_have_perm(cls.tester, "bugs.view_bug")

    def setUp(self):
        super().setUp()
        self.bug = BugFactory()
        self.created_at = self.bug.created_at
        self.url = reverse("bugs-edit", args=(self.bug.pk, ))

    def test_edit_bug(self):
        summary_edit = "An edited summary"
        version_edit = VersionFactory()
        build_edit = BuildFactory()

        edit_data = {
            "summary": summary_edit,
            "version": version_edit.pk,
            "build": build_edit.pk,
            "reporter": self.bug.reporter.pk,
            "assignee": self.bug.assignee.pk,
            "product": self.bug.product.pk,
        }

        response = self.client.post(self.url, edit_data, follow=True)

        self.assertRedirects(
            response,
            reverse("bugs-get", args=(self.bug.pk, )),
            status_code=302,
            target_status_code=200,
        )

        self.bug.refresh_from_db()
        self.assertEqual(self.bug.summary, summary_edit)
        self.assertEqual(self.bug.version, version_edit)
        self.assertEqual(self.bug.build, build_edit)
        self.assertEqual(self.bug.created_at, self.created_at)

    def test_record_changes(self):
        old_summary = self.bug.summary
        new_summary = "An edited summary"
        old_comment_count = get_comments(self.bug).count()

        edit_data = {
            "summary": new_summary,
            "version": self.bug.version.pk,
            "build": self.bug.build.pk,
            "reporter": self.bug.reporter.pk,
            "assignee": self.bug.assignee.pk,
            "product": self.bug.product.pk,
        }

        self.client.post(self.url, edit_data, follow=True)
        self.bug.refresh_from_db()
        comments = get_comments(self.bug)

        self.assertEqual(comments.count(), old_comment_count + 1)
        self.assertEqual(comments.last().comment,
                         "Summary: %s -> %s\n" % (old_summary, new_summary))
Example #17
0
 def setUp(self):
     super().setUp()
     self.bug = BugFactory()
     self.created_at = self.bug.created_at
     self.url = reverse("bugs-edit", args=(self.bug.pk, ))
Example #18
0
    def _fixture_setup(self):
        super()._fixture_setup()

        self.bug = BugFactory(status=False)
        self.another_bug = BugFactory(status=True)
        self.yet_another_bug = BugFactory(status=True)
Example #19
0
class TestKiwiTCMSIntegration(APITestCase):
    def _fixture_setup(self):
        super()._fixture_setup()

        self.existing_bug = BugFactory()

        self.execution_1 = TestExecutionFactory()
        self.execution_1.case.text = "Given-When-Then"
        self.execution_1.case.save()  # will generate history object

        self.component = ComponentFactory(
            name="KiwiTCMS integration", product=self.execution_1.run.plan.product
        )
        self.execution_1.case.add_component(self.component)

        site = Site.objects.get(id=settings.SITE_ID)
        self.base_url = f"https://{site.domain}"
        # note: ^^^ this is https just because .get_full_url() default to that !
        bug_system = BugSystem.objects.create(  # nosec:B106:hardcoded_password_funcarg
            name="KiwiTCMS internal bug tracker",
            tracker_type="tcms.issuetracker.types.KiwiTCMS",
            base_url=self.base_url,
        )
        self.integration = KiwiTCMS(bug_system, None)

    def test_bug_id_from_url(self):
        result = self.integration.bug_id_from_url(self.existing_bug.get_full_url())
        self.assertEqual(self.existing_bug.pk, result)

    def test_details_for_url(self):
        result = self.integration.details(self.existing_bug.get_full_url())

        self.assertEqual(self.existing_bug.summary, result["title"])

        expected_description = render_to_string(
            "include/bug_details.html", {"object": self.existing_bug}
        )
        self.assertEqual(expected_description, result["description"])

    def test_auto_update_bugtracker(self):
        # make sure bug is not associated with execution
        self.assertFalse(
            self.existing_bug.executions.filter(pk=self.execution_1.pk).exists()
        )

        # simulate user adding a new bug URL to a TE and clicking
        # 'Automatically update bug tracker'
        result = self.rpc_client.TestExecution.add_link(
            {
                "execution_id": self.execution_1.pk,
                "is_defect": True,
                "url": self.existing_bug.get_full_url(),
            },
            True,
        )

        # making sure RPC above returned the same URL
        self.assertEqual(self.existing_bug.get_full_url(), result["url"])

        # bug is now associated with execution
        self.assertTrue(
            self.existing_bug.executions.filter(pk=self.execution_1.pk).exists()
        )

    def test_report_issue_from_test_execution_1click_works(self):
        # simulate user clicking the 'Report bug' button in TE widget, TR page
        result = self.rpc_client.Bug.report(
            self.execution_1.pk, self.integration.bug_system.pk
        )
        self.assertEqual(result["rc"], 0)
        self.assertIn(self.integration.bug_system.base_url, result["response"])
        self.assertIn("/bugs/", result["response"])

        new_bug_id = self.integration.bug_id_from_url(result["response"])
        bug = Bug.objects.get(pk=new_bug_id)

        self.assertEqual(f"Failed test: {self.execution_1.case.summary}", bug.summary)
        first_comment = get_comments(bug).first()
        for expected_string in [
            f"Filed from execution {self.execution_1.get_full_url()}",
            self.execution_1.run.plan.product.name,
            self.component.name,
            "Steps to reproduce",
            self.execution_1.case.text,
        ]:
            self.assertIn(expected_string, first_comment.comment)

        # verify that LR has been added to TE
        self.assertTrue(
            LinkReference.objects.filter(
                execution=self.execution_1,
                url=result["response"],
                is_defect=True,
            ).exists()
        )

    def test_empty_details_when_bug_dont_exist(self):
        non_existing_bug_id = -1
        self.assertFalse(Bug.objects.filter(pk=non_existing_bug_id).exists())

        result = self.integration.details(f"{self.base_url}/{non_existing_bug_id}")
        self.assertEqual(result, {})
Example #20
0
    def _fixture_setup(self):
        super()._fixture_setup()

        self.bug = BugFactory()
        self.tag = TagFactory()
        self.bug.tags.add(self.tag)
Example #21
0
    def test_no_notification_if_assignee_not_set(self, send_mail):
        BugFactory(assignee=None)

        self.assertFalse(send_mail.called)
Example #22
0
 def setUpTestData(cls):
     super().setUpTestData()
     initiate_user_with_default_setups(cls.tester)
     cls.test_bug = BugFactory()