예제 #1
0
 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)
예제 #2
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"])
예제 #3
0
 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))
예제 #4
0
 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))
예제 #5
0
 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()))
예제 #6
0
 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)
예제 #7
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)
예제 #8
0
 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)
예제 #9
0
 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)