def test_delete_oldest_export_on_limit(self): self._publish_transportation_form() self._submit_transport_instance() # create first export first_export = create_xls_export( self.user.username, self.xform.id_string) self.assertTrue(first_export.pk>0) # create exports that exceed set limit for i in range(Export.MAX_EXPORTS): create_xls_export( self.user.username, self.xform.id_string) # first export should be deleted exports = Export.objects.filter(id=first_export.id) self.assertEqual(len(exports), 0)
def test_export_progress_updates(self): """ Test that after generate_export is called, we change out state to pending and after its complete, we change it to complete, if we fail between the two, updates, we have failed """ self._publish_transportation_form() # generate an export that fails because of the NoRecordsFound exception export = Export.objects.create(xform=self.xform, export_type=Export.XLS_EXPORT) # check that progress url says pending progress_url = reverse(export_progress, kwargs={ 'username': self.user.username, 'id_string': self.xform.id_string, 'export_type': 'xls' }) params = {'export_ids': [export.id]} response = self.client.get(progress_url, params) status = json.loads(response.content)[0] self.assertEqual(status["complete"], False) self.assertEqual(status["filename"], None) try: create_xls_export( self.user.username, self.xform.id_string, export.id) except NoRecordsFoundError: pass # check that progress url says failed progress_url = reverse(export_progress, kwargs={ 'username': self.user.username, 'id_string': self.xform.id_string, 'export_type': 'xls' }) params = {'export_ids': [export.id]} response = self.client.get(progress_url, params) status = json.loads(response.content)[0] self.assertEqual(status["complete"], True) self.assertEqual(status["filename"], None) # make a submission and create a valid export self._submit_transport_instance() create_xls_export( self.user.username, self.xform.id_string, export.id) params = {'export_ids': [export.id]} response = self.client.get(progress_url, params) status = json.loads(response.content)[0] self.assertEqual(status["complete"], True) self.assertIsNotNone(status["filename"])
def test_delete_file_on_export_delete(self): self._publish_transportation_form() self._submit_transport_instance() export = create_xls_export( self.user.username, self.xform.id_string) storage = get_storage_class()() self.assertTrue(storage.exists(export.filepath)) # delete export object export.delete() self.assertFalse(storage.exists(export.filepath))
def test_last_submission_time_empty(self): self._publish_transportation_form() self._submit_transport_instance() # create export export = create_xls_export( self.user.username, self.xform.id_string) # set time of last submission to None export.time_of_last_submission = None export.save() self.assertTrue(Export.exports_outdated(xform=self.xform, export_type=Export.XLS_EXPORT))
def test_export_progress_output(self): self._publish_transportation_form() self._submit_transport_instance() # create exports for i in range(2): create_xls_export( self.user.username, self.xform.id_string) self.assertEqual(Export.objects.count(), 2) # progress for multiple exports progress_url = reverse(export_progress, kwargs={ 'username': self.user.username, 'id_string': self.xform.id_string, 'export_type': 'xls' }) get_data = {'export_ids': [e.id for e in Export.objects.all()]} response = self.client.get(progress_url, get_data) content = json.loads(response.content) self.assertEqual(len(content), 2) self.assertEqual(sorted(['url', 'export_id', 'complete', 'filename']), sorted(content[0].keys()))
def test_delete_export_url(self): self._publish_transportation_form() self._submit_transport_instance() # create export export = create_xls_export( self.user.username, self.xform.id_string) exports = Export.objects.filter(id=export.id) self.assertEqual(len(exports), 1) delete_url = reverse(delete_export, kwargs={ 'username': self.user.username, 'id_string': self.xform.id_string, 'export_type': 'xls' }) post_data = {'export_id': export.id} response = self.client.post(delete_url, post_data) self.assertEqual(response.status_code, 302) exports = Export.objects.filter(id=export.id) self.assertEqual(len(exports), 0)
def test_graceful_exit_on_export_delete_if_file_doesnt_exist(self): self._publish_transportation_form() self._submit_transport_instance() export = create_xls_export( self.user.username, self.xform.id_string) storage = get_storage_class()() # delete file storage.delete(export.filepath) self.assertFalse(storage.exists(export.filepath)) # clear filename, like it would be in an incomplete export export.filename = None export.filedir = None export.save() # delete export record, which should try to delete file as well delete_url = reverse(delete_export, kwargs={ 'username': self.user.username, 'id_string': self.xform.id_string, 'export_type': 'xls' }) post_data = {'export_id': export.id} response = self.client.post(delete_url, post_data) self.assertEqual(response.status_code, 302)
def test_last_submission_time_on_export(self): self._publish_transportation_form() self._submit_transport_instance() # create export xls_export = create_xls_export( self.user.username, self.xform.id_string) num_exports = Export.objects.filter(xform=self.xform, export_type=Export.XLS_EXPORT).count() # check that our function knows there are no more submissions self.assertFalse(Export.exports_outdated(xform=self.xform, export_type=Export.XLS_EXPORT)) # force new last submission date on xform last_submission = self.xform.surveys.order_by('-date_created')[0] last_submission.date_created += datetime.timedelta(hours=1) last_submission.save() # check that our function knows data has changed self.assertTrue(Export.exports_outdated(xform=self.xform, export_type=Export.XLS_EXPORT)) # check that requesting list url will generate a new export export_list_url = reverse(export_list, kwargs={ 'username': self.user.username, 'id_string': self.xform.id_string, 'export_type': Export.XLS_EXPORT }) response = self.client.get(export_list_url) self.assertEqual(Export.objects.filter(xform=self.xform, export_type=Export.XLS_EXPORT).count(), num_exports + 1) # make sure another export type causes auto-generation num_exports = Export.objects.filter(xform=self.xform, export_type=Export.CSV_EXPORT).count() export_list_url = reverse(export_list, kwargs={ 'username': self.user.username, 'id_string': self.xform.id_string, 'export_type': Export.CSV_EXPORT }) response = self.client.get(export_list_url) self.assertEqual(Export.objects.filter(xform=self.xform, export_type=Export.CSV_EXPORT).count(), num_exports + 1)
def test_export_download_url(self): self._publish_transportation_form() self._submit_transport_instance() export = create_csv_export(username=self.user.username, id_string=self.xform.id_string) csv_export_url = reverse(export_download, kwargs={ "username": self.user.username, "id_string": self.xform.id_string, "export_type": Export.CSV_EXPORT, "filename": export.filename }) response = self.client.get(csv_export_url) self.assertEqual(response.status_code, 200) # test xls export = create_xls_export(username=self.user.username, id_string=self.xform.id_string) xls_export_url = reverse(export_download, kwargs={ "username": self.user.username, "id_string": self.xform.id_string, "export_type": Export.XLS_EXPORT, "filename": export.filename }) response = self.client.get(xls_export_url) self.assertEqual(response.status_code, 200)