예제 #1
0
    def test_both(self):
        fake_now = timezone.now().replace(hour=0) + timedelta(days=1)
        rr_cycle = factories.GrantCycle(title='Rapid Response',
                                        open=fake_now - timedelta(weeks=2),
                                        close=fake_now - timedelta(minutes=4))
        s_cycle = factories.GrantCycle(title='Seed Grant',
                                       open=fake_now - timedelta(weeks=2),
                                       close=fake_now - timedelta(minutes=95))
        self.assert_count(models.GrantCycle.objects.all(), 2)

        for i in range(0, 4):
            factories.DraftGrantApplication(grant_cycle=s_cycle if i %
                                            2 else rr_cycle)

        logger.info = Mock()
        timezone.now = Mock(return_value=fake_now)
        res = self.client.get(self.url)
        self.assertEqual(res.status_code, 201)

        logger.info.assert_any_call('auto_create_cycles created %d new cycles',
                                    2)
        new_cycle_ids = (models.GrantCycle.objects.filter(
            close__gte=fake_now).values_list('id', flat=True))

        for draft in models.DraftGrantApplication.objects.all():
            self.assertIn(draft.grant_cycle_id, new_cycle_ids)

        for id in new_cycle_ids:
            self.assert_count(
                models.CycleNarrative.objects.filter(grant_cycle_id=id),
                len(gc.STANDARD_NARRATIVES))
        self.assert_length(mail.outbox, 1)
예제 #2
0
    def test_get_form(self):
        cycle = factories.GrantCycle()
        self.assertEqual(get_form_for_cycle(cycle), StandardApplicationForm)

        cycle = factories.GrantCycle(title='Rapid Response Cycle')
        self.assertEqual(get_form_for_cycle(cycle),
                         RapidResponseApplicationForm)

        cycle = factories.GrantCycle(title='Seed Grants')
        self.assertEqual(get_form_for_cycle(cycle), SeedApplicationForm)
예제 #3
0
    def test_draft_rollover(self):
        draft = factories.DraftGrantApplication(organization=self.org)
        target_cycle = factories.GrantCycle(status='open')

        response = self.client.post('/apply/copy', {
            'cycle': target_cycle.pk,
            'draft': draft.pk,
            'application': ''
        },
                                    follow=True)

        ids = {
            'organization_id': self.org.pk,
            'grant_cycle_id': target_cycle.pk
        }
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'grants/org_app.html')

        new_draft = DraftGrantApplication.objects.get(**ids)
        old_contents = json.loads(draft.contents)
        new_contents = json.loads(new_draft.contents)
        self.assertEqual(old_contents, new_contents)
        for field in GrantApplication.file_fields():
            if hasattr(draft, field):
                self.assertEqual(getattr(draft, field),
                                 getattr(new_draft, field))
예제 #4
0
    def test_long_alert_skip(self):
        now = timezone.now()
        cycle = factories.GrantCycle(close=now + timedelta(days=7, hours=12))
        draft = factories.DraftGrantApplication(grant_cycle=cycle, created=now)

        self.assert_length(mail.outbox, 0)
        self.client.get(reverse(cron.draft_app_warning))
        self.assert_length(mail.outbox, 0)
예제 #5
0
 def setUp(self):
     super(ApplyValidation, self).setUp()
     self.login_as_org()
     # take a valid grant application to use as draft
     app = factories.GrantApplication()
     self.draft = DraftGrantApplication.objects.create_from_submitted_app(
         app)
     self.draft.organization = self.org
     self.draft.grant_cycle = factories.GrantCycle(status='open')
예제 #6
0
    def test_short_alert(self):
        """ Cycle created now with cycle closing in 2.5 days """

        now = timezone.now()
        cycle = factories.GrantCycle(close=now + timedelta(days=2, hours=12))
        draft = factories.DraftGrantApplication(grant_cycle=cycle, created=now)

        self.assert_length(mail.outbox, 0)
        self.client.get(reverse(cron.draft_app_warning))
        self.assert_length(mail.outbox, 1)
예제 #7
0
    def test_not_allowed_url(self):
        cycle = factories.GrantCycle(status='open',
                                     info_page='http://facebook.com')

        res = self.client.get(self._get_url(cycle.pk), follow=True)

        self.assertEqual(res.status_code, 200)
        self.assertTemplateUsed(res, 'grants/cycle_info.html')
        self.assertContains(res, self.error_message)
        self.assertNotContains(res, 'facebook')
예제 #8
0
    def test_load_first_app_rapid(self):
        self.login_as_org()

        cycle = factories.GrantCycle(status='open', title='Rapid Response')
        res = self._load_application_form(cycle.pk)

        self.assertNotContains(res, 'Pre-filled')
        self.assertContains(res, gc.STATUS_CHOICES[4][1])
        self.assertContains(res, 'Project title')
        self.assertContains(res, 'Project budget')
예제 #9
0
 def test_cycle_open(self):
   source_app = factories.GrantApplication()
   target_cycle = factories.GrantCycle(status='open')
   res = self.client.post(
     reverse(views.admin_rollover, kwargs={'app_id': source_app.pk}),
     data={'cycle': target_cycle.pk}
   )
   self.assertEqual(res.status_code, 302)
   self.assertRegexpMatches(res.get('Location'), r'/admin/grants/grantapplication/\d/$')
   self.assert_count(GrantApplication.objects.filter(grant_cycle=target_cycle), 1)
예제 #10
0
    def test_load_second_app(self):
        self.login_as_org(with_profile=True)

        cycle = factories.GrantCycle(status='open')

        res = self._load_application_form(cycle.pk)

        # mission should be pre-filled using last application
        org = Organization.objects.get(pk=self.org.pk)
        self.assertContains(res, 'Pre-filled')
        self.assertContains(res, org.mission)
예제 #11
0
    def test_invalid_url(self):
        info_page = 'http://socialjusticefund.org/does-not-exist'
        cycle = factories.GrantCycle(status='open', info_page=info_page)

        res = self.client.get(self._get_url(cycle.pk), follow=True)

        self.assertEqual(res.status_code, 200)
        self.assertTemplateUsed(res, 'grants/cycle_info.html')
        self.assertContains(res, self.error_message)
        self.assertContains(res, 'Try visiting it directly')
        self.assertContains(res, 'a href="{}"'.format(info_page))
예제 #12
0
    def test_seed(self):
        cycle = factories.GrantCycle(title='Seed Cycle')
        form = SeedApplicationForm(cycle, {})

        self.assert_length(form.fields['status'].choices, FULL_CHOICES_LENGTH)

        self.assertFalse(form.is_valid())
        self.assertRegexpMatches(form.errors['demographics'].as_text(),
                                 ERR_REQUIRED)
        for field in ['budget1', 'budget2', 'budget3', 'funding_sources']:
            self.assertNotIn(field, form.errors)
예제 #13
0
  def test_app_exists(self):
    source_app = factories.GrantApplication()
    target_cycle = factories.GrantCycle(status='open')
    app = factories.GrantApplication(
      organization=source_app.organization, grant_cycle=target_cycle)

    res = self.client.post(
      reverse(views.admin_rollover, kwargs={'app_id': source_app.pk}),
      data={'cycle': target_cycle.pk}
    )
    self.assertEqual(res.status_code, 200)
    self.assertFalse(res.context['form'].is_valid())
    self.assert_count(GrantApplication.objects.filter(grant_cycle_id=target_cycle.pk), 1)
예제 #14
0
    def test_valid_url(self):
        cycle = factories.GrantCycle(
            status='open',
            info_page=
            'http://www.socialjusticefund.org/grant-app/criminal-justice-grant-cycle-2014'
        )

        res = self.client.get(self._get_url(cycle.pk), follow=True)

        self.assertEqual(res.status_code, 200)
        self.assertTemplateUsed(res, 'grants/cycle_info.html')
        self.assertNotContains(res, self.error_message)
        self.assertContains(res, 'node-grant-portal-info-page')
예제 #15
0
    def test_already_created(self):
        fake_now = timezone.now().replace(hour=0) + timedelta(days=1)
        timezone.now = Mock(return_value=fake_now)
        logger.info = Mock()

        cycle = factories.GrantCycle(title='Rapid Response',
                                     open=fake_now - timedelta(weeks=2),
                                     close=fake_now - timedelta(hours=1))
        factories.DraftGrantApplication(grant_cycle=cycle)
        cycle = factories.GrantCycle(title='Rapid Response',
                                     open=fake_now - timedelta(minutes=5),
                                     close=fake_now + timedelta(days=12))

        res = self.client.get(self.url)

        self.assertEqual(res.status_code, 200)
        self.assertEqual(logger.info.call_count, 2)
        logger.info.assert_any_call(
            'auto_create_cycles skipping %s cycle; next one exists',
            'Rapid Response')
        logger.info.assert_any_call(
            'auto_create_cycles did nothing; new cycles already existed')
        self.assert_count(models.GrantCycle.objects.all(), 2)
        self.assert_length(mail.outbox, 0)
예제 #16
0
    def test_standard_requirements(self):
        cycle = factories.GrantCycle()
        form = StandardApplicationForm(cycle, {})

        self.assert_length(form.fields['status'].choices,
                           FULL_CHOICES_LENGTH - 1)

        self.assertFalse(form.is_valid())
        for field in [
                'budget1', 'budget2', 'budget3', 'demographics',
                'funding_sources'
        ]:
            self.assertTrue(field in form.errors,
                            'Expected form error for {}'.format(field))
            err = form.errors[field]
            self.assertIsInstance(err, ErrorList)
            self.assertRegexpMatches(err.as_text(), ERR_REQUIRED)
예제 #17
0
    def test_app_rollover(self):
        app = factories.GrantApplication(organization=self.org)
        target_cycle = factories.GrantCycle(status='open')

        post_data = {
            'cycle': target_cycle.pk,
            'draft': '',
            'application': app.pk
        }
        response = self.client.post('/apply/copy', post_data, follow=True)

        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'grants/org_app.html')

        ids = {
            'organization_id': self.org.pk,
            'grant_cycle_id': target_cycle.pk
        }

        draft = DraftGrantApplication.objects.get(**ids)
        self.assert_draft_matches_app(draft, app)
예제 #18
0
 def test_closed_cycle(self):
     cycle = factories.GrantCycle(status='closed')
     res = self.client.get(_get_apply_url(cycle.pk))
     self.assertEqual(res.status_code, 200)
     self.assertTemplateUsed(res, 'grants/closed.html')
예제 #19
0
 def setUp(self):
     cycle = factories.GrantCycle()
     self.form = StandardApplicationForm(cycle)
예제 #20
0
 def test_upcoming(self):
     cycle = factories.GrantCycle(status='upcoming')
     res = self.client.get(_get_apply_url(cycle.pk))
     self.assertEqual(200, res.status_code)
     self.assertTemplateUsed(res, 'grants/closed.html')
예제 #21
0
    def test_no_url(self):
        cycle = factories.GrantCycle(status='open', info_page='')

        res = self.client.get(self._get_url(cycle.pk), follow=True)
        self.assertEqual(res.status_code, 404)