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)
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)
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))
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)
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')
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)
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')
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')
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)
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)
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))
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)
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)
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')
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)
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)
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)
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')
def setUp(self): cycle = factories.GrantCycle() self.form = StandardApplicationForm(cycle)
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')
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)