def test_start_conflicting_drafts(self): a = factories.Organization() b = factories.Organization() # create drafts for same cycle draft_a = factories.DraftGrantApplication(organization=a) draft_b = factories.DraftGrantApplication(organization=b, grant_cycle=draft_a.grant_cycle) post_data = {'action': 'merge', '_selected_action': [a.pk, b.pk]} res = self.client.post(self.admin_url, post_data, follow=True) self.assertEqual(res.status_code, 200) self.assertTemplateUsed(res, 'admin/change_list.html') self.assert_message(res, r'same grant cycle. Cannot be automatically merged.$', regex=True)
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_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_wrong_org(self): other_org = factories.Organization() draft = factories.DraftGrantApplication(organization=other_org) response = self.client.delete(self.url) self.assertEqual(response.status_code, 400) self.assertEqual(response.content, 'User does not have permission to delete this draft')
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 test_valid(self): self.login_as_org() draft = factories.DraftGrantApplication(organization=self.org) response = self.client.post(self._get_url(draft), {}) self.assertEqual(200, response.status_code) draft.refresh_from_db() self.assertEqual(draft.contents, '{}')
def test_post(self): """ Wrong http method - should have no effect """ draft = factories.DraftGrantApplication(organization=self.org) response = self.client.post(self.url) self.assertEqual(response.status_code, 405) self.assertEqual(response.get('Allow'), 'DELETE') self.assert_count(models.DraftGrantApplication.objects.filter(pk=draft.pk), 1)
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_valid_delete(self): draft = factories.DraftGrantApplication(organization=self.org) response = self.client.delete(self.url) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'success') self.assert_count( models.DraftGrantApplication.objects.filter(organization=self.org), 0)
def test_draft_exists(self): source_app = factories.GrantApplication() draft = factories.DraftGrantApplication( organization=source_app.organization, grant_cycle__status='open') res = self.client.post( reverse(views.admin_rollover, kwargs={'app_id': source_app.pk}), data={'cycle': draft.grant_cycle.pk} ) self.assertEqual(res.status_code, 200) self.assertFalse(res.context['form'].is_valid()) self.assert_count(GrantApplication.objects.filter(grant_cycle=draft.grant_cycle), 0)
def test_mult_budget(self): draft = factories.DraftGrantApplication(organization=self.org) files = [ 'funding_sources.docx', 'diversity.doc', 'budget1.docx', 'budget2.txt', 'budget3.png', '', '' ] alter_draft_files(draft, files) res = self.client.post(_get_apply_url(draft.grant_cycle.pk), follow=True) self.assertEqual(res.status_code, 200) self.assertTemplateUsed(res, 'grants/submitted.html') self.assert_count( DraftGrantApplication.objects.filter(organization=self.org), 0) app = GrantApplication.objects.get(organization=self.org, grant_cycle=draft.grant_cycle) self.assertEqual(app.budget1, files[2]) self.assertEqual(app.budget2, files[3])
def test_valid(self): draft = factories.DraftGrantApplication() original = draft.budget3 self.create_blob('fakeblobkey123', filename='file.txt', content_type='text', content='filler') url = reverse(views.add_file, kwargs={ 'draft_type': 'apply', 'draft_id': draft.pk }) budget = SimpleUploadedFile("file.txt", "blob-key=fakeblobkey123") res = self.client.post(url, {'budget3': budget}, follow=True) self.assertEqual(res.status_code, 200) self.assertContains(res, 'file.txt') draft.refresh_from_db() self.assertEqual(draft.budget3.name, 'fakeblobkey123/file.txt') self.assertNotEqual(draft.budget3, original)
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_not_logged_in(self): draft = factories.DraftGrantApplication() response = self.client.post(self._get_url(draft), {'mission': 'Something'}) self.assertEqual(401, response.status_code)
def setUp(self): self.login_as_org() self.draft = factories.DraftGrantApplication()