def test_wiki_deleted_shows_as_deleted(self): node = ProjectFactory(creator=self.user) node.delete_addon("wiki", auth=Auth(self.user)) results = AddonSnapshot().get_events() wiki_res = [res for res in results if res["provider"]["name"] == "wiki"][0] assert_equal(wiki_res["nodes"]["deleted"], 1)
def test_wiki_deleted_shows_as_deleted(self): node = ProjectFactory(creator=self.user) node.delete_addon('wiki', auth=Auth(self.user)) results = AddonSnapshot().get_events() wiki_res = [res for res in results if res['provider']['name'] == 'wiki'][0] assert_equal(wiki_res['nodes']['deleted'], 1)
def test_wiki_deleted_shows_as_deleted(self): node = ProjectFactory(creator=self.user) node.delete_addon('wiki', auth=Auth(self.user)) results = AddonSnapshot().get_events() wiki_res = [ res for res in results if res['provider']['name'] == 'wiki' ][0] assert_equal(wiki_res['nodes']['deleted'], 1)
class TestMustHaveAddonDecorator(AuthAppTestCase): def setUp(self): super(TestMustHaveAddonDecorator, self).setUp() self.project = ProjectFactory() @mock.patch('website.project.decorators._kwargs_to_nodes') def test_must_have_addon_node_true(self, mock_kwargs_to_nodes): mock_kwargs_to_nodes.return_value = (None, self.project) self.project.add_addon('github', auth=None) decorated = must_have_addon('github', 'node')(needs_addon_view) res = decorated() assert_equal(res, 'openaddon') @mock.patch('website.project.decorators._kwargs_to_nodes') def test_must_have_addon_node_false(self, mock_kwargs_to_nodes): mock_kwargs_to_nodes.return_value = (None, self.project) self.project.delete_addon('github', auth=None) decorated = must_have_addon('github', 'node')(needs_addon_view) with assert_raises(HTTPError): decorated() @mock.patch('framework.auth.decorators.Auth.from_kwargs') def test_must_have_addon_user_true(self, mock_current_user): mock_current_user.return_value = Auth(self.project.creator) self.project.creator.add_addon('github') decorated = must_have_addon('github', 'user')(needs_addon_view) res = decorated() assert_equal(res, 'openaddon') @mock.patch('framework.auth.decorators.Auth.from_kwargs') def test_must_have_addon_user_false(self, mock_current_user): mock_current_user.return_value = Auth(self.project.creator) self.project.creator.delete_addon('github') decorated = must_have_addon('github', 'user')(needs_addon_view) with assert_raises(HTTPError): decorated()
class TestMustHaveAddonDecorator(AuthAppTestCase): def setUp(self): super(TestMustHaveAddonDecorator, self).setUp() self.project = ProjectFactory() @mock.patch('website.project.decorators._kwargs_to_nodes') def test_must_have_addon_node_true(self, mock_kwargs_to_nodes): mock_kwargs_to_nodes.return_value = (None, self.project) self.project.add_addon('github', auth=None) decorated = must_have_addon('github', 'node')(needs_addon_view) res = decorated() assert_equal(res, 'openaddon') @mock.patch('website.project.decorators._kwargs_to_nodes') def test_must_have_addon_node_false(self, mock_kwargs_to_nodes): mock_kwargs_to_nodes.return_value = (None, self.project) self.project.delete_addon('github', auth=None) decorated = must_have_addon('github', 'node')(needs_addon_view) with assert_raises(HTTPError): decorated() @mock.patch('framework.auth.decorators.Auth.from_kwargs') def test_must_have_addon_user_true(self, mock_current_user): mock_current_user.return_value = Auth(self.project.creator) self.project.creator.add_addon('github') decorated = must_have_addon('github', 'user')(needs_addon_view) res = decorated() assert_equal(res, 'openaddon') @mock.patch('framework.auth.decorators.Auth.from_kwargs') def test_must_have_addon_user_false(self, mock_current_user): mock_current_user.return_value = Auth(self.project.creator) self.project.creator.delete_addon('github') decorated = must_have_addon('github', 'user')(needs_addon_view) with assert_raises(HTTPError): decorated()
class TestAddonFileViews(OsfTestCase): @classmethod def setUpClass(cls): super(TestAddonFileViews, cls).setUpClass() PROVIDER_MAP['github'] = [TestFolder, TestFile, TestFileNode] TestFileNode.provider = 'github' def setUp(self): super(TestAddonFileViews, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.user.add_addon('github') self.project.add_addon('github', auth=Auth(self.user)) self.user_addon = self.user.get_addon('github') self.node_addon = self.project.get_addon('github') self.oauth = AddonGitHubOauthSettings(github_user_id='denbarell', oauth_access_token='Truthy') self.oauth.save() self.user_addon.oauth_settings = self.oauth self.user_addon.save() self.node_addon.user_settings = self.user_addon self.node_addon.repo = 'Truth' self.node_addon.user = '******' self.node_addon.save() @classmethod def tearDownClass(cls): super(TestAddonFileViews, cls).tearDownClass() PROVIDER_MAP['github'] = [ models.GithubFolder, models.GithubFile, models.GithubFileNode ] del PROVIDER_MAP['test_addons'] def get_test_file(self): ret = TestFile(name='Test', node=self.project, path='/test/Test', materialized_path='/test/Test') ret.save() return ret def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'error': '', 'provider': '', 'file_path': '', 'sharejs_uuid': '', 'private': '', 'urls': { 'files': '', 'render': '', 'sharejs': '', 'mfr': '', 'gravatar': '', 'external': '', }, 'size': '', 'extra': '', 'file_name': '', 'materialized_path': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret def test_redirects_to_guid(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github'), auth=self.user.auth) assert_equals(resp.status_code, 302) assert_equals(resp.location, 'http://*****:*****@mock.patch('website.addons.base.views.addon_view_file') def test_action_view_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get('/{}/?action=view'.format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user, self.user) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) @mock.patch('website.addons.base.views.addon_view_file') def test_no_action_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get('/{}/'.format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user, self.user) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) def test_download_create_guid(self): file_node = self.get_test_file() assert_is(file_node.get_guid(), None) self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github', ), auth=self.user.auth) assert_true(file_node.get_guid()) def test_unauthorized_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download'), auth=self.user.auth, expect_errors=True) assert_equals(resp.status_code, 401) def test_nonstorage_addons_raise(self): resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path='sillywiki', provider='wiki', action='download'), auth=self.user.auth, expect_errors=True) assert_equals(resp.status_code, 400) def test_head_returns_url(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head('/{}/'.format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) assert_urls_equal(location.url, file_node.generate_waterbutler_url(direct=None)) def test_nonexistent_addons_raise(self): path = 'cloudfiles' self.project.delete_addon('github', Auth(self.user)) self.project.save() resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download'), auth=self.user.auth, expect_errors=True) assert_equals(resp.status_code, 400) def test_unauth_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download'), auth=self.user.auth, expect_errors=True) assert_equals(resp.status_code, 401)
class TestFileGuid(OsfTestCase): def setUp(self): super(OsfTestCase, self).setUp() self.user = UserFactory() self.project = ProjectFactory(creator=self.user) self.project.add_addon('dropbox', auth=Auth(self.user)) self.node_addon = self.project.get_addon('dropbox') self.node_addon.folder = '/baz' self.node_addon.save() def test_provider(self): assert_equal('dropbox', DropboxFile().provider) def test_correct_path(self): guid = DropboxFile(node=self.project, path='baz/foo/bar') assert_equals(guid.path, 'baz/foo/bar') assert_equals(guid.waterbutler_path, '/foo/bar') def test_path_doesnt_crash_without_addon(self): guid = DropboxFile(node=self.project, path='baz/foo/bar') self.project.delete_addon('dropbox', Auth(self.user)) assert_is(self.project.get_addon('dropbox'), None) assert_true(guid.path) assert_true(guid.waterbutler_path) def test_path_doesnt_crash_nonconfig_addon(self): guid = DropboxFile(node=self.project, path='baz/foo/bar') self.node_addon.folder = None self.node_addon.save() self.node_addon.reload() assert_true(guid.path) assert_true(guid.waterbutler_path) @mock.patch('website.addons.base.requests.get') def test_unique_identifier(self, mock_get): mock_response = mock.Mock(ok=True, status_code=200) mock_get.return_value = mock_response mock_response.json.return_value = { 'data': { 'name': 'Morty', 'extra': { 'revisionId': 'Ricksy' } } } guid = DropboxFile(node=self.project, path='/foo/bar') guid.enrich() assert_equals('Ricksy', guid.unique_identifier) def test_node_addon_get_or_create(self): guid, created = self.node_addon.find_or_create_file_guid('/foo/bar') assert_true(created) assert_equal(guid.path, 'baz/foo/bar') assert_equal(guid.waterbutler_path, '/foo/bar') def test_node_addon_get_or_create_finds(self): guid1, created1 = self.node_addon.find_or_create_file_guid('/foo/bar') guid2, created2 = self.node_addon.find_or_create_file_guid('/foo/bar') assert_true(created1) assert_false(created2) assert_equals(guid1, guid2) def test_node_addon_get_or_create_finds_changed(self): guid1, created1 = self.node_addon.find_or_create_file_guid('/foo/bar') self.node_addon.folder = '/baz/foo' self.node_addon.save() self.node_addon.reload() guid2, created2 = self.node_addon.find_or_create_file_guid('/bar') assert_true(created1) assert_false(created2) assert_equals(guid1, guid2)
class TestAddonFileViews(OsfTestCase): @classmethod def setUpClass(cls): super(TestAddonFileViews, cls).setUpClass() PROVIDER_MAP['github'] = [TestFolder, TestFile, TestFileNode] TestFileNode.provider = 'github' def setUp(self): super(TestAddonFileViews, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.user.add_addon('github') self.project.add_addon('github', auth=Auth(self.user)) self.user_addon = self.user.get_addon('github') self.node_addon = self.project.get_addon('github') self.oauth = AddonGitHubOauthSettings( github_user_id='denbarell', oauth_access_token='Truthy' ) self.oauth.save() self.user_addon.oauth_settings = self.oauth self.user_addon.save() self.node_addon.user_settings = self.user_addon self.node_addon.repo = 'Truth' self.node_addon.user = '******' self.node_addon.save() @classmethod def tearDownClass(cls): super(TestAddonFileViews, cls).tearDownClass() PROVIDER_MAP['github'] = [models.GithubFolder, models.GithubFile, models.GithubFileNode] del PROVIDER_MAP['test_addons'] def get_test_file(self): version = models.FileVersion(identifier='1') version.save() ret = TestFile( name='Test', node=self.project, path='/test/Test', materialized_path='/test/Test', versions=[version] ) ret.save() return ret def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'error': '', 'provider': '', 'file_path': '', 'sharejs_uuid': '', 'private': '', 'urls': { 'files': '', 'render': '', 'sharejs': '', 'mfr': '', 'gravatar': '', 'external': '', }, 'size': '', 'extra': '', 'file_name': '', 'materialized_path': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret def test_redirects_to_guid(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github' ), auth=self.user.auth ) assert_equals(resp.status_code, 302) assert_equals(resp.location, 'http://*****:*****@mock.patch('website.addons.base.views.addon_view_file') def test_action_view_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get('/{}/?action=view'.format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user._id, self.user._id) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) @mock.patch('website.addons.base.views.addon_view_file') def test_no_action_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get('/{}/'.format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user._id, self.user._id) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) def test_download_create_guid(self): file_node = self.get_test_file() assert_is(file_node.get_guid(), None) self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github', ), auth=self.user.auth ) assert_true(file_node.get_guid()) def test_unauthorized_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 401) def test_nonstorage_addons_raise(self): resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path='sillywiki', provider='wiki', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 400) def test_head_returns_url(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head('/{}/'.format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) assert_urls_equal(location.url, file_node.generate_waterbutler_url(direct=None, version=None)) def test_head_returns_url_with_version(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head('/{}/?revision=1&foo=bar'.format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) # Note: version is added but us but all other url params are added as well assert_urls_equal(location.url, file_node.generate_waterbutler_url(direct=None, revision=1, version=1, foo='bar')) def test_nonexistent_addons_raise(self): path = 'cloudfiles' self.project.delete_addon('github', Auth(self.user)) self.project.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 400) def test_unauth_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 401)
class TestFileGuid(OsfTestCase): def setUp(self): super(OsfTestCase, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.project.add_addon('figshare', auth=Auth(self.user)) self.node_addon = self.project.get_addon('figshare') self.node_addon.figshare_id = 8 self.node_addon.figshare_type = 'project' self.node_addon.save() def test_provider(self): assert_equal( 'figshare', model.FigShareGuidFile().provider ) def test_path_doesnt_crash_without_addon(self): guid = model.FigShareGuidFile(node=self.project, path='/baz/foo/bar') self.project.delete_addon('figshare', Auth(self.user)) assert_is(self.project.get_addon('figshare'), None) assert_true(guid.path) assert_true(guid.waterbutler_path) def test_path_doesnt_crash_nonconfig_addon(self): guid = model.FigShareGuidFile(node=self.project, path='/baz/foo/bar') self.node_addon.figshare_type = None self.node_addon.figshare_id = None self.node_addon.save() self.node_addon.reload() assert_true(guid.path) assert_true(guid.waterbutler_path) def test_correct_path_article(self): guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) guid._metadata_cache = {'name': 'shigfare.io'} tpath = guid.mfr_temp_path cpath = guid.mfr_cache_path assert_not_equal(tpath, cpath) def test_mfr_test_path(self): self.node_addon.figshare_type = 'fileset' self.node_addon.save() self.node_addon.reload() guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) assert_equal(guid.waterbutler_path, '/2') def test_correct_path_project(self): guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) assert_equal(guid.waterbutler_path, '/4/2') def test_unique_identifier(self): guid = model.FigShareGuidFile(file_id=2, article_id=4) assert_equal(guid.unique_identifier, '42') def test_exception_from_response(self): mock_response = mock.Mock() mock_response.json.return_value = { 'data': { 'name': 'Morty', 'extra': { 'status': 'drafts' } } } guid = model.FigShareGuidFile(file_id=2, article_id=4) with assert_raises(exceptions.FigshareIsDraftError): guid._exception_from_response(mock_response) assert_equal(guid.name, 'Morty') @mock.patch('website.addons.base.requests.get') def test_enrich_raises(self, mock_get): mock_response = mock.Mock(ok=True, status_code=200) mock_get.return_value = mock_response mock_response.json.return_value = { 'data': { 'name': 'Morty', 'extra': { 'status': 'drafts' } } } guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) with assert_raises(exceptions.FigshareIsDraftError): guid.enrich() assert_equal(guid.name, 'Morty') @mock.patch('website.addons.base.requests.get') def test_enrich_works(self, mock_get): mock_response = mock.Mock(ok=True, status_code=200) mock_get.return_value = mock_response mock_response.json.return_value = { 'data': { 'name': 'Morty', 'extra': { 'status': 'Rick' } } } guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) guid.enrich() assert_equal(guid.name, 'Morty') def test_node_addon_get_or_create(self): guid, _ = self.node_addon.find_or_create_file_guid('/4/2') assert_equal(guid.waterbutler_path, '/4/2') assert_equal(guid.file_id, '2') assert_equal(guid.article_id, '4') def test_node_addon_get_or_create_finds(self): guid, created = self.node_addon.find_or_create_file_guid('/4/2') assert_true(created) other, other_created = self.node_addon.find_or_create_file_guid('/4/2') assert_false(other_created) assert_equal(guid, other)
class TestFileGuid(OsfTestCase): def setUp(self): super(OsfTestCase, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.project.add_addon('figshare', auth=Auth(self.user)) self.node_addon = self.project.get_addon('figshare') self.node_addon.figshare_id = 8 self.node_addon.figshare_type = 'project' self.node_addon.save() def test_provider(self): assert_equal('figshare', model.FigShareGuidFile().provider) def test_path_doesnt_crash_without_addon(self): guid = model.FigShareGuidFile(node=self.project, path='/baz/foo/bar') self.project.delete_addon('figshare', Auth(self.user)) assert_is(self.project.get_addon('figshare'), None) assert_true(guid.path) assert_true(guid.waterbutler_path) def test_path_doesnt_crash_nonconfig_addon(self): guid = model.FigShareGuidFile(node=self.project, path='/baz/foo/bar') self.node_addon.figshare_type = None self.node_addon.figshare_id = None self.node_addon.save() self.node_addon.reload() assert_true(guid.path) assert_true(guid.waterbutler_path) def test_correct_path_article(self): guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) guid._metadata_cache = {'name': 'shigfare.io'} tpath = guid.mfr_temp_path cpath = guid.mfr_cache_path assert_not_equal(tpath, cpath) def test_mfr_test_path(self): self.node_addon.figshare_type = 'fileset' self.node_addon.save() self.node_addon.reload() guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) assert_equal(guid.waterbutler_path, '/2') def test_correct_path_project(self): guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) assert_equal(guid.waterbutler_path, '/4/2') def test_unique_identifier(self): guid = model.FigShareGuidFile(file_id=2, article_id=4) assert_equal(guid.unique_identifier, '42') def test_exception_from_response(self): mock_response = mock.Mock() mock_response.json.return_value = { 'data': { 'name': 'Morty', 'extra': { 'status': 'drafts' } } } guid = model.FigShareGuidFile(file_id=2, article_id=4) with assert_raises(exceptions.FigshareIsDraftError): guid._exception_from_response(mock_response) assert_equal(guid.name, 'Morty') @mock.patch('website.addons.base.requests.get') def test_enrich_raises(self, mock_get): mock_response = mock.Mock(ok=True, status_code=200) mock_get.return_value = mock_response mock_response.json.return_value = { 'data': { 'name': 'Morty', 'extra': { 'status': 'drafts' } } } guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) with assert_raises(exceptions.FigshareIsDraftError): guid.enrich() assert_equal(guid.name, 'Morty') @mock.patch('website.addons.base.requests.get') def test_enrich_works(self, mock_get): mock_response = mock.Mock(ok=True, status_code=200) mock_get.return_value = mock_response mock_response.json.return_value = { 'data': { 'name': 'Morty', 'extra': { 'status': 'Rick' } } } guid = model.FigShareGuidFile(file_id=2, article_id=4, node=self.project) guid.enrich() assert_equal(guid.name, 'Morty') def test_node_addon_get_or_create(self): guid, _ = self.node_addon.find_or_create_file_guid('/4/2') assert_equal(guid.waterbutler_path, '/4/2') assert_equal(guid.file_id, '2') assert_equal(guid.article_id, '4') def test_node_addon_get_or_create_finds(self): guid, created = self.node_addon.find_or_create_file_guid('/4/2') assert_true(created) other, other_created = self.node_addon.find_or_create_file_guid('/4/2') assert_false(other_created) assert_equal(guid, other)
class TestMigrateFiles(OsfTestCase): def setUp(self): super(TestMigrateFiles, self).setUp() self.project = ProjectFactory() self.user = self.project.creator self.auth_obj = Auth(user=self.user) self.project.delete_addon('osfstorage', auth=None, _force=True) for idx in range(5): content = 'i want {0} pizzas'.format(idx) self.project.add_file( auth=self.auth_obj, file_name='pizza.md', content=content, size=len(content), content_type='text/markdown', ) def check_record(self, record): assert_true(record) assert_equal(len(record.versions), 5) for idx, version in enumerate(record.versions): assert_false(version.pending) expected = 'i want {0} pizzas'.format(idx) download_url = utils.get_waterbutler_download_url(idx + 1, version, record) resp = requests.get(download_url) assert_equal(expected, resp.content) def test_migrate(self): main(dry_run=False) node_settings = self.project.get_addon('osfstorage') assert_true(node_settings) record = model.OsfStorageFileRecord.find_by_path('pizza.md', node_settings) self.check_record(record) # Test idempotence of migration main(dry_run=False) assert_equal(len(record.versions), 5) def test_migrate_incomplete(self): node_settings = self.project.get_or_add_addon('osfstorage', auth=None, log=False) record = model.OsfStorageFileRecord.get_or_create('pizza.md', node_settings) node_file = NodeFile.load(self.project.files_versions['pizza_md'][0]) content, _ = self.project.read_file_object(node_file) file_pointer = StringIO(content) hash_str = scripts_settings.UPLOAD_PRIMARY_HASH(content).hexdigest() record.create_pending_version(node_file.uploader, hash_str) main(dry_run=False) def test_migrate_fork(self): fork = self.project.fork_node(auth=self.auth_obj) main(dry_run=False) node_settings = self.project.get_addon('osfstorage') record = model.OsfStorageFileRecord.find_by_path('pizza.md', node_settings) self.check_record(record) fork_node_settings = fork.get_addon('osfstorage') fork_record = model.OsfStorageFileRecord.find_by_path('pizza.md', fork_node_settings) self.check_record(fork_record) def test_migrate_corrupt_fork_repo_deleted(self): fork = self.project.fork_node(auth=self.auth_obj) fork_repo = os.path.join(settings.UPLOADS_PATH, fork._id) shutil.rmtree(fork_repo) main(dry_run=False) node_settings = self.project.get_addon('osfstorage') record = model.OsfStorageFileRecord.find_by_path('pizza.md', node_settings) self.check_record(record) fork_node_settings = fork.get_addon('osfstorage') fork_record = model.OsfStorageFileRecord.find_by_path('pizza.md', fork_node_settings) self.check_record(fork_record) def test_migrate_corrupt_fork_git_dir_deleted(self): fork = self.project.fork_node(auth=self.auth_obj) fork_git_dir = os.path.join(settings.UPLOADS_PATH, fork._id, '.git') shutil.rmtree(fork_git_dir) main(dry_run=False) node_settings = self.project.get_addon('osfstorage') record = model.OsfStorageFileRecord.find_by_path('pizza.md', node_settings) self.check_record(record) fork_node_settings = fork.get_addon('osfstorage') fork_record = model.OsfStorageFileRecord.find_by_path('pizza.md', fork_node_settings) self.check_record(fork_record)
class TestAddonFileViews(OsfTestCase): @classmethod def setUpClass(cls): super(TestAddonFileViews, cls).setUpClass() PROVIDER_MAP['github'] = [TestFolder, TestFile, TestFileNode] TestFileNode.provider = 'github' def setUp(self): super(TestAddonFileViews, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.user.add_addon('github') self.project.add_addon('github', auth=Auth(self.user)) self.user_addon = self.user.get_addon('github') self.node_addon = self.project.get_addon('github') self.oauth = GitHubAccountFactory() self.oauth.save() self.user.external_accounts.append(self.oauth) self.user.save() self.node_addon.user_settings = self.user_addon self.node_addon.external_account = self.oauth self.node_addon.repo = 'Truth' self.node_addon.user = '******' self.node_addon.save() @classmethod def tearDownClass(cls): super(TestAddonFileViews, cls).tearDownClass() PROVIDER_MAP['github'] = [ models.GithubFolder, models.GithubFile, models.GithubFileNode ] del PROVIDER_MAP['test_addons'] TrashedFileNode.remove() def get_test_file(self): version = models.FileVersion(identifier='1') version.save() versions = [version] ret = TestFile(name='Test', node=self.project, path='/test/Test', materialized_path='/test/Test', versions=versions) ret.save() return ret def get_second_test_file(self): version = models.FileVersion(identifier='1') version.save() ret = TestFile(name='Test2', node=self.project, path='/test/Test2', materialized_path='/test/Test2', versions=[version]) ret.save() return ret def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'error': '', 'provider': '', 'file_path': '', 'sharejs_uuid': '', 'private': '', 'urls': { 'files': '', 'render': '', 'sharejs': '', 'mfr': '', 'gravatar': '', 'external': '', 'archived_from': '', }, 'size': '', 'extra': '', 'file_name': '', 'materialized_path': '', 'file_id': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret def test_redirects_to_guid(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github'), auth=self.user.auth) assert_equals(resp.status_code, 302) assert_equals(resp.location, 'http://*****:*****@mock.patch('website.addons.base.views.addon_view_file') def test_action_view_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get('/{}/?action=view'.format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user._id, self.user._id) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) @mock.patch('website.addons.base.views.addon_view_file') def test_no_action_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get('/{}/'.format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user._id, self.user._id) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) def test_download_create_guid(self): file_node = self.get_test_file() assert_is(file_node.get_guid(), None) self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github', ), auth=self.user.auth) assert_true(file_node.get_guid()) def test_view_file_does_not_delete_file_when_requesting_invalid_version( self): with mock.patch( 'website.addons.github.model.GitHubNodeSettings.is_private', new_callable=mock.PropertyMock) as mock_is_private: mock_is_private.return_value = False file_node = self.get_test_file() assert_is(file_node.get_guid(), None) url = self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github', ) # First view generated GUID self.app.get(url, auth=self.user.auth) self.app.get(url + '?version=invalid', auth=self.user.auth, expect_errors=True) assert_is_not_none(StoredFileNode.load(file_node._id)) assert_is_none(TrashedFileNode.load(file_node._id)) def test_unauthorized_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download'), auth=self.user.auth, expect_errors=True) assert_equals(resp.status_code, 401) def test_nonstorage_addons_raise(self): resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path='sillywiki', provider='wiki', action='download'), auth=self.user.auth, expect_errors=True) assert_equals(resp.status_code, 400) def test_head_returns_url(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head('/{}/'.format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) assert_urls_equal( location.url, file_node.generate_waterbutler_url(direct=None, version=None)) def test_head_returns_url_with_version(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head('/{}/?revision=1&foo=bar'.format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) # Note: version is added but us but all other url params are added as well assert_urls_equal( location.url, file_node.generate_waterbutler_url(direct=None, revision=1, version=None, foo='bar')) def test_nonexistent_addons_raise(self): path = 'cloudfiles' self.project.delete_addon('github', Auth(self.user)) self.project.save() resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download'), auth=self.user.auth, expect_errors=True) assert_equals(resp.status_code, 400) def test_unauth_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get(self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download'), auth=self.user.auth, expect_errors=True) assert_equals(resp.status_code, 401) def test_delete_action_creates_trashed_file_node(self): file_node = self.get_test_file() payload = { 'provider': file_node.provider, 'metadata': { 'path': '/test/Test', 'materialized': '/test/Test' } } views.addon_delete_file_node(self=None, node=self.project, user=self.user, event_type='file_removed', payload=payload) assert_false(StoredFileNode.load(file_node._id)) assert_true(TrashedFileNode.load(file_node._id)) def test_delete_action_for_folder_deletes_subfolders_and_creates_trashed_file_nodes( self): file_node = self.get_test_file() subfolder = TestFolder(name='folder', node=self.project, path='/test/folder/', materialized_path='/test/folder/', versions=[]) subfolder.save() payload = { 'provider': file_node.provider, 'metadata': { 'path': '/test/', 'materialized': '/test/' } } views.addon_delete_file_node(self=None, node=self.project, user=self.user, event_type='file_removed', payload=payload) assert_false(StoredFileNode.load(file_node._id)) assert_true(TrashedFileNode.load(file_node._id)) assert_false(StoredFileNode.load(subfolder._id)) @mock.patch('website.archiver.tasks.archive') def test_archived_from_url(self, mock_archive): file_node = self.get_test_file() second_file_node = self.get_second_test_file() file_node.copied_from = second_file_node registered_node = self.project.register_node( schema=get_default_metaschema(), auth=Auth(self.user), data=None, ) archived_from_url = views.get_archived_from_url( registered_node, file_node) view_url = self.project.web_url_for('addon_view_or_download_file', provider=file_node.provider, path=file_node.copied_from._id) assert_true(archived_from_url) assert_urls_equal(archived_from_url, view_url) @mock.patch('website.archiver.tasks.archive') def test_archived_from_url_without_copied_from(self, mock_archive): file_node = self.get_test_file() registered_node = self.project.register_node( schema=get_default_metaschema(), auth=Auth(self.user), data=None, ) archived_from_url = views.get_archived_from_url( registered_node, file_node) assert_false(archived_from_url) @mock.patch('website.archiver.tasks.archive') def test_copied_from_id_trashed(self, mock_archive): file_node = self.get_test_file() second_file_node = self.get_second_test_file() file_node.copied_from = second_file_node self.project.register_node( schema=get_default_metaschema(), auth=Auth(self.user), data=None, ) trashed_node = second_file_node.delete() assert_false(trashed_node.copied_from)
class TestNodeLogList(ApiTestCase): def setUp(self): super(TestNodeLogList, self).setUp() self.user = AuthUserFactory() self.contrib = AuthUserFactory() self.creator = AuthUserFactory() self.user_auth = Auth(self.user) self.NodeLogFactory = ProjectFactory() self.pointer = ProjectFactory() self.private_project = ProjectFactory(is_public=False, creator=self.user) self.private_url = '/{}nodes/{}/logs/'.format(API_BASE, self.private_project._id) self.public_project = ProjectFactory(is_public=True, creator=self.user) self.public_url = '/{}nodes/{}/logs/'.format(API_BASE, self.public_project._id) def tearDown(self): super(TestNodeLogList, self).tearDown() NodeLog.remove() def test_add_tag(self): user_auth = Auth(self.user) self.public_project.add_tag("Jeff Spies", auth=user_auth) assert_equal("tag_added", self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'tag_added') assert_equal("Jeff Spies", self.public_project.logs[OSF_LATEST].params['tag']) def test_remove_tag(self): user_auth = Auth(self.user) self.public_project.add_tag("Jeff Spies", auth=user_auth) assert_equal("tag_added", self.public_project.logs[OSF_LATEST].action) self.public_project.remove_tag("Jeff Spies", auth=self.user_auth) assert_equal("tag_removed", self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'tag_removed') assert_equal("Jeff Spies", self.public_project.logs[OSF_LATEST].params['tag']) def test_project_created(self): res = self.app.get(self.public_url) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(self.public_project.logs[OSF_FIRST].action, "project_created") assert_equal(self.public_project.logs[OSF_FIRST].action,res.json['data'][API_LATEST]['attributes']['action']) def test_log_create_on_public_project(self): res = self.app.get(self.public_url) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_datetime_equal(parse_date(res.json['data'][API_FIRST]['attributes']['date']), self.public_project.logs[OSF_FIRST].date) assert_equal(res.json['data'][API_FIRST]['attributes']['action'], self.public_project.logs[OSF_FIRST].action) def test_log_create_on_private_project(self): res = self.app.get(self.private_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_datetime_equal(datetime.datetime.strptime(res.json['data'][API_FIRST]['attributes']['date'], "%Y-%m-%dT%H:%M:%S.%f"), self.private_project.logs[OSF_FIRST].date) assert_equal(res.json['data'][API_FIRST]['attributes']['action'], self.private_project.logs[OSF_FIRST].action) def test_add_addon(self): self.public_project.add_addon('github', auth=self.user_auth) assert_equal('addon_added', self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'addon_added') def test_project_add_remove_contributor(self): self.public_project.add_contributor(self.contrib, auth=self.user_auth) assert_equal('contributor_added', self.public_project.logs[OSF_LATEST].action) self.public_project.remove_contributor(self.contrib, auth=self.user_auth) assert_equal('contributor_removed', self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'contributor_removed') assert_equal(res.json['data'][1]['attributes']['action'], 'contributor_added') def test_remove_addon(self): self.public_project.add_addon('github', auth=self.user_auth) assert_equal('addon_added', self.public_project.logs[OSF_LATEST].action) self.public_project.delete_addon('github', auth=self.user_auth) assert_equal('addon_removed', self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'addon_removed') def test_add_pointer(self): self.public_project.add_pointer(self.pointer, auth=Auth(self.user), save=True) assert_equal('pointer_created', self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'pointer_created')
class TestAddonFileViews(OsfTestCase): @classmethod def setUpClass(cls): super(TestAddonFileViews, cls).setUpClass() PROVIDER_MAP['github'] = [TestFolder, TestFile, TestFileNode] TestFileNode.provider = 'github' def setUp(self): super(TestAddonFileViews, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.user.add_addon('github') self.project.add_addon('github', auth=Auth(self.user)) self.user_addon = self.user.get_addon('github') self.node_addon = self.project.get_addon('github') self.oauth = GitHubAccountFactory() self.oauth.save() self.user.external_accounts.append(self.oauth) self.user.save() self.node_addon.user_settings = self.user_addon self.node_addon.external_account = self.oauth self.node_addon.repo = 'Truth' self.node_addon.user = '******' self.node_addon.save() @classmethod def tearDownClass(cls): super(TestAddonFileViews, cls).tearDownClass() PROVIDER_MAP['github'] = [models.GithubFolder, models.GithubFile, models.GithubFileNode] del PROVIDER_MAP['test_addons'] TrashedFileNode.remove() def get_test_file(self): version = models.FileVersion(identifier='1') version.save() versions = [version] ret = TestFile( name='Test', node=self.project, path='/test/Test', materialized_path='/test/Test', versions=versions ) ret.save() return ret def get_second_test_file(self): version = models.FileVersion(identifier='1') version.save() ret = TestFile( name='Test2', node=self.project, path='/test/Test2', materialized_path='/test/Test2', versions=[version] ) ret.save() return ret def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'error': '', 'provider': '', 'file_path': '', 'sharejs_uuid': '', 'private': '', 'urls': { 'files': '', 'render': '', 'sharejs': '', 'mfr': '', 'gravatar': '', 'external': '', 'archived_from': '', }, 'size': '', 'extra': '', 'file_name': '', 'materialized_path': '', 'file_id': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret def test_redirects_to_guid(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github' ), auth=self.user.auth ) assert_equals(resp.status_code, 302) assert_equals(resp.location, 'http://*****:*****@mock.patch('website.addons.base.views.addon_view_file') def test_action_view_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get('/{}/?action=view'.format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user._id, self.user._id) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) @mock.patch('website.addons.base.views.addon_view_file') def test_no_action_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get('/{}/'.format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user._id, self.user._id) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) def test_download_create_guid(self): file_node = self.get_test_file() assert_is(file_node.get_guid(), None) self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github', ), auth=self.user.auth ) assert_true(file_node.get_guid()) def test_view_file_does_not_delete_file_when_requesting_invalid_version(self): with mock.patch('website.addons.github.model.GitHubNodeSettings.is_private', new_callable=mock.PropertyMock) as mock_is_private: mock_is_private.return_value = False file_node = self.get_test_file() assert_is(file_node.get_guid(), None) url = self.project.web_url_for( 'addon_view_or_download_file', path=file_node.path.strip('/'), provider='github', ) # First view generated GUID self.app.get(url, auth=self.user.auth) self.app.get(url + '?version=invalid', auth=self.user.auth, expect_errors=True) assert_is_not_none(StoredFileNode.load(file_node._id)) assert_is_none(TrashedFileNode.load(file_node._id)) def test_unauthorized_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 401) def test_nonstorage_addons_raise(self): resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path='sillywiki', provider='wiki', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 400) def test_head_returns_url(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head('/{}/'.format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) assert_urls_equal(location.url, file_node.generate_waterbutler_url(direct=None, version=None)) def test_head_returns_url_with_version(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head('/{}/?revision=1&foo=bar'.format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) # Note: version is added but us but all other url params are added as well assert_urls_equal(location.url, file_node.generate_waterbutler_url(direct=None, revision=1, version=None, foo='bar')) def test_nonexistent_addons_raise(self): path = 'cloudfiles' self.project.delete_addon('github', Auth(self.user)) self.project.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 400) def test_unauth_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 401) def test_delete_action_creates_trashed_file_node(self): file_node = self.get_test_file() payload = { 'provider': file_node.provider, 'metadata': { 'path': '/test/Test', 'materialized': '/test/Test' } } views.addon_delete_file_node(self=None, node=self.project, user=self.user, event_type='file_removed', payload=payload) assert_false(StoredFileNode.load(file_node._id)) assert_true(TrashedFileNode.load(file_node._id)) def test_delete_action_for_folder_deletes_subfolders_and_creates_trashed_file_nodes(self): file_node = self.get_test_file() subfolder = TestFolder( name='folder', node=self.project, path='/test/folder/', materialized_path='/test/folder/', versions=[] ) subfolder.save() payload = { 'provider': file_node.provider, 'metadata': { 'path': '/test/', 'materialized': '/test/' } } views.addon_delete_file_node(self=None, node=self.project, user=self.user, event_type='file_removed', payload=payload) assert_false(StoredFileNode.load(file_node._id)) assert_true(TrashedFileNode.load(file_node._id)) assert_false(StoredFileNode.load(subfolder._id)) @mock.patch('website.archiver.tasks.archive') def test_archived_from_url(self, mock_archive): file_node = self.get_test_file() second_file_node = self.get_second_test_file() file_node.copied_from = second_file_node registered_node = self.project.register_node( schema=get_default_metaschema(), auth=Auth(self.user), data=None, ) archived_from_url = views.get_archived_from_url(registered_node, file_node) view_url = self.project.web_url_for('addon_view_or_download_file', provider=file_node.provider, path=file_node.copied_from._id) assert_true(archived_from_url) assert_urls_equal(archived_from_url, view_url) @mock.patch('website.archiver.tasks.archive') def test_archived_from_url_without_copied_from(self, mock_archive): file_node = self.get_test_file() registered_node = self.project.register_node( schema=get_default_metaschema(), auth=Auth(self.user), data=None, ) archived_from_url = views.get_archived_from_url(registered_node, file_node) assert_false(archived_from_url) @mock.patch('website.archiver.tasks.archive') def test_copied_from_id_trashed(self, mock_archive): file_node = self.get_test_file() second_file_node = self.get_second_test_file() file_node.copied_from = second_file_node self.project.register_node( schema=get_default_metaschema(), auth=Auth(self.user), data=None, ) trashed_node = second_file_node.delete() assert_false(trashed_node.copied_from)
class TestAddonFileViews(OsfTestCase): @classmethod def setUpClass(cls): super(TestAddonFileViews, cls).setUpClass() PROVIDER_MAP["github"] = [TestFolder, TestFile, TestFileNode] TestFileNode.provider = "github" def setUp(self): super(TestAddonFileViews, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.user.add_addon("github") self.project.add_addon("github", auth=Auth(self.user)) self.user_addon = self.user.get_addon("github") self.node_addon = self.project.get_addon("github") self.oauth = GitHubAccountFactory() self.oauth.save() self.user.external_accounts.append(self.oauth) self.user.save() self.node_addon.user_settings = self.user_addon self.node_addon.external_account = self.oauth self.node_addon.repo = "Truth" self.node_addon.user = "******" self.node_addon.save() @classmethod def tearDownClass(cls): super(TestAddonFileViews, cls).tearDownClass() PROVIDER_MAP["github"] = [models.GithubFolder, models.GithubFile, models.GithubFileNode] del PROVIDER_MAP["test_addons"] TrashedFileNode.remove() def get_test_file(self): version = models.FileVersion(identifier="1") version.save() versions = [version] ret = TestFile( name="Test", node=self.project, path="/test/Test", materialized_path="/test/Test", versions=versions ) ret.save() return ret def get_second_test_file(self): version = models.FileVersion(identifier="1") version.save() ret = TestFile( name="Test2", node=self.project, path="/test/Test2", materialized_path="/test/Test2", versions=[version] ) ret.save() return ret def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update( { "error": "", "provider": "", "file_path": "", "sharejs_uuid": "", "private": "", "urls": { "files": "", "render": "", "sharejs": "", "mfr": "", "gravatar": "", "external": "", "archived_from": "", }, "size": "", "extra": "", "file_name": "", "materialized_path": "", "file_id": "", } ) ret.update(rubeus.collect_addon_assets(self.project)) return ret def test_redirects_to_guid(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.get( self.project.web_url_for("addon_view_or_download_file", path=file_node.path.strip("/"), provider="github"), auth=self.user.auth, ) assert_equals(resp.status_code, 302) assert_equals(resp.location, "http://*****:*****@mock.patch("website.addons.base.views.addon_view_file") def test_action_view_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get("/{}/?action=view".format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user._id, self.user._id) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) @mock.patch("website.addons.base.views.addon_view_file") def test_no_action_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() file_node = self.get_test_file() guid = file_node.get_guid(create=True) mock_view_file.return_value = self.get_mako_return() self.app.get("/{}/".format(guid._id), auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[0].user._id, self.user._id) assert_equals(args[1], self.project) assert_equals(args[2], file_node) assert_true(isinstance(args[3], file_node.touch(None).__class__)) def test_download_create_guid(self): file_node = self.get_test_file() assert_is(file_node.get_guid(), None) self.app.get( self.project.web_url_for("addon_view_or_download_file", path=file_node.path.strip("/"), provider="github"), auth=self.user.auth, ) assert_true(file_node.get_guid()) def test_view_file_does_not_delete_file_when_requesting_invalid_version(self): with mock.patch( "website.addons.github.model.GitHubNodeSettings.is_private", new_callable=mock.PropertyMock ) as mock_is_private: mock_is_private.return_value = False file_node = self.get_test_file() assert_is(file_node.get_guid(), None) url = self.project.web_url_for( "addon_view_or_download_file", path=file_node.path.strip("/"), provider="github" ) # First view generated GUID self.app.get(url, auth=self.user.auth) self.app.get(url + "?version=invalid", auth=self.user.auth, expect_errors=True) assert_is_not_none(StoredFileNode.load(file_node._id)) assert_is_none(TrashedFileNode.load(file_node._id)) def test_unauthorized_addons_raise(self): path = "cloudfiles" self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for("addon_view_or_download_file", path=path, provider="github", action="download"), auth=self.user.auth, expect_errors=True, ) assert_equals(resp.status_code, 401) def test_nonstorage_addons_raise(self): resp = self.app.get( self.project.web_url_for( "addon_view_or_download_file", path="sillywiki", provider="wiki", action="download" ), auth=self.user.auth, expect_errors=True, ) assert_equals(resp.status_code, 400) def test_head_returns_url(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head("/{}/".format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) assert_urls_equal(location.url, file_node.generate_waterbutler_url(direct=None, version=None)) def test_head_returns_url_with_version(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head("/{}/?revision=1&foo=bar".format(guid._id), auth=self.user.auth) location = furl.furl(resp.location) # Note: version is added but us but all other url params are added as well assert_urls_equal( location.url, file_node.generate_waterbutler_url(direct=None, revision=1, version=None, foo="bar") ) def test_nonexistent_addons_raise(self): path = "cloudfiles" self.project.delete_addon("github", Auth(self.user)) self.project.save() resp = self.app.get( self.project.web_url_for("addon_view_or_download_file", path=path, provider="github", action="download"), auth=self.user.auth, expect_errors=True, ) assert_equals(resp.status_code, 400) def test_unauth_addons_raise(self): path = "cloudfiles" self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for("addon_view_or_download_file", path=path, provider="github", action="download"), auth=self.user.auth, expect_errors=True, ) assert_equals(resp.status_code, 401) def test_delete_action_creates_trashed_file_node(self): file_node = self.get_test_file() payload = {"provider": file_node.provider, "metadata": {"path": "/test/Test", "materialized": "/test/Test"}} views.addon_delete_file_node( self=None, node=self.project, user=self.user, event_type="file_removed", payload=payload ) assert_false(StoredFileNode.load(file_node._id)) assert_true(TrashedFileNode.load(file_node._id)) def test_delete_action_for_folder_deletes_subfolders_and_creates_trashed_file_nodes(self): file_node = self.get_test_file() subfolder = TestFolder( name="folder", node=self.project, path="/test/folder/", materialized_path="/test/folder/", versions=[] ) subfolder.save() payload = {"provider": file_node.provider, "metadata": {"path": "/test/", "materialized": "/test/"}} views.addon_delete_file_node( self=None, node=self.project, user=self.user, event_type="file_removed", payload=payload ) assert_false(StoredFileNode.load(file_node._id)) assert_true(TrashedFileNode.load(file_node._id)) assert_false(StoredFileNode.load(subfolder._id)) @mock.patch("website.archiver.tasks.archive") def test_archived_from_url(self, mock_archive): file_node = self.get_test_file() second_file_node = self.get_second_test_file() file_node.copied_from = second_file_node registered_node = self.project.register_node(schema=get_default_metaschema(), auth=Auth(self.user), data=None) archived_from_url = views.get_archived_from_url(registered_node, file_node) view_url = self.project.web_url_for( "addon_view_or_download_file", provider=file_node.provider, path=file_node.copied_from._id ) assert_true(archived_from_url) assert_urls_equal(archived_from_url, view_url) @mock.patch("website.archiver.tasks.archive") def test_archived_from_url_without_copied_from(self, mock_archive): file_node = self.get_test_file() registered_node = self.project.register_node(schema=get_default_metaschema(), auth=Auth(self.user), data=None) archived_from_url = views.get_archived_from_url(registered_node, file_node) assert_false(archived_from_url) @mock.patch("website.archiver.tasks.archive") def test_copied_from_id_trashed(self, mock_archive): file_node = self.get_test_file() second_file_node = self.get_second_test_file() file_node.copied_from = second_file_node self.project.register_node(schema=get_default_metaschema(), auth=Auth(self.user), data=None) trashed_node = second_file_node.delete() assert_false(trashed_node.copied_from)
class TestAddonFileViews(OsfTestCase): def setUp(self): super(TestAddonFileViews, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.user.add_addon('github') self.project.add_addon('github', auth=Auth(self.user)) self.user_addon = self.user.get_addon('github') self.node_addon = self.project.get_addon('github') self.oauth = AddonGitHubOauthSettings( github_user_id='denbarell', oauth_access_token='Truthy' ) self.oauth.save() self.user_addon.oauth_settings = self.oauth self.user_addon.save() self.node_addon.user_settings = self.user_addon self.node_addon.save() # self.node_addon.user_settings = 'Truthy' # setattr(self.node_addon, 'has_auth', True) def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'extra': '', 'provider': '', 'rendered': '', 'file_path': '', 'files_url': '', 'file_name': '', 'render_url': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret def test_redirects_to_guid(self): path = 'bigdata' guid, _ = self.node_addon.find_or_create_file_guid('/' + path) resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github' ), auth=self.user.auth ) assert_equals(resp.status_code, 302) assert_equals(resp.headers['Location'], 'http://*****:*****@mock.patch('website.addons.base.request') def test_public_download_url_includes_view_only(self, mock_request): view_only = 'justworkplease' mock_request.args = { 'view_only': view_only } path = 'cloudfiles' guid, _ = self.node_addon.find_or_create_file_guid('/' + path) assert_in('view_only={}'.format(view_only), guid.public_download_url) @mock.patch('website.addons.base.views.addon_view_file') def test_action_view_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() path = 'cloudfiles' mock_view_file.return_value = self.get_mako_return() guid, _ = self.node_addon.find_or_create_file_guid('/' + path) self.app.get(guid.guid_url + '?action=view', auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[-1], {'action': 'view'}) assert_equals(args[1], self.project) assert_equals(args[0].user, self.user) assert_equals(args[2], self.node_addon) @mock.patch('website.addons.base.views.addon_view_file') def test_no_action_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() path = 'cloudfiles' mock_view_file.return_value = self.get_mako_return() guid, _ = self.node_addon.find_or_create_file_guid('/' + path) self.app.get(guid.guid_url, auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[-1], {}) assert_equals(args[1], self.project) assert_equals(args[0].user, self.user) assert_equals(args[2], self.node_addon) def test_download_create_guid(self): path = 'cloudfiles' self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth ) guid, created = self.node_addon.find_or_create_file_guid('/' + path) assert_true(guid) assert_false(created) assert_equals(guid.waterbutler_path, '/' + path) def test_unauthorized_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 403) def test_head_returns_url(self): path = 'the little engine that couldnt' guid, _ = self.node_addon.find_or_create_file_guid('/' + path) download_url = furl.furl(guid.download_url) download_url.args['accept_url'] = 'false' resp = self.app.head(guid.guid_url, auth=self.user.auth) assert_urls_equal(resp.headers['Location'], download_url.url) def test_nonexistent_addons_raise(self): path = 'cloudfiles' self.project.delete_addon('github', Auth(self.user)) self.project.save() resp = self.app.get( self.project.api_url_for( 'addon_render_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 400) def test_unauth_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.api_url_for( 'addon_render_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 401) def test_unconfigured_addons_raise(self): path = 'cloudfiles' self.node_addon.repo = None self.node_addon.save() resp = self.app.get( self.project.api_url_for( 'addon_render_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 400)
class TestAddonFileViews(OsfTestCase): def setUp(self): super(TestAddonFileViews, self).setUp() self.user = AuthUserFactory() self.project = ProjectFactory(creator=self.user) self.user.add_addon('github') self.project.add_addon('github', auth=Auth(self.user)) self.user_addon = self.user.get_addon('github') self.node_addon = self.project.get_addon('github') self.oauth = AddonGitHubOauthSettings( github_user_id='denbarell', oauth_access_token='Truthy' ) self.oauth.save() self.user_addon.oauth_settings = self.oauth self.user_addon.save() self.node_addon.user_settings = self.user_addon self.node_addon.repo = 'Truth' self.node_addon.user = '******' self.node_addon.save() # self.node_addon.user_settings = 'Truthy' # setattr(self.node_addon, 'has_auth', True) def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'error': '', 'provider': '', 'file_path': '', 'sharejs_uuid': '', 'urls': { 'files': '', 'render': '', 'sharejs': '', 'mfr': '', 'gravatar': '', }, 'size': '', 'extra': '', 'file_name': '', 'materialized_path': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret def test_redirects_to_guid(self): path = 'bigdata' guid, _ = self.node_addon.find_or_create_file_guid('/' + path) resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github' ), auth=self.user.auth ) assert_equals(resp.status_code, 302) assert_equals(resp.headers['Location'], 'http://*****:*****@mock.patch('website.addons.base.request') def test_public_download_url_includes_view_only(self, mock_request): view_only = 'justworkplease' mock_request.args = { 'view_only': view_only } path = 'cloudfiles' guid, _ = self.node_addon.find_or_create_file_guid('/' + path) assert_in('view_only={}'.format(view_only), guid.public_download_url) @mock.patch('website.addons.base.views.addon_view_file') def test_action_view_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() path = 'cloudfiles' mock_view_file.return_value = self.get_mako_return() guid, _ = self.node_addon.find_or_create_file_guid('/' + path) self.app.get(guid.guid_url + '?action=view', auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[-1], {'action': 'view'}) assert_equals(args[1], self.project) assert_equals(args[0].user, self.user) assert_equals(args[2], self.node_addon) @mock.patch('website.addons.base.views.addon_view_file') def test_no_action_calls_view_file(self, mock_view_file): self.user.reload() self.project.reload() path = 'cloudfiles' mock_view_file.return_value = self.get_mako_return() guid, _ = self.node_addon.find_or_create_file_guid('/' + path) self.app.get(guid.guid_url, auth=self.user.auth) args, kwargs = mock_view_file.call_args assert_equals(kwargs, {}) assert_equals(args[-1], {}) assert_equals(args[1], self.project) assert_equals(args[0].user, self.user) assert_equals(args[2], self.node_addon) def test_download_create_guid(self): path = 'cloudfiles' self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth ) guid, created = self.node_addon.find_or_create_file_guid('/' + path) assert_true(guid) assert_false(created) assert_equals(guid.waterbutler_path, '/' + path) def test_unauthorized_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 401) def test_head_returns_url(self): path = 'the little engine that couldnt' guid, _ = self.node_addon.find_or_create_file_guid('/' + path) download_url = furl.furl(guid.download_url) download_url.args['accept_url'] = 'false' resp = self.app.head(guid.guid_url, auth=self.user.auth) assert_urls_equal(resp.headers['Location'], download_url.url) def test_nonexistent_addons_raise(self): path = 'cloudfiles' self.project.delete_addon('github', Auth(self.user)) self.project.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 400) def test_unauth_addons_raise(self): path = 'cloudfiles' self.node_addon.user_settings = None self.node_addon.save() resp = self.app.get( self.project.web_url_for( 'addon_view_or_download_file', path=path, provider='github', action='download' ), auth=self.user.auth, expect_errors=True ) assert_equals(resp.status_code, 401)
class TestFileGuid(OsfTestCase): def setUp(self): super(OsfTestCase, self).setUp() self.user = UserFactory() self.project = ProjectFactory(creator=self.user) self.project.add_addon('googledrive', auth=Auth(self.user)) self.node_addon = self.project.get_addon('googledrive') self.node_addon.folder_id = 'Lulz' self.node_addon.folder_path = 'baz' self.node_addon.save() def test_path_doesnt_crash_without_addon(self): guid = GoogleDriveGuidFile(node=self.project, path='/baz/foo/bar') self.project.delete_addon('googledrive', Auth(self.user)) assert_is(self.project.get_addon('googledrive'), None) assert_true(guid.path) assert_true(guid.waterbutler_path) def test_path_doesnt_crash_nonconfig_addon(self): guid = GoogleDriveGuidFile(node=self.project, path='/baz/foo/bar') self.node_addon.folder_id = None self.node_addon.folder_path = None self.node_addon.save() self.node_addon.reload() assert_true(guid.path) assert_true(guid.waterbutler_path) def test_provider(self): assert_equal('googledrive', GoogleDriveGuidFile().provider) def test_correct_path(self): guid = GoogleDriveGuidFile(node=self.project, path='/baz/foo/bar') assert_equals(guid.path, '/baz/foo/bar') assert_equals(guid.waterbutler_path, '/foo/bar') @mock.patch('website.addons.base.requests.get') def test_unique_identifier(self, mock_get): mock_response = mock.Mock(ok=True, status_code=200) mock_get.return_value = mock_response mock_response.json.return_value = { 'data': { 'name': 'Morty', 'extra': { 'revisionId': 'Ricksy' } } } guid = GoogleDriveGuidFile(node=self.project, path='/foo/bar') guid.enrich() assert_equals('Ricksy', guid.unique_identifier) def test_node_addon_get_or_create(self): guid, created = self.node_addon.find_or_create_file_guid('/foo/bar') assert_true(created) assert_equal(guid.path, '/baz/foo/bar') assert_equal(guid.waterbutler_path, '/foo/bar') def test_node_addon_get_or_create_finds(self): guid1, created1 = self.node_addon.find_or_create_file_guid('/foo/bar') guid2, created2 = self.node_addon.find_or_create_file_guid('/foo/bar') assert_true(created1) assert_false(created2) assert_equals(guid1, guid2) def test_node_addon_get_or_create_finds_changed(self): self.node_addon.folder_path = 'baz' self.node_addon.save() self.node_addon.reload() guid1, created1 = self.node_addon.find_or_create_file_guid('/foo/bar') self.node_addon.folder_path = 'baz/foo' self.node_addon.save() self.node_addon.reload() guid2, created2 = self.node_addon.find_or_create_file_guid('/bar') assert_true(created1) assert_false(created2) assert_equals(guid1, guid2) def test_node_addon_get_or_create_finds_changed_root(self): self.node_addon.folder_path = 'baz' self.node_addon.save() self.node_addon.reload() guid1, created1 = self.node_addon.find_or_create_file_guid('/foo/bar') self.node_addon.folder_path = '/' self.node_addon.save() self.node_addon.reload() guid2, created2 = self.node_addon.find_or_create_file_guid('/baz/foo/bar') assert_true(created1) assert_false(created2) assert_equals(guid1, guid2)
class TestNodeLogList(ApiTestCase): def setUp(self): super(TestNodeLogList, self).setUp() self.user = AuthUserFactory() self.contrib = AuthUserFactory() self.creator = AuthUserFactory() self.user_auth = Auth(self.user) self.NodeLogFactory = ProjectFactory() self.pointer = ProjectFactory() self.private_project = ProjectFactory(is_public=False, creator=self.user) self.private_url = '/{}nodes/{}/logs/'.format(API_BASE, self.private_project._id) self.public_project = ProjectFactory(is_public=True, creator=self.user) self.public_url = '/{}nodes/{}/logs/'.format(API_BASE, self.public_project._id) def tearDown(self): super(TestNodeLogList, self).tearDown() NodeLog.remove() def test_add_tag(self): user_auth = Auth(self.user) self.public_project.add_tag("Jeff Spies", auth=user_auth) assert_equal("tag_added", self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'tag_added') assert_equal("Jeff Spies", self.public_project.logs[OSF_LATEST].params['tag']) def test_remove_tag(self): user_auth = Auth(self.user) self.public_project.add_tag("Jeff Spies", auth=user_auth) assert_equal("tag_added", self.public_project.logs[OSF_LATEST].action) self.public_project.remove_tag("Jeff Spies", auth=self.user_auth) assert_equal("tag_removed", self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'tag_removed') assert_equal("Jeff Spies", self.public_project.logs[OSF_LATEST].params['tag']) def test_project_created(self): res = self.app.get(self.public_url) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(self.public_project.logs[OSF_FIRST].action, "project_created") assert_equal(self.public_project.logs[OSF_FIRST].action, res.json['data'][API_LATEST]['attributes']['action']) def test_log_create_on_public_project(self): res = self.app.get(self.public_url) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_datetime_equal( parse_date(res.json['data'][API_FIRST]['attributes']['date']), self.public_project.logs[OSF_FIRST].date) assert_equal(res.json['data'][API_FIRST]['attributes']['action'], self.public_project.logs[OSF_FIRST].action) def test_log_create_on_private_project(self): res = self.app.get(self.private_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_datetime_equal( datetime.datetime.strptime( res.json['data'][API_FIRST]['attributes']['date'], "%Y-%m-%dT%H:%M:%S.%f"), self.private_project.logs[OSF_FIRST].date) assert_equal(res.json['data'][API_FIRST]['attributes']['action'], self.private_project.logs[OSF_FIRST].action) def test_add_addon(self): self.public_project.add_addon('github', auth=self.user_auth) assert_equal('addon_added', self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'addon_added') def test_project_add_remove_contributor(self): self.public_project.add_contributor(self.contrib, auth=self.user_auth) assert_equal('contributor_added', self.public_project.logs[OSF_LATEST].action) self.public_project.remove_contributor(self.contrib, auth=self.user_auth) assert_equal('contributor_removed', self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'contributor_removed') assert_equal(res.json['data'][1]['attributes']['action'], 'contributor_added') def test_remove_addon(self): self.public_project.add_addon('github', auth=self.user_auth) assert_equal('addon_added', self.public_project.logs[OSF_LATEST].action) self.public_project.delete_addon('github', auth=self.user_auth) assert_equal('addon_removed', self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'addon_removed') def test_add_pointer(self): self.public_project.add_pointer(self.pointer, auth=Auth(self.user), save=True) assert_equal('pointer_created', self.public_project.logs[OSF_LATEST].action) res = self.app.get(self.public_url, auth=self.user.auth) assert_equal(res.status_code, 200) assert_equal(len(res.json['data']), len(self.public_project.logs)) assert_equal(res.json['data'][API_LATEST]['attributes']['action'], 'pointer_created')
class TestFileGuid(OsfTestCase): def setUp(self): super(OsfTestCase, self).setUp() self.user = UserFactory() self.project = ProjectFactory(creator=self.user) self.project.add_addon("dropbox", auth=Auth(self.user)) self.node_addon = self.project.get_addon("dropbox") self.node_addon.folder = "/baz" self.node_addon.save() def test_provider(self): assert_equal("dropbox", DropboxFile().provider) def test_correct_path(self): guid = DropboxFile(node=self.project, path="baz/foo/bar") assert_equals(guid.path, "baz/foo/bar") assert_equals(guid.waterbutler_path, "/foo/bar") def test_path_doesnt_crash_without_addon(self): guid = DropboxFile(node=self.project, path="baz/foo/bar") self.project.delete_addon("dropbox", Auth(self.user)) assert_is(self.project.get_addon("dropbox"), None) assert_true(guid.path) assert_true(guid.waterbutler_path) def test_path_doesnt_crash_nonconfig_addon(self): guid = DropboxFile(node=self.project, path="baz/foo/bar") self.node_addon.folder = None self.node_addon.save() self.node_addon.reload() assert_true(guid.path) assert_true(guid.waterbutler_path) @mock.patch("website.addons.base.requests.get") def test_unique_identifier(self, mock_get): mock_response = mock.Mock(ok=True, status_code=200) mock_get.return_value = mock_response mock_response.json.return_value = {"data": {"name": "Morty", "extra": {"revisionId": "Ricksy"}}} guid = DropboxFile(node=self.project, path="/foo/bar") guid.enrich() assert_equals("Ricksy", guid.unique_identifier) def test_node_addon_get_or_create(self): guid, created = self.node_addon.find_or_create_file_guid("/foo/bar") assert_true(created) assert_equal(guid.path, "baz/foo/bar") assert_equal(guid.waterbutler_path, "/foo/bar") def test_node_addon_get_or_create_finds(self): guid1, created1 = self.node_addon.find_or_create_file_guid("/foo/bar") guid2, created2 = self.node_addon.find_or_create_file_guid("/foo/bar") assert_true(created1) assert_false(created2) assert_equals(guid1, guid2) def test_node_addon_get_or_create_finds_changed(self): guid1, created1 = self.node_addon.find_or_create_file_guid("/foo/bar") self.node_addon.folder = "/baz/foo" self.node_addon.save() self.node_addon.reload() guid2, created2 = self.node_addon.find_or_create_file_guid("/bar") assert_true(created1) assert_false(created2) assert_equals(guid1, guid2)