def test_bad_criteria_headers(self): with patch('services.import_export.SELECTION_CRITERIA_HEADINGS' ) as headings: headings[:] = ['foo', 'bar'] xlwt_book = make_empty_book() errs = validate_and_import_data(self.user, get_book_bits(xlwt_book)) self.assertTrue(errs)
def validate(self, attrs): user = self.context['request'].user data = attrs['file'].read() errs = validate_and_import_data(user, data) if errs: raise DRFValidationError(errs) return attrs
def test_too_many_sheets(self): xlwt_book = xlwt.Workbook(encoding='utf-8') xlwt_book.add_sheet(PROVIDER_SHEET_NAME) xlwt_book.add_sheet(SERVICES_SHEET_NAME) xlwt_book.add_sheet(PROVIDER_SHEET_NAME + 'b') xlwt_book.add_sheet(SERVICES_SHEET_NAME + 'b') errs = validate_and_import_data(self.user, get_book_bits(xlwt_book)) self.assertTrue(errs)
def test_empty_book(self): # A book with just 3 empty sheets should not validate xlwt_book = xlwt.Workbook(encoding='utf-8') xlwt_book.add_sheet('x' + PROVIDER_SHEET_NAME) xlwt_book.add_sheet(SERVICES_SHEET_NAME) xlwt_book.add_sheet(SELECTION_CRITERIA_SHEET_NAME) errs = validate_and_import_data(self.user, get_book_bits(xlwt_book)) self.assertTrue(errs)
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_bad_provider_sheet_name(self): # Wrong sheet name should not validate xlwt_book = xlwt.Workbook(encoding='utf-8') provider_sheet = xlwt_book.add_sheet('x' + PROVIDER_SHEET_NAME) add_models_to_sheet(provider_sheet, PROVIDER_HEADINGS, []) service_sheet = xlwt_book.add_sheet(SERVICES_SHEET_NAME) add_models_to_sheet(service_sheet, SERVICE_HEADINGS, []) criteria_sheet = xlwt_book.add_sheet(SELECTION_CRITERIA_SHEET_NAME) add_models_to_sheet(criteria_sheet, SELECTION_CRITERIA_HEADINGS, []) errs = validate_and_import_data(self.user, get_book_bits(xlwt_book)) self.assertTrue(errs)
def test_not_spreadsheet(self): errs = validate_and_import_data(self.user, b'I am not a spreadsheet') self.assertTrue(errs)
def test_random_data(self): provider = ProviderFactory() service1 = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) service2 = ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) ServiceFactory(provider=provider, status=Service.STATUS_CURRENT) # Some additional services that should not show up ServiceFactory(status=Service.STATUS_CURRENT) # not one of the providers we want ServiceFactory(provider=provider, status=Service.STATUS_DRAFT) # Draft mode SelectionCriterionFactory(service=service1) SelectionCriterionFactory(service=service2) SelectionCriterionFactory() # unwanted service # Querysets of just the objects we expect to be exported providers = Provider.objects.order_by('id') services = Service.objects.filter(status=Service.STATUS_CURRENT, provider__in=providers).order_by('id') criteria = SelectionCriterion.objects.filter(service__status=Service.STATUS_CURRENT, service__provider__in=providers).order_by('id') xlwt_book = get_export_workbook(providers) book = save_and_read_book(xlwt_book) # First sheet - providers sheet = book.get_sheet(0) self.assertEqual(providers.count(), sheet.nrows - 1) self.assertEqual(PROVIDER_HEADINGS, sheet.row_values(0)) for i, rownum in enumerate(range(1, sheet.nrows)): values = sheet.row_values(rownum) provider = providers[i] data = dict(zip(PROVIDER_HEADINGS, values)) self.assertEqual(provider.id, data['id']) self.assertEqual(provider.name_ar, data['name_ar']) # Second sheet = services sheet = book.get_sheet(1) self.assertEqual(services.count(), sheet.nrows - 1) self.assertEqual(SERVICE_HEADINGS, sheet.row_values(0)) for i, rownum in enumerate(range(1, sheet.nrows)): values = sheet.row_values(rownum) service = services[i] data = dict(zip(SERVICE_HEADINGS, values)) self.assertEqual(service.id, data['id']) self.assertEqual(service.name_ar, data['name_ar']) provider = Provider.objects.get(id=data['provider__id']) self.assertEqual(provider, service.provider) # Third sheet - selection criteria sheet = book.get_sheet(2) self.assertEqual(SELECTION_CRITERIA_HEADINGS, sheet.row_values(0)) self.assertEqual(criteria.count(), sheet.nrows - 1) for i, rownum in enumerate(range(1, sheet.nrows)): values = sheet.row_values(rownum) criterion = criteria[i] data = dict(zip(SELECTION_CRITERIA_HEADINGS, values)) self.assertEqual(criterion.id, data['id']) self.assertEqual(criterion.text_ar, data['text_ar']) service = Service.objects.get(id=data['service__id']) self.assertEqual(service, criterion.service) # The exported workbook should also be valid for import by # a staff user user = EmailUserFactory(is_staff=True) validate_and_import_data(user, get_book_bits(xlwt_book))
def test_headers_only_book(self): # An book with only headers should validate xlwt_book = make_empty_book() errs = validate_and_import_data(self.user, get_book_bits(xlwt_book)) self.assertFalse(errs)
def test_bad_provider_headers(self): with patch('services.import_export.PROVIDER_HEADINGS') as headings: headings[:] = ['foo', 'bar'] xlwt_book = make_empty_book() errs = validate_and_import_data(self.user, get_book_bits(xlwt_book)) self.assertTrue(errs)
def test_bad_criteria_headers(self): with patch('services.import_export.SELECTION_CRITERIA_HEADINGS') as headings: headings[:] = ['foo', 'bar'] xlwt_book = make_empty_book() errs = validate_and_import_data(self.user, get_book_bits(xlwt_book)) self.assertTrue(errs)