def test_upload_too_small(self, mock_get, mock_delete, mock_upload, mock_connection): mock_get.return_value = create_mock_draft_file() # File already exists mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'baz' # Attempt to upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, name=filename) res = self.app.put( url, params=content, auth=self.user.auth, headers={'Content-Type': 'application/octet-stream'}, expect_errors=True, ) # Old file was not deleted assert_false(mock_delete.call_count) # Bad request assert_equal(res.status_code, http.UNSUPPORTED_MEDIA_TYPE) assert_false(mock_upload.call_count)
def test_upload_existing(self, mock_get_by_id, mock_get, mock_delete, mock_upload, mock_connection): mock_get.return_value = create_mock_draft_file() # File already exists mock_get_by_id.return_value = None # To confirm deletion happened mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'bazbaz' # Attempt to upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, name=filename) res = self.app.put( url, params=content, auth=self.user.auth, headers={'Content-Type': 'application/octet-stream'}, ) # Old file was deleted mock_delete.assert_called_once() # File was uploaded assert_equal(res.status_code, http.OK) mock_upload.assert_called_once() # Parameters are correct assert_equal(self.node_settings.study_hdl, mock_upload.call_args[0][0].doi) assert_equal(filename, mock_upload.call_args[0][1]) assert_equal(content, mock_upload.call_args[0][2])
def test_upload_too_small(self, mock_get, mock_delete, mock_upload, mock_connection): mock_get.return_value = create_mock_draft_file() # File already exists mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'baz' path = '54321' payload = {'file': Upload(filename, content, 'text/x-rst')} # Attempt to upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, path=path) res = self.app.post(url, payload, auth=self.user.auth, expect_errors=True) # Old file was not deleted assert_false(mock_delete.call_count) # Bad request assert_equal(res.status_code, http.UNSUPPORTED_MEDIA_TYPE) assert_false(mock_upload.call_count)
def test_upload_existing(self, mock_get_by_id, mock_get, mock_delete, mock_upload, mock_connection): mock_get.return_value = create_mock_draft_file() # File already exists mock_get_by_id.return_value = None # To confirm deletion happened mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'bazbaz' path = '54321' payload = {'file': Upload(filename, content,'text/x-rst')} # Attempt to upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, path=path) res = self.app.post(url, payload, auth=self.user.auth) # Old file was deleted mock_delete.assert_called_once # File was uploaded assert_equal(res.status_code, http.CREATED) mock_upload.assert_called_once # Parameters are correct assert_equal(self.node_settings.study_hdl, mock_upload.call_args[0][0].doi) assert_equal(filename, mock_upload.call_args[0][1]) assert_equal(content, mock_upload.call_args[0][2]) assert_equal('file_updated', json.loads(res.body)['actionTaken'])
def test_fail_if_unauthorized_forbidden(self, mock_get_files, mock_connection): mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] with assert_raises(HTTPError) as error: fail_if_unauthorized(self.node_settings, self.user.auth, 'bar') assert_equal(error.code, http.FORBIDDEN)
def test_upload_existing(self, mock_get_by_id, mock_get, mock_delete, mock_upload, mock_connection): mock_get.return_value = create_mock_draft_file() # File already exists mock_get_by_id.return_value = None # To confirm deletion happened mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'bazbaz' path = '54321' payload = {'file': Upload(filename, content, 'text/x-rst')} # Attempt to upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, path=path) res = self.app.post(url, payload, auth=self.user.auth) # Old file was deleted mock_delete.assert_called_once # File was uploaded assert_equal(res.status_code, http.CREATED) mock_upload.assert_called_once # Parameters are correct assert_equal(self.node_settings.study_hdl, mock_upload.call_args[0][0].doi) assert_equal(filename, mock_upload.call_args[0][1]) assert_equal(content, mock_upload.call_args[0][2]) assert_equal('file_updated', json.loads(res.body)['actionTaken'])
def test_dataverse_view_file(self, mock_fail_if_private, mock_get_files, mock_connection, mock_get_content, mock_scrape): mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] mock_get_content.return_value = 'contents' mock_scrape.return_value = ('filename', 'whatever') url = self.project.web_url_for('dataverse_view_file', path='foo') res = self.app.get(url, auth=self.user.auth).follow(auth=self.user.auth) assert_true(mock_connection.called) assert_true(mock_get_files.called) assert_equal(res.status_code, 200)
def test_download_file(self, mock_fail_if_private, mock_get_files, mock_connection): mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] path = 'foo' url = web_url_for('dataverse_download_file', pid=self.project._primary_key, path=path) res = self.app.get(url, auth=self.user.auth) assert_equal( res.headers.get('location'), 'http://{0}/dvn/FileDownload/?fileId={1}'.format(HOST, path), )
def test_dataverse_view_file_with_anonymous_link(self, mock_fail_if_private, mock_get_files, mock_connection, mock_scrape): link = PrivateLinkFactory(anonymous=True) link.nodes.append(self.project) link.save() mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] mock_scrape.return_value = ('filename', 'content') url = self.project.api_url_for('dataverse_get_file_info', path='foo') res = self.app.get(url, {'view_only': link.key}).maybe_follow() assert_equal(res.status_code, 200) assert_not_in(self.node_settings.dataverse_alias, res.body) assert_not_in(self.node_settings.dataverse, res.body) assert_not_in(self.node_settings.study, res.body)
def test_dataverse_get_file_info_returns_filename_and_links(self, mock_fail_if_private, mock_get_files, mock_connection, mock_scrape): mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] mock_scrape.return_value = ('filename', 'content') delete_url = self.project.api_url_for('dataverse_delete_file', path='foo') files_url = self.project.web_url_for('collect_file_trees') url = self.project.api_url_for('dataverse_get_file_info', path='foo') res = self.app.get(url, auth=self.user.auth).maybe_follow(auth=self.user.auth) assert_equal(res.status_code, 200) assert_true(mock_connection.called) assert_true(mock_get_files.called) assert_in(self.project._id, res.json['data']['node']['id']) assert_in(self.project.title, res.json['data']['node']['title']) assert_in(mock_scrape()[0], res.json['data']['filename']) assert_in(delete_url, res.json['data']['urls']['delete']) assert_in(files_url, res.json['data']['urls']['files'])
def test_upload_too_small(self, mock_get, mock_delete, mock_upload, mock_connection): mock_get.return_value = create_mock_draft_file() # File already exists mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'baz' path = '54321' payload = {'file': Upload(filename, content,'text/x-rst')} # Attempt to upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, path=path) res = self.app.post(url, payload, auth=self.user.auth, expect_errors=True) # Old file was not deleted assert_false(mock_delete.call_count) # Bad request assert_equal(res.status_code, http.UNSUPPORTED_MEDIA_TYPE) assert_false(mock_upload.call_count)
def test_mock_dvn_file(self): fid = '65432' mock_file = create_mock_draft_file(fid) assert_equal(mock_file.name, 'file.txt') assert_equal(mock_file.id, fid) assert_is_instance(mock_file, DataverseFile)
class TestDataverseViewsCrud(DataverseAddonTestCase): @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.delete_file') @mock.patch('website.addons.dataverse.views.crud.get_file_by_id', side_effect=[create_mock_draft_file('54321'), None]) def test_delete_file(self, mock_get, mock_delete, mock_connection): mock_get.return_value = None mock_connection.return_value = create_mock_connection() path = '54321' url = api_url_for('dataverse_delete_file', pid=self.project._primary_key, path=path) res = self.app.delete(url=url, auth=self.user.auth) mock_delete.assert_called_once assert_equal(path, mock_delete.call_args[0][0].id) @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.upload_file') @mock.patch('website.addons.dataverse.views.crud.get_file', side_effect=[None, create_mock_draft_file()]) def test_upload_file(self, mock_get, mock_upload, mock_connection): mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'bazbaz' path = '54321' payload = {'file': Upload(filename, content, 'text/x-rst')} # Upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, path=path) res = self.app.post(url, payload, auth=self.user.auth) # File was uploaded assert_equal(res.status_code, http.CREATED) mock_upload.assert_called_once # Parameters are correct assert_equal(self.node_settings.study_hdl, mock_upload.call_args[0][0].doi) assert_equal(filename, mock_upload.call_args[0][1]) assert_equal(content, mock_upload.call_args[0][2]) assert_equal('file_uploaded', json.loads(res.body)['actionTaken']) @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.upload_file') @mock.patch('website.addons.dataverse.views.crud.delete_file') @mock.patch('website.addons.dataverse.views.crud.get_file') @mock.patch('website.addons.dataverse.views.crud.get_file_by_id') def test_upload_existing(self, mock_get_by_id, mock_get, mock_delete, mock_upload, mock_connection): mock_get.return_value = create_mock_draft_file() # File already exists mock_get_by_id.return_value = None # To confirm deletion happened mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'bazbaz' path = '54321' payload = {'file': Upload(filename, content, 'text/x-rst')} # Attempt to upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, path=path) res = self.app.post(url, payload, auth=self.user.auth) # Old file was deleted mock_delete.assert_called_once # File was uploaded assert_equal(res.status_code, http.CREATED) mock_upload.assert_called_once # Parameters are correct assert_equal(self.node_settings.study_hdl, mock_upload.call_args[0][0].doi) assert_equal(filename, mock_upload.call_args[0][1]) assert_equal(content, mock_upload.call_args[0][2]) assert_equal('file_updated', json.loads(res.body)['actionTaken']) @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.upload_file') @mock.patch('website.addons.dataverse.views.crud.delete_file') @mock.patch('website.addons.dataverse.views.crud.get_file') def test_upload_too_small(self, mock_get, mock_delete, mock_upload, mock_connection): mock_get.return_value = create_mock_draft_file() # File already exists mock_upload.return_value = {} mock_connection.return_value = create_mock_connection() # Define payload filename = 'myfile.rst' content = 'baz' path = '54321' payload = {'file': Upload(filename, content, 'text/x-rst')} # Attempt to upload the file url = api_url_for('dataverse_upload_file', pid=self.project._primary_key, path=path) res = self.app.post(url, payload, auth=self.user.auth, expect_errors=True) # Old file was not deleted assert_false(mock_delete.call_count) # Bad request assert_equal(res.status_code, http.UNSUPPORTED_MEDIA_TYPE) assert_false(mock_upload.call_count) @mock.patch('website.addons.dataverse.views.crud.scrape_dataverse') @mock.patch('website.addons.dataverse.views.crud.get_cache_content') @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.get_files') @mock.patch('website.addons.dataverse.views.crud.fail_if_private') def test_dataverse_view_file(self, mock_fail_if_private, mock_get_files, mock_connection, mock_get_content, mock_scrape): mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] mock_get_content.return_value = 'contents' mock_scrape.return_value = ('filename', 'whatever') url = self.project.web_url_for('dataverse_view_file', path='foo') res = self.app.get(url, auth=self.user.auth).follow(auth=self.user.auth) assert_true(mock_connection.called) assert_true(mock_get_files.called) assert_equal(res.status_code, 200) @mock.patch('website.addons.dataverse.views.crud.scrape_dataverse') @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.get_files') @mock.patch('website.addons.dataverse.views.crud.fail_if_private') def test_dataverse_view_file_with_anonymous_link(self, mock_fail_if_private, mock_get_files, mock_connection, mock_scrape): link = PrivateLinkFactory(anonymous=True) link.nodes.append(self.project) link.save() mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] mock_scrape.return_value = ('filename', 'content') url = self.project.api_url_for('dataverse_get_file_info', path='foo') res = self.app.get(url, {'view_only': link.key}).maybe_follow() assert_equal(res.status_code, 200) assert_not_in(self.node_settings.dataverse_alias, res.body) assert_not_in(self.node_settings.dataverse, res.body) assert_not_in(self.node_settings.study, res.body) @mock.patch('website.addons.dataverse.views.crud.scrape_dataverse') @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.get_files') def test_dataverse_get_file_info_returns_filename_and_links( self, mock_get_files, mock_connection, mock_scrape): mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] mock_scrape.return_value = ('filename', 'content') delete_url = self.project.api_url_for('dataverse_delete_file', path='foo') files_url = self.project.web_url_for('collect_file_trees') url = self.project.api_url_for('dataverse_get_file_info', path='foo') res = self.app.get( url, auth=self.user.auth).maybe_follow(auth=self.user.auth) assert_equal(res.status_code, 200) assert_true(mock_connection.called) assert_true(mock_get_files.called) assert_in(self.project._id, res.json['data']['node']['id']) assert_in(self.project.title, res.json['data']['node']['title']) assert_in(mock_scrape()[0], res.json['data']['filename']) assert_in(delete_url, res.json['data']['urls']['delete']) assert_in(files_url, res.json['data']['urls']['files']) @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.get_files') @mock.patch('website.addons.dataverse.views.crud.fail_if_private') def test_download_file(self, mock_fail_if_private, mock_get_files, mock_connection): mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] path = 'foo' url = web_url_for('dataverse_download_file', pid=self.project._primary_key, path=path) res = self.app.get(url, auth=self.user.auth) assert_equal( res.headers.get('location'), 'http://{0}/dvn/FileDownload/?fileId={1}'.format(HOST, path), ) @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.release_study') def test_dataverse_release_study(self, mock_release, mock_connection): mock_connection.return_value = create_mock_connection() url = api_url_for('dataverse_release_study', pid=self.project._primary_key) res = self.app.put(url, auth=self.user.auth) assert_true(mock_release.called) @mock.patch('website.addons.dataverse.views.crud.get_cache_content') def test_render_file(self, mock_get_cache): mock_get_cache.return_value = 'Mockument (A mock document)' file_id = '23456' url = api_url_for('dataverse_get_rendered_file', pid=self.project._primary_key, path=file_id) res = self.app.get(url, auth=self.user.auth) assert_equal(mock_get_cache.call_args[0][1], '{0}.html'.format(file_id)) def test_fail_if_unauthorized_not_found(self): with assert_raises(HTTPError) as error: fail_if_unauthorized(self.node_settings, self.user.auth, None) assert_equal(error.code, http.NOT_FOUND) @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.get_files') def test_fail_if_unauthorized_forbidden(self, mock_get_files, mock_connection): mock_connection.return_value = create_mock_connection() mock_get_files.return_value = [create_mock_draft_file('foo')] with assert_raises(HTTPError) as error: fail_if_unauthorized(self.node_settings, self.user.auth, 'bar') assert_equal(error.code, http.FORBIDDEN) @mock.patch( 'website.addons.dataverse.views.crud.connect_from_settings_or_403') @mock.patch('website.addons.dataverse.views.crud.get_files', side_effect=[[create_mock_draft_file('released')], [create_mock_draft_file('draft')]]) def test_fail_if_unauthorized_unauthorized(self, mock_get_files, mock_connection): with assert_raises(HTTPError) as error: user2 = AuthUserFactory() fail_if_unauthorized(self.node_settings, Auth(user2), 'draft') assert_equal(error.code, http.UNAUTHORIZED)