Ejemplo n.º 1
0
class JiraApproveServiceTest(MockJiraTestMixin, TestCase):
    def setUp(self):
        self.test_service = ServiceFactory(location='POINT(5 23)')
        self.jira_record = self.test_service.jira_records.get(
            update_type=JiraUpdateRecord.NEW_SERVICE)
        self.staff_user = EmailUserFactory(is_staff=True)

    def test_approving_service_creates_record(self, mock_JIRA):
        self.test_service.staff_approve(self.staff_user)
        self.assertTrue(self.test_service.jira_records.filter(
            update_type=JiraUpdateRecord.APPROVE_SERVICE).exists())

    def test_rejecting_service_creates_record(self, mock_JIRA):
        self.test_service.staff_reject(self.staff_user)
        self.assertTrue(self.test_service.jira_records.filter(
            update_type=JiraUpdateRecord.REJECT_SERVICE).exists())

    def test_approval_comments_on_issue(self, mock_JIRA):
        self.test_service.staff_approve(self.staff_user)
        issue_key = self.setup_issue_key(mock_JIRA)
        self.jira_record.do_jira_work()
        record2 = self.test_service.jira_records.get(
            update_type=JiraUpdateRecord.APPROVE_SERVICE)
        record2.do_jira_work()
        self.assertEqual(self.jira_record.jira_issue_key, record2.jira_issue_key)
        call_args, call_kwargs = mock_JIRA.return_value.add_comment.call_args
        self.assertEqual(
            (issue_key, "The new service was approved by %s." % self.staff_user.email),
            call_args)
        self.assertEqual({}, call_kwargs)

    def test_rejecting_comments_on_issue(self, mock_JIRA):
        self.test_service.staff_reject(self.staff_user)
        issue_key = self.setup_issue_key(mock_JIRA)
        self.jira_record.do_jira_work()
        record2 = self.test_service.jira_records.get(
            update_type=JiraUpdateRecord.REJECT_SERVICE)
        record2.do_jira_work()
        self.assertEqual(self.jira_record.jira_issue_key, record2.jira_issue_key)
        call_args, call_kwargs = mock_JIRA.return_value.add_comment.call_args
        self.assertEqual(
            (issue_key, "The new service was rejected by %s." % self.staff_user.email),
            call_args)
        self.assertEqual({}, call_kwargs)
Ejemplo n.º 2
0
class JiraNewServiceTest(MockJiraTestMixin, TestCase):
    def setUp(self):
        self.test_service = ServiceFactory(location='POINT(5 23)')
        self.jira_record = self.test_service.jira_records.get(
            update_type=JiraUpdateRecord.NEW_SERVICE)
        self.staff_user = EmailUserFactory(is_staff=True)

    def test_create_issue_sets_keyval(self, mock_JIRA):
        self.assertEqual('', self.jira_record.jira_issue_key)
        issue_key = self.setup_issue_key(mock_JIRA)
        self.jira_record.do_jira_work()
        self.assertEqual(issue_key, self.jira_record.jira_issue_key)

    def test_create_issue_kwargs(self, mock_JIRA):
        self.test_service.sunday_open = datetime.time(11, 10)
        self.test_service.sunday_close = datetime.time(12, 10)
        self.test_service.saturday_open = datetime.time(17, 18)
        self.test_service.saturday_close = datetime.time(19, 18)
        self.test_service.save()
        self.test_service.provider.focal_point_phone_number = '12-345678'
        self.test_service.provider.number_of_monthly_beneficiaries = '31415'
        self.test_service.provider.save()
        SelectionCriterionFactory(
            service=self.test_service,
            text_en="Must be 18",
            text_ar="Must have passport",
            text_fr="Must have transportation"
        )
        SelectionCriterionFactory(
            service=self.test_service,
            text_en="Must be 21",
            text_ar="Must have shoes",
            text_fr="Must be citizen"
        )
        self.setup_issue_key(mock_JIRA)
        self.jira_record = JiraUpdateRecord.objects.get(pk=self.jira_record.pk)
        self.jira_record.do_jira_work()
        call_args, call_kwargs = mock_JIRA.return_value.create_issue.call_args
        # Expecting: summary, project, issuetype, description, duedate
        self.assertTrue('summary' in call_kwargs)
        self.assertTrue('new service' in call_kwargs['summary'].lower())
        self.assertTrue(self.test_service.provider.name_en in call_kwargs['summary'])
        self.assertTrue('project' in call_kwargs)
        self.assertEqual({'key': settings.JIRA_SERVICES_PROJECT_KEY}, call_kwargs['project'])
        self.assertTrue('issuetype' in call_kwargs)
        self.assertEqual({'name': 'Task'}, call_kwargs['issuetype'])
        self.assertTrue('description' in call_kwargs)
        admin_url = absolute_url(self.test_service.get_admin_edit_url())
        self.assertTrue(
            admin_url in call_kwargs['description'],
            msg='%s not found in %s' % (admin_url, call_kwargs['description']))
        self.assertIn('11:10', call_kwargs['description'])
        self.assertIn('17:18', call_kwargs['description'])
        self.assertIn('Must be 18', call_kwargs['description'])
        self.assertIn('Must have shoes', call_kwargs['description'])
        self.assertIn('12-345678', call_kwargs['description'])
        self.assertIn('31415', call_kwargs['description'])
        self.assertTrue('duedate' in call_kwargs)
        expected_duedate = datetime.date.today() + datetime.timedelta(days=settings.JIRA_DUEIN_DAYS)
        self.assertEqual(str(expected_duedate), call_kwargs['duedate'])
        # We've tested 5, ensure that is all that were passed
        self.assertEqual(5, len(call_kwargs))
        self.assertEqual((), call_args)

    def test_create_issue_kwargs_for_update(self, mock_JIRA):
        self.test_service.update_of = ServiceFactory()
        self.jira_record.update_type = JiraUpdateRecord.CHANGE_SERVICE
        self.jira_record.save()
        self.setup_issue_key(mock_JIRA)
        self.jira_record.do_jira_work()
        call_args, call_kwargs = mock_JIRA.return_value.create_issue.call_args
        # Only checking summary as that has the essentially different value
        # from what the "new service" case sets.
        self.assertTrue('summary' in call_kwargs)
        self.assertTrue('changed service' in call_kwargs['summary'].lower())
        self.assertTrue(self.test_service.provider.name_en in call_kwargs['summary'])

    def test_new_service_then_approve_before_task(self, mock_JIRA):
        # If a service is approved before we try to do the JIRA work,
        # the JIRA work gracefully works
        self.jira_record.update_type = JiraUpdateRecord.NEW_SERVICE
        self.jira_record.save()
        self.test_service.staff_approve(self.staff_user)
        self.setup_issue_key(mock_JIRA)
        self.jira_record.do_jira_work()

    def test_change_service_then_approve_before_task(self, mock_JIRA):
        # If a service is approved before we try to do the JIRA work,
        # the JIRA work gracefully works
        self.test_service.update_of = ServiceFactory()
        self.jira_record.update_type = JiraUpdateRecord.CHANGE_SERVICE
        self.jira_record.save()
        self.test_service.staff_approve(self.staff_user)
        self.setup_issue_key(mock_JIRA)
        self.jira_record.do_jira_work()

    def test_create_jira_issue_noop_if_already_created(self, mock_JIRA):
        test_key_val = 'ALREADY-SET'
        self.jira_record.jira_issue_key = test_key_val
        self.jira_record.save()
        self.jira_record.do_jira_work()
        self.assertFalse(mock_JIRA.called)
        self.assertEqual(test_key_val, self.jira_record.jira_issue_key)

    def test_create_jira_issue_uses_provided_jira(self, mock_JIRA):
        # This 2nd mock will take precendence by default, we test to
        # ensure that if the original mock is passed in it is called.
        with mock.patch('services.jira_support.JIRA') as JIRA:
            issue_key = self.setup_issue_key(mock_JIRA)
            self.jira_record.do_jira_work(mock_JIRA())
            self.assertFalse(JIRA.called)
            self.assertEqual(issue_key, self.jira_record.jira_issue_key)

    def test_cancel_current_service_creates_jira_issue(self, mock_JIRA):
        service = self.jira_record.service
        service.status = service.STATUS_CURRENT
        service.save()
        service.cancel()
        self.jira_record = \
            service.jira_records.get(update_type=JiraUpdateRecord.CANCEL_CURRENT_SERVICE)
        self.jira_record.save()
        self.setup_issue_key(mock_JIRA)
        self.jira_record.do_jira_work()
        call_args, call_kwargs = mock_JIRA.return_value.create_issue.call_args
        # Only checking summary as that has the essentially different value
        # from what the "new service" case sets.
        self.assertTrue('summary' in call_kwargs)
        self.assertTrue('canceled service' in call_kwargs['summary'].lower())
        self.assertTrue(self.test_service.provider.name_en in call_kwargs['summary'])

    def test_cancel_draft_new_service_comments_on_jira_issue(self, mock_JIRA):
        # If we cancel a pending new service, it adds a comment to the
        # existing JIRA issue.

        # First create a record from when the draft service was started
        issue_key = 'XXX-123'
        self.jira_record.jira_issue_key = issue_key
        self.jira_record.save()

        service = self.jira_record.service
        service.status = service.STATUS_DRAFT
        service.save()

        service.cancel()
        cancel_record = service.jira_records.get(update_type=JiraUpdateRecord.CANCEL_DRAFT_SERVICE)

        cancel_record.do_jira_work()
        call_args, call_kwargs = mock_JIRA.return_value.add_comment.call_args
        # Only checking summary as that has the essentially different value
        # from what the "new service" case sets.
        self.assertEqual(issue_key, call_args[0])
        self.assertIn('change was canceled', call_args[1])
        # We should NOT have created a new JIRA record
        self.assertFalse(mock_JIRA.return_value.create_issue.called)

    def test_cancel_draft_service_change_comments_on_jira_issue(self, mock_JIRA):
        # If we cancel a pending change to a current service, it adds a comment
        # to the existing jira issue.

        # make the service we're canceling look like a change to an existing service
        existing_service = ServiceFactory(status=Service.STATUS_CURRENT)
        draft_service = ServiceFactory(
            update_of=existing_service,
            status=Service.STATUS_DRAFT,
        )
        # Pretend we've created a JIRA issue when the draft was started.
        issue_key = 'XXX-123'
        draft_service.jira_records.update(jira_issue_key=issue_key)

        # Now cancel the draft
        draft_service.cancel()

        # We should get a new jira update record created
        cancel_record = \
            draft_service.jira_records.get(update_type=JiraUpdateRecord.CANCEL_DRAFT_SERVICE)
        # run it:
        cancel_record.do_jira_work()
        call_args, call_kwargs = mock_JIRA.return_value.add_comment.call_args
        # Only checking summary as that has the essentially different value
        # from what the "new service" case sets.
        self.assertEqual(issue_key, call_args[0])
        self.assertIn('change was canceled', call_args[1])
        record = JiraUpdateRecord.objects.get(pk=cancel_record.pk)
        self.assertEqual(issue_key, record.jira_issue_key)
        # We should NOT have created a new JIRA record
        self.assertFalse(mock_JIRA.return_value.create_issue.called)

    def test_replacing_a_draft_comments_on_jira_issue(self, mock_JIRA):
        draft_service = ServiceFactory(status=Service.STATUS_DRAFT)
        # Pretend we've created a JIRA issue when the draft was started.
        issue_key = 'XXX-123'
        draft_service.jira_records.update(jira_issue_key=issue_key)
        mock_JIRA.return_value.create_issue.reset_mock()  # Forget we "created a jira record"
        # Now edit the draft
        new_draft = ServiceFactory(update_of=draft_service, status=Service.STATUS_DRAFT)
        # We should have a new update record
        jira_record = new_draft.jira_records.get(update_type=JiraUpdateRecord.SUPERSEDED_DRAFT)
        jira_record.do_jira_work()
        # We should NOT have created another JIRA record
        self.assertFalse(mock_JIRA.return_value.create_issue.called)
        # We add a comment with links to the old and new data
        call_args, call_kwargs = mock_JIRA.return_value.add_comment.call_args
        self.assertEqual(issue_key, call_args[0])
        self.assertIn(new_draft.get_admin_edit_url(), call_args[1])