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_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_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_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_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_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_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_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_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_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_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_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)
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_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_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_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_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_staff_change_provider_invalid_id(self): 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], 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_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_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_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_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]) 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_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_provider_add_bad_service(self): provider = ProviderFactory(user=self.user) type = ServiceTypeFactory() area = ServiceAreaFactory() service = ServiceFactory.build(provider=provider, type=type, area_of_service=area, name_en=VERY_LONG_STRING, tuesday_open=time(6, 59), tuesday_close=time(21, 2)) self.assertIsNotNone(service.location) criterion = SelectionCriterionFactory.build(service=service) book = get_export_workbook([provider], [service], [criterion]) rsp = self.import_book(book) self.assertEqual(BAD_REQUEST, rsp.status_code, msg=rsp.content.decode('utf-8'))
def test_provider_change_nonexistent_service(self): 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]) service_id = service.id service.delete() rsp = self.import_book(book) self.assertContains(rsp, "%d is not a service this user may import" % service_id, status_code=BAD_REQUEST)