def test_default_language_required_for_update(self, mock_sync): """Form should require a default language when updating an org.""" self.data.pop('language') form = self.form_class(data=self.data, instance=factories.Org()) self.assertFalse(form.is_valid()) self.assertEqual(form.errors.keys(), ['language']) self.assertEqual(form.errors['language'], ['This field is required.'])
def setUp(self): super(TestRegion, self).setUp() self.org = factories.Org() self.temba_groups = { '1': TembaGroup.create(uuid="1", name="Uganda"), '2': TembaGroup.create(uuid="2", name="Kampala"), '3': TembaGroup.create(uuid="3", name="Entebbe"), '4': TembaGroup.create(uuid="4", name="Makerere"), } self.uganda = factories.Region(org=self.org, uuid='1', name="Uganda") self.kampala = factories.Region(org=self.org, uuid='2', name="Kampala", parent=self.uganda) self.entebbe = factories.Region(org=self.org, uuid='3', name="Entebbe", parent=self.uganda) self.makerere = factories.Region(org=self.org, uuid='4', name="makerere", parent=self.kampala) self.inactive = factories.Region(org=self.org, uuid='5', name="inactive", parent=self.kampala, is_active=False) self.mock_temba_client.get_contacts.return_value = []
def test_available_languages_required_for_update(self, mock_sync): """Form should require available languages for new orgs.""" self.data.pop('available_languages') form = self.form_class(data=self.data, instance=factories.Org()) self.assertFalse(form.is_valid()) self.assertEqual(form.errors.keys(), ['available_languages']) self.assertEqual(form.errors['available_languages'], ['This field is required.'])
def setUp(self): """Set up common resources.""" super(BaseMapsTest, self).setUp() self.org = factories.Org() self.poll = factories.Poll() self.pollrun = factories.PollRun(poll=self.poll) self.boundary_a = factories.Boundary(org=self.org) self.boundary_b = factories.Boundary(org=self.org)
def test_available_languages_no_change(self, mock_sync): """Form should allow available languages to remain unchanged.""" org = factories.Org( available_languages=['en', 'es'], language='en', ) form = self.form_class(data=self.data, instance=org) self.assertTrue(form.is_valid(), form.errors) form.save() org.refresh_from_db() self.assertEqual(org.available_languages, ['en', 'es']) self.assertEqual(org.language, 'en')
def test_add_available_languages(self, mock_sync): """Form should allow addition of available language(s).""" org = factories.Org( available_languages=['en', 'es'], language='en', ) self.data['available_languages'] = ['en', 'es', 'fr'] form = self.form_class(data=self.data, instance=org) self.assertTrue(form.is_valid(), form.errors) form.save() org.refresh_from_db() self.assertEqual(org.available_languages, ['en', 'es', 'fr']) self.assertEqual(org.language, 'en')
def test_remove_default_from_available(self, mock_sync): """Form should error if default language is removed from available languages.""" org = factories.Org( available_languages=['en', 'es'], language='en', ) self.data['available_languages'] = ['es'] form = self.form_class(data=self.data, instance=org) self.assertFalse(form.is_valid()) self.assertTrue(form.errors.keys(), [NON_FIELD_ERRORS]) self.assertEqual(form.errors[NON_FIELD_ERRORS], [ 'Default language must be one of the languages ' 'available for this organization.' ])
def test_sync_questions_categories(self, mock_logger, mock_poll_get_flow): self.org = factories.Org() self.poll_1 = factories.Poll(org=self.org, name='Poll 1') self.poll_2 = factories.Poll(org=self.org, name='Poll 2') # Create 2 questions locally: # one that is on RapidPro # and one that should be removed because it won't be on RapidPro self.question_1 = factories.Question( poll=self.poll_1, ruleset_uuid='goodquestion', question_type=models.Question.TYPE_MULTIPLE_CHOICE) self.question_2 = factories.Question( poll=self.poll_1, ruleset_uuid='oldquestion', question_type=models.Question.TYPE_MULTIPLE_CHOICE) # Data to pass to form for testing. Only select one poll self.data = [self.poll_1] # Patch the call to the API flow_1 = mock.Mock() flow_1.uuid = 'abcdefg123' flow_1.name = self.poll_1.name ruleset_existing = mock.Mock() ruleset_existing.uuid = 'goodquestion' ruleset_existing.label = 'good question' ruleset_new = mock.Mock() ruleset_new.uuid = 'newquestion' ruleset_new.label = 'new question' flow_1.rulesets = [ruleset_existing, ruleset_new] # Mock the call to the API to send back a single flow matching our first poll self.mock_temba_client.get_flows.return_value = [flow_1] # Mock this call to return an empty rule set so that RapidPro API is not called mock_poll_get_flow.return_value.rulesets = [] # Assert that the 2 questions exist before we sync when one should be deleted self.assertEqual(models.Question.objects.count(), 2) # Call the task to sync questions... sync_questions_categories(self.org, self.data) # Two questions exist locally, one is new from the RapidPro API mock (flow_1.rulesets) self.assertEqual(models.Question.objects.count(), 2) self.assertEqual(models.Question.objects.first().ruleset_uuid, 'goodquestion') self.assertEqual(models.Question.objects.last().ruleset_uuid, 'newquestion') # Only 1 poll was reflected in the log message as only 1 poll was sent into the form data self.assertEqual(mock_logger.call_count, 2) self.assertIn("1 Poll(s)", mock_logger.call_args[0][0])
def test_available_languages_initial_for_update(self, mock_sync): """Available languages should be set from the instance to update.""" org = factories.Org(available_languages=['en', 'es']) form = self.form_class(instance=org) self.assertEqual(form.fields['available_languages'].initial, ['en', 'es'])