class TestGetInterventionContext(BaseTenantTestCase): '''Exercise the tasks' helper function get_intervention_context()''' def setUp(self): super(TestGetInterventionContext, self).setUp() self.intervention = InterventionFactory() def test_simple_intervention(self): '''Exercise get_intervention_context() with a very simple intervention''' result = partners.tasks.get_intervention_context(self.intervention) self.assertIsInstance(result, dict) self.assertEqual(sorted(result.keys()), sorted(['number', 'partner', 'start_date', 'url', 'unicef_focal_points'])) self.assertEqual(result['number'], six.text_type(self.intervention)) self.assertEqual(result['partner'], self.intervention.agreement.partner.name) self.assertEqual(result['start_date'], 'None') self.assertEqual(result['url'], 'https://{}/pmp/interventions/{}/details'.format(settings.HOST, self.intervention.id)) self.assertEqual(result['unicef_focal_points'], []) def test_non_trivial_intervention(self): '''Exercise get_intervention_context() with an intervention that has some interesting detail''' focal_point_user = User.objects.all()[0] self.intervention.unicef_focal_points.add(focal_point_user) self.intervention.start = datetime.date(2017, 8, 1) self.intervention.save() result = partners.tasks.get_intervention_context(self.intervention) self.assertIsInstance(result, dict) self.assertEqual(sorted(result.keys()), sorted(['number', 'partner', 'start_date', 'url', 'unicef_focal_points'])) self.assertEqual(result['number'], six.text_type(self.intervention)) self.assertEqual(result['partner'], self.intervention.agreement.partner.name) self.assertEqual(result['start_date'], '2017-08-01') self.assertEqual(result['url'], 'https://{}/pmp/interventions/{}/details'.format(settings.HOST, self.intervention.id)) self.assertEqual(result['unicef_focal_points'], [focal_point_user.email])
def test_update_intervention(self): """Ensure agreement update fails if intervention dates aren't appropriate. I don't think it's possible to supply interventions when creating via the serializer, so this only tests update. """ agreement = AgreementFactory(agreement_type=Agreement.SSFA, partner=self.partner, status=Agreement.DRAFT, start=self.today - datetime.timedelta(days=5), end=self.today + datetime.timedelta(days=5), signed_by_unicef_date=None, signed_by_partner_date=None) intervention = InterventionFactory(agreement=agreement) # Start w/an invalid intervention. data = { "agreement": agreement, "intervention": intervention, } serializer = AgreementCreateUpdateSerializer() # If I don't set serializer.instance, the validator gets confused. I guess (?) this is ordinarily set by DRF # during an update? serializer.instance = agreement serializer.context['request'] = self.fake_request with self.assertRaises(serializers.ValidationError) as context_manager: serializer.validate(data=data) self.assertSimpleExceptionFundamentals( context_manager, "Start and end dates don't match the Document's start and end" ) # Set start date and save again; it should still fail because end date isn't set. intervention.start = agreement.start intervention.save() with self.assertRaises(serializers.ValidationError) as context_manager: serializer.validate(data=data) self.assertSimpleExceptionFundamentals( context_manager, "Start and end dates don't match the Document's start and end" ) # Set start date and save again; it should still fail because end date doesn't match agreement end date. intervention.end = agreement.end + datetime.timedelta(days=100) intervention.save() with self.assertRaises(serializers.ValidationError) as context_manager: serializer.validate(data=data) self.assertSimpleExceptionFundamentals( context_manager, "Start and end dates don't match the Document's start and end" ) # Set start date and save again; it should now succeed. intervention.end = agreement.end intervention.save() # Should not raise an exception serializer.validate(data=data)