class JiraProviderChangeTest(MockJiraTestMixin, TestCase): def setUp(self): self.test_provider = ProviderFactory() def test_creating_provider_doesnt_create_jira_record(self, mock_JIRA): with self.assertRaises(JiraUpdateRecord.DoesNotExist): self.jira_record = self.test_provider.jira_records.get( update_type=JiraUpdateRecord.PROVIDER_CHANGE) def test_provider_notify_jira_of_change_creates_record(self, mock_JIRA): self.test_provider.notify_jira_of_change() jira_record = self.test_provider.jira_records.get( update_type=JiraUpdateRecord.PROVIDER_CHANGE) self.assertEqual(self.test_provider, jira_record.provider) def test_provider_change_jira_work(self, mock_JIRA): self.test_provider.notify_jira_of_change() jira_record = self.test_provider.jira_records.get( update_type=JiraUpdateRecord.PROVIDER_CHANGE) self.assertEqual('', jira_record.jira_issue_key) issue_key = self.setup_issue_key(mock_JIRA) jira_record.do_jira_work() expected_duedate = datetime.date.today() + datetime.timedelta(days=settings.JIRA_DUEIN_DAYS) mock_JIRA.return_value.create_issue.assert_called_with( description=mock.ANY, project={'key': settings.JIRA_SERVICES_PROJECT_KEY}, issuetype={'name': 'Task'}, duedate=str(expected_duedate), summary="Changed provider from %s" % str(self.test_provider), ) description = mock_JIRA.return_value.create_issue.call_args[1]['description'] self.assertIn(absolute_url(self.test_provider.get_admin_edit_url()), description) self.assertIn(self.test_provider.name_en, description) jira_record = JiraUpdateRecord.objects.get(pk=jira_record.pk) self.assertEqual(issue_key, jira_record.jira_issue_key)
def test_phone_number_validation(self): with self.assertRaises(ValidationError): ProviderFactory(phone_number='9').full_clean() with self.assertRaises(ValidationError): ProviderFactory(phone_number='ab-cdefgh').full_clean() with self.assertRaises(ValidationError): ProviderFactory(phone_number='12-3456789').full_clean() with self.assertRaises(ValidationError): ProviderFactory(phone_number='12345678').full_clean() ProviderFactory(phone_number='12-345678').full_clean()
def test_provider_change_own_data(self): # Non-staff can change their own provider provider = ProviderFactory(user=self.user) # Tweak some data provider.name_en = 'Jim-Bob' provider.name_ar = 'Ahmed-Bob' provider.name_fr = 'Pierre-Bob' book = get_export_workbook([provider]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) new_provider = Provider.objects.get(id=provider.id) self.assertEqual(provider.name_en, new_provider.name_en) self.assertEqual(provider.name_ar, new_provider.name_ar) self.assertEqual(provider.name_fr, new_provider.name_fr)
def test_staff_add_providers(self): # Remember, only one provider per user self.user.is_staff = True self.user.save() type1 = ProviderTypeFactory() provider1 = ProviderFactory.build(type=type1, user=self.user) # Doesn't save user2 = EmailUserFactory() type2 = ProviderTypeFactory() provider2 = ProviderFactory.build(type=type2, user=user2) # Doesn't save book = get_export_workbook([provider1, provider2]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) self.assertTrue(Provider.objects.filter(name_en=provider1.name_en).exists()) self.assertTrue(Provider.objects.filter(name_en=provider2.name_en).exists())
def test_staff_change_provider(self): # Staff can change another user's provider self.user.is_staff = True self.user.save() provider = ProviderFactory() # Tweak some data provider.name_en = 'Jim-Bob' provider.name_ar = 'Ahmed-Bob' provider.name_fr = 'Pierre-Bob' book = get_export_workbook([provider]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) new_provider = Provider.objects.get(id=provider.id) self.assertEqual(provider.name_en, new_provider.name_en) self.assertEqual(provider.name_ar, new_provider.name_ar) self.assertEqual(provider.name_fr, new_provider.name_fr)
def test_staff_change_provider_invalid_id(self): self.user.is_staff = True self.user.save() provider = ProviderFactory() # Tweak some data provider.name_en = 'Jim-Bob' provider.name_ar = 'Ahmed-Bob' provider.name_fr = 'Pierre-Bob' book = get_export_workbook([provider], cell_overwrite_ok=True) sheet = book.get_sheet(0) sheet.write(r=1, c=0, label='xyz') rsp = self.import_book(book) self.assertContains(rsp, "id: xyz is not a valid ID", status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_num_beneficiaries_validation(self): data = [ (None, True), # No value is okay (-1, False), # Range 0-1,000,000 (0, True), (1000000, True), (1000001, False), ] for value, expect_valid in data: if expect_valid: ProviderFactory( number_of_monthly_beneficiaries=value).full_clean() else: with self.assertRaises(ValidationError): ProviderFactory( number_of_monthly_beneficiaries=value).full_clean()
def test_non_staff_sees_all_current_data(self): provider = ProviderFactory() service1 = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) service2 = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) ServiceFactory(status=Service.STATUS_CURRENT) ServiceFactory(provider=provider, status=Service.STATUS_DRAFT) # Draft - not included book = get_export_workbook_for_user(provider.user) xlrd_book = save_and_read_book(book) # First sheet - providers sheet = xlrd_book.get_sheet(0) self.assertEqual(2, sheet.nrows - 1) # first provider values = sheet.row_values(1) data = dict(zip(PROVIDER_HEADINGS, values)) self.assertEqual(provider.id, data['id']) # Second sheet - services sheet = xlrd_book.get_sheet(1) self.assertEqual(3, sheet.nrows - 1) values = sheet.row_values(1) data = dict(zip(SERVICE_HEADINGS, values)) self.assertEqual(service1.id, data['id']) values = sheet.row_values(2) data = dict(zip(SERVICE_HEADINGS, values)) self.assertEqual(service2.id, data['id'])
def test_staff_change_nonexistent_provider(self): # Staff can change another user's provider self.user.is_staff = True self.user.save() provider = ProviderFactory() name_fields = generate_translated_fields('name', False) # Tweak some data for field in name_fields: setattr(provider, field, random_string(10)) book = get_export_workbook([provider]) provider_id = provider.id provider.delete() rsp = self.import_book(book) self.assertContains(rsp, "There is no provider with id=%d" % provider_id, status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_provider_add_provider(self): type = ProviderTypeFactory() provider = ProviderFactory.build(type=type, user=self.user) # Doesn't save self.assertFalse(provider.id) book = get_export_workbook([provider]) rsp = self.import_book(book) # self.fail(rsp.content.decode('utf-8')) self.assertContains(rsp, "Non-staff users may not create new providers", status_code=BAD_REQUEST)
def test_types_require_no_provider(self): provider = ProviderFactory() disallow_provider_types = JiraUpdateRecord.SERVICE_CHANGE_UPDATE_TYPES for update_type in disallow_provider_types: with self.assertRaises(Exception) as cm: JiraUpdateRecord.objects.create(update_type=update_type, provider=provider) self.assertTrue( 'must not specify provider' in str(cm.exception), msg='Unexpected exception message (%s) for %s' % (str(cm.exception), update_type))
def test_using_export_url_to_get_export(self): provider = ProviderFactory(user=self.user) ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) url = self.get_export_url() rsp = self.client.get(url) self.assertEqual(OK, rsp.status_code) bits = rsp.content errs = validate_and_import_data(self.user, bits) self.assertFalse(errs)
def test_staff_see_all_current_data(self): user = EmailUserFactory(is_staff=True) provider = ProviderFactory() ProviderFactory() ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) ServiceFactory(status=Service.STATUS_CURRENT) ServiceFactory(provider=provider, status=Service.STATUS_DRAFT) book = get_export_workbook_for_user(user) xlrd_book = save_and_read_book(book) # First sheet - providers sheet = xlrd_book.get_sheet(0) self.assertEqual(3, sheet.nrows - 1) # Second sheet - services sheet = xlrd_book.get_sheet(1) self.assertEqual(3, sheet.nrows - 1)
def test_staff_add_providers(self): # Remember, only one provider per user self.user.is_staff = True self.user.save() type1 = ProviderTypeFactory() provider1 = ProviderFactory.build(type=type1, user=self.user) # Doesn't save user2 = EmailUserFactory() type2 = ProviderTypeFactory() provider2 = ProviderFactory.build(type=type2, user=user2) # Doesn't save book = get_export_workbook([provider1, provider2]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) self.assertTrue( Provider.objects.filter(name_en=provider1.name_en).exists()) self.assertTrue( Provider.objects.filter(name_en=provider2.name_en).exists())
def test_staff_delete_provider(self): # Staff may delete providers self.user.is_staff = True self.user.save() provider = ProviderFactory() book = get_export_workbook([provider], cell_overwrite_ok=True) blank_out_row_for_testing(book, sheet_num=0, row_num=1) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) self.assertFalse(Provider.objects.filter(id=provider.id).exists())
def test_provider_change_password(self): # Providers can change their password provider = ProviderFactory(user=self.user) book = get_export_workbook([provider], cell_overwrite_ok=True) password_column = PROVIDER_HEADINGS.index('password') set_cell_value(book, 0, 1, password_column, 'new_password') rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) user = authenticate(email=provider.user.email, password='******') self.assertEqual(user, self.user)
def test_staff_add_provider(self): type = ProviderTypeFactory() self.user.is_staff = True self.user.save() provider = ProviderFactory.build(type=type, user=self.user) # Doesn't save self.assertFalse(provider.id) book = get_export_workbook([provider]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) self.assertTrue(Provider.objects.filter(name_en=provider.name_en).exists())
def test_location_exported_as_lat_long(self): provider = ProviderFactory() service1 = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) book = get_export_workbook_for_user(provider.user) xlrd_book = save_and_read_book(book) sheet = xlrd_book.get_sheet(1) values = sheet.row_values(1) data = dict(zip(SERVICE_HEADINGS, values)) self.assertEqual(service1.longitude, data['longitude']) self.assertEqual(service1.latitude, data['latitude'])
def test_provider_delete_provider(self): # A provider cannot delete themselves provider = ProviderFactory(user=self.user) book = get_export_workbook([provider], cell_overwrite_ok=True) blank_out_row_for_testing(book, sheet_num=0, row_num=1) rsp = self.import_book(book) self.assertContains(rsp, "Only staff may delete providers", status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_provider_add_criterion_bad_service(self): provider = ProviderFactory(user=self.user) criterion1 = SelectionCriterionFactory.build() service = criterion1.service book = get_export_workbook([provider], None, [criterion1]) rsp = self.import_book(book) self.assertContains( rsp, "Row 2: service__id: Selection criterion refers to service with ID " "or name '%s' that is not in the 2nd sheet" % service.name_en, status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_open_close_as_hh_mm(self): provider = ProviderFactory() ServiceFactory(provider=provider, status=Service.STATUS_CURRENT, wednesday_close=time(18, 23) ) book = get_export_workbook_for_user(provider.user) xlrd_book = save_and_read_book(book) sheet = xlrd_book.get_sheet(1) values = sheet.row_values(1) data = dict(zip(SERVICE_HEADINGS, values)) self.assertEqual('', data['sunday_open']) self.assertEqual('18:23', data['wednesday_close'])
def test_provider_delete_another_provider(self): # A provider cannot delete others provider = ProviderFactory() book = get_export_workbook([provider], cell_overwrite_ok=True) blank_out_row_for_testing(book, sheet_num=0, row_num=1) rsp = self.import_book(book) self.assertContains( rsp, "provider: %d is not a provider this user may delete" % provider.id, status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_staff_add_provider(self): type = ProviderTypeFactory() self.user.is_staff = True self.user.save() provider = ProviderFactory.build(type=type, user=self.user) # Doesn't save self.assertFalse(provider.id) book = get_export_workbook([provider]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) self.assertTrue( Provider.objects.filter(name_en=provider.name_en).exists())
def test_provider_bad_criterion_id(self): provider = ProviderFactory(user=self.user) service = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) criterion1 = SelectionCriterionFactory.build(service=service) criterion1.id = 'abc' book = get_export_workbook([provider], None, [criterion1]) rsp = self.import_book(book) self.assertContains(rsp, "Row 2: id: %s is not a valid ID" % criterion1.id, status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_staff_change_providers(self): # Staff can change multiple providers self.user.is_staff = True self.user.save() provider1 = ProviderFactory() provider2 = ProviderFactory() name_fields = generate_translated_fields('name', False) # Tweak some data for field in name_fields: setattr(provider1, field, random_string(10)) provider2.number_of_monthly_beneficiaries = 1024 provider2.type = ProviderTypeFactory() book = get_export_workbook([provider1, provider2]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) new_provider1 = Provider.objects.get(id=provider1.id) for field in name_fields: self.assertEqual(getattr(provider1, field), getattr(new_provider1, field)) new_provider2 = Provider.objects.get(id=provider2.id) self.assertEqual(provider2.number_of_monthly_beneficiaries, new_provider2.number_of_monthly_beneficiaries)
def test_staff_add_bad_provider(self): type = ProviderTypeFactory() self.user.is_staff = True self.user.save() provider = ProviderFactory.build(type=type, user=self.user, number_of_monthly_beneficiaries=-1) # Doesn't save self.assertFalse(provider.id) book = get_export_workbook([provider]) rsp = self.import_book(book) self.assertContains(rsp, "Row 2: number_of_monthly_beneficiaries: Ensure this value is " "greater than or equal to 0.", status_code=BAD_REQUEST)
def test_provider_change_own_data(self): # Non-staff can change their own provider provider = ProviderFactory(user=self.user) name_fields = generate_translated_fields('name', False) # Tweak some data for field in name_fields: setattr(provider, field, random_string(10)) book = get_export_workbook([provider]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) new_provider = Provider.objects.get(id=provider.id) for field in name_fields: self.assertEqual(getattr(provider, field), getattr(new_provider, field))
def test_provider_change_nonexistent_criterion(self): provider = ProviderFactory(user=self.user) service = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) criterion1 = SelectionCriterionFactory(service=service) book = get_export_workbook([provider], None, [criterion1]) crit_id = criterion1.id criterion1.delete() rsp = self.import_book(book) self.assertContains(rsp, "Row 2: id: No selection criterion with id = %s" % crit_id, status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_staff_add_bad_provider(self): type = ProviderTypeFactory() self.user.is_staff = True self.user.save() provider = ProviderFactory.build( type=type, user=self.user, number_of_monthly_beneficiaries=-1) # Doesn't save self.assertFalse(provider.id) book = get_export_workbook([provider]) rsp = self.import_book(book) self.assertContains( rsp, "Row 2: number_of_monthly_beneficiaries: Ensure this value is " "greater than or equal to 0.", status_code=BAD_REQUEST)
def test_staff_add_services(self): # Staff can add services to any provider self.user.is_staff = True self.user.save() provider = ProviderFactory() type = ServiceTypeFactory() area = ServiceAreaFactory() service = ServiceFactory.build(provider=provider, type=type, area_of_service=area) book = get_export_workbook([provider], [service]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) new_service = Service.objects.get(name_en=service.name_en) self.assertEqual(new_service.name_en, service.name_en)
def test_provider_bad_criteria(self): provider = ProviderFactory(user=self.user) service = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) criterion1 = SelectionCriterionFactory(service=service) criterion2 = SelectionCriterionFactory(service=service) # Change the 2nd one's text before exporting criterion2.text_en = criterion2.text_ar = criterion2.text_fr = '' book = get_export_workbook([provider], None, [criterion1, criterion2]) rsp = self.import_book(book) self.assertContains( rsp, "Selection criterion must have text in at least one language", status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_provider_bad_criteria(self): provider = ProviderFactory(user=self.user) service = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) criterion1 = SelectionCriterionFactory(service=service) criterion2 = SelectionCriterionFactory(service=service) # Change the 2nd one's text before exporting for field in generate_translated_fields('text', False): setattr(criterion2, field, '') book = get_export_workbook([provider], None, [criterion1, criterion2]) rsp = self.import_book(book) self.assertContains( rsp, "Selection criterion must have text in at least one language", status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_provider_change_service(self): # A provider can change their existing service provider = ProviderFactory(user=self.user) type = ServiceTypeFactory() area = ServiceAreaFactory() service = ServiceFactory(provider=provider, type=type, area_of_service=area) service.name_en = 'Radiator Repair' service.name_fr = 'Le Marseilles' book = get_export_workbook([provider], [service]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) new_service = Service.objects.get(id=service.id) self.assertEqual(service.name_en, new_service.name_en) self.assertEqual(service.name_fr, new_service.name_fr)
def test_staff_change_nonexistent_provider(self): # Staff can change another user's provider self.user.is_staff = True self.user.save() provider = ProviderFactory() # Tweak some data provider.name_en = 'Jim-Bob' provider.name_ar = 'Ahmed-Bob' provider.name_fr = 'Pierre-Bob' book = get_export_workbook([provider]) provider_id = provider.id provider.delete() rsp = self.import_book(book) self.assertContains(rsp, "There is no provider with id=%d" % provider_id, status_code=BAD_REQUEST, msg_prefix=rsp.content.decode('utf-8'))
def test_staff_change_providers(self): # Staff can change multiple providers self.user.is_staff = True self.user.save() provider1 = ProviderFactory() provider2 = ProviderFactory() # Tweak some data provider1.name_en = 'Jim-Bob' provider1.name_ar = 'Ahmed-Bob' provider1.name_fr = 'Pierre-Bob' provider2.number_of_monthly_beneficiaries = 1024 provider2.type = ProviderTypeFactory() book = get_export_workbook([provider1, provider2]) rsp = self.import_book(book) self.assertEqual(OK, rsp.status_code, msg=rsp.content.decode('utf-8')) new_provider1 = Provider.objects.get(id=provider1.id) self.assertEqual(provider1.name_en, new_provider1.name_en) self.assertEqual(provider1.name_ar, new_provider1.name_ar) self.assertEqual(provider1.name_fr, new_provider1.name_fr) new_provider2 = Provider.objects.get(id=provider2.id) self.assertEqual(provider2.number_of_monthly_beneficiaries, new_provider2.number_of_monthly_beneficiaries)