示例#1
0
    def test_import_auth(self):
        ea = self.ExternalAccountFactory()
        self.user.external_accounts.append(ea)
        self.user.save()

        node = ProjectFactory(creator=self.user)
        node_settings = node.get_or_add_addon(self.ADDON_SHORT_NAME, auth=Auth(self.user))
        node.save()
        url = node.api_url_for("{0}_import_auth".format(self.ADDON_SHORT_NAME))
        res = self.app.put_json(url, {"external_account_id": ea._id}, auth=self.user.auth)
        assert_equal(res.status_code, http.OK)
        assert_in("result", res.json)
        node_settings.reload()
        assert_equal(node_settings.external_account._id, ea._id)

        node.reload()
        last_log = node.logs[-1]
        assert_equal(last_log.action, "{0}_node_authorized".format(self.ADDON_SHORT_NAME))
示例#2
0
    def test_import_auth(self):
        ea = self.ExternalAccountFactory()
        self.user.external_accounts.append(ea)
        self.user.save()

        node = ProjectFactory(creator=self.user)
        node_settings = node.get_or_add_addon(self.ADDON_SHORT_NAME, auth=Auth(self.user))
        node.save()
        url = node.api_url_for('{0}_import_auth'.format(self.ADDON_SHORT_NAME))
        res = self.app.put_json(url, {
            'external_account_id': ea._id
        }, auth=self.user.auth)
        assert_equal(res.status_code, http.OK)
        assert_in('result', res.json)
        node_settings.reload()
        assert_equal(node_settings.external_account._id, ea._id)

        node.reload()
        last_log = node.logs.latest()
        assert_equal(last_log.action, '{0}_node_authorized'.format(self.ADDON_SHORT_NAME))
示例#3
0
class TestNodeSettings(OsfTestCase):

    ADDONS_UNDER_TEST = {
        MockOAuth2Provider.short_name: {
            'user_settings': MockUserSettings,
            'node_settings': MockNodeSettings,
        }
    }

    @classmethod
    def setUpClass(cls):
        super(TestNodeSettings, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(TestNodeSettings, cls).tearDownClass()

    def setUp(self):
        super(TestNodeSettings, self).setUp()
        self.project = ProjectFactory()
        self.user = self.project.creator
        self.node_settings = self.project.get_or_add_addon(
            MockNodeSettings.oauth_provider.short_name,
            auth=Auth(user=self.user)
        )
        self.user_settings = self.user.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name
        )
        self.external_account = ExternalAccountFactory()
        self.user.external_accounts.append(self.external_account)
        self.user.save()

    def test_has_auth_false(self):
        assert_false(self.node_settings.has_auth)

    def test_has_auth_no_grant(self):
        self.node_settings.external_account = self.external_account
        self.node_settings.user_settings = self.user_settings

        assert_false(self.node_settings.has_auth)

    def test_has_auth(self):
        self.node_settings.set_auth(
            external_account=self.external_account,
            user=self.user
        )

        assert_true(self.node_settings.has_auth)

    def test_set_auth(self):
        self.node_settings.set_auth(
            external_account=self.external_account,
            user=self.user
        )

        assert_equal(
            self.node_settings.external_account,
            self.external_account
        )
        assert_equal(
            self.node_settings.user_settings,
            self.user_settings
        )
        assert_in(
            self.project._id,
            self.user_settings.oauth_grants.keys()
        )

    def test_revoke_auth(self):
        self.node_settings.set_auth(
            external_account=self.external_account,
            user=self.user
        )
        self.user_settings.revoke_oauth_access(self.external_account)

        assert_equal(
            self.user_settings.oauth_grants,
            {self.project._id: {}}
        )

    def test_clear_auth(self):
        self.node_settings.external_account = self.external_account
        self.node_settings.user_settings = self.user_settings

        self.node_settings.clear_auth()

        assert_is_none(self.node_settings.external_account)
        assert_is_none(self.node_settings.user_settings)
示例#4
0
class TestUserSettings(OsfTestCase):

    ADDONS_UNDER_TEST = {
        MockOAuth2Provider.short_name: {
            'user_settings': MockUserSettings,
            'node_settings': MockNodeSettings,
        }
    }

    @classmethod
    def setUpClass(cls):
        super(TestUserSettings, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(TestUserSettings, cls).tearDownClass()

    def setUp(self):
        super(TestUserSettings, self).setUp()
        self.user = AuthUserFactory()

        self.user_settings = self.user.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name
        )

        self.external_account = ExternalAccountFactory()
        self.user.external_accounts.append(self.external_account)
        self.user.save()

        self.project = ProjectFactory(creator=self.user)

    def tearDown(self):
        super(TestUserSettings, self).tearDown()

    def test_connected_accounts_empty(self):
        self.user.external_accounts = []

        assert_equal(
            self.user_settings.external_accounts,
            []
        )

    def test_connected_accounts(self):
        assert_equal(
            self.user_settings.external_accounts,
            [self.external_account]
        )

    def test_verify_false_no_grants(self):
        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project
            )
        )

    def test_verify_false_with_grants(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=ProjectFactory()
        )

        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project
            )
        )

    def test_verify_false_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'}
        )

        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project,
                metadata={'baz': 'qiz'}
            )
        )

    def test_verify_true(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project
        )

        assert_true(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project
            )
        )

    def test_verify_true_with_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'}
        )

        assert_true(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project,
                metadata={'foo': 'bar'}
            )
        )

    def test_grant(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project
        )

        assert_equal(
            self.user_settings.oauth_grants,
            {
                self.project._id: {
                    self.external_account._id: {}
                }
            }
        )

    def test_grant_not_owned(self):
        self.user.external_accounts = []

        with assert_raises(PermissionsError):
            self.user_settings.grant_oauth_access(
                external_account=self.external_account,
                node=self.project
            )

        assert_equal(
            self.user_settings.oauth_grants,
            {}
        )

    def test_grant_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'}
        )

        assert_equal(
            self.user_settings.oauth_grants,
            {
                self.project._id: {
                    self.external_account._id: {'foo': 'bar'}
                }
            }
        )

    def test_on_delete(self):
        node_settings = self.project.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name,
            auth=Auth(user=self.user)
        )

        node_settings.set_auth(
            external_account=self.external_account,
            user=self.user
        )

        self.user.delete_addon(
            MockUserSettings.oauth_provider.short_name
        )

        node_settings.reload()

        assert_is_none(node_settings.external_account)
        assert_is_none(node_settings.user_settings)
示例#5
0
class TestNodeSettings(OsfTestCase):

    ADDONS_UNDER_TEST = {
        MockOAuth2Provider.short_name: {
            'user_settings': MockUserSettings,
            'node_settings': MockNodeSettings,
        }
    }

    @classmethod
    def setUpClass(cls):
        super(TestNodeSettings, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(TestNodeSettings, cls).tearDownClass()

    def setUp(self):
        super(TestNodeSettings, self).setUp()
        self.project = ProjectFactory()
        self.user = self.project.creator
        self.node_settings = self.project.get_or_add_addon(
            MockNodeSettings.oauth_provider.short_name,
            auth=Auth(user=self.user))
        self.user_settings = self.user.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name)
        self.external_account = ExternalAccountFactory()
        self.user.external_accounts.append(self.external_account)
        self.user.save()

    def test_has_auth_false(self):
        assert_false(self.node_settings.has_auth)

    def test_has_auth_no_grant(self):
        self.node_settings.external_account = self.external_account
        self.node_settings.user_settings = self.user_settings

        assert_false(self.node_settings.has_auth)

    def test_has_auth(self):
        self.node_settings.set_auth(external_account=self.external_account,
                                    user=self.user)

        assert_true(self.node_settings.has_auth)

    def test_set_auth(self):
        self.node_settings.set_auth(external_account=self.external_account,
                                    user=self.user)

        assert_equal(self.node_settings.external_account,
                     self.external_account)
        assert_equal(self.node_settings.user_settings, self.user_settings)
        assert_in(self.project._id, self.user_settings.oauth_grants.keys())

    @mock.patch('tests.test_addons_oauth.MockNodeSettings.deauthorize')
    @mock.patch('framework.auth.core._get_current_user')
    def test_revoke_auth(self, mock_decorator, mock_deauth):
        mock_decorator.return_value = self.user
        self.node_settings.set_auth(external_account=self.external_account,
                                    user=self.user)
        self.user_settings.revoke_oauth_access(self.external_account,
                                               auth=Auth(self.user))
        self.user_settings.reload()

        mock_deauth.assert_called()
        assert_equal(self.user_settings.oauth_grants, {self.project._id: {}})

    def test_clear_auth(self):
        self.node_settings.external_account = self.external_account
        self.node_settings.user_settings = self.user_settings

        self.node_settings.clear_auth()

        assert_is_none(self.node_settings.external_account)
        assert_is_none(self.node_settings.user_settings)
示例#6
0
class TestUserSettings(OsfTestCase):

    ADDONS_UNDER_TEST = {
        MockOAuth2Provider.short_name: {
            'user_settings': MockUserSettings,
            'node_settings': MockNodeSettings,
        }
    }

    @classmethod
    def setUpClass(cls):
        super(TestUserSettings, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(TestUserSettings, cls).tearDownClass()

    def setUp(self):
        super(TestUserSettings, self).setUp()
        self.user = AuthUserFactory()

        self.user_settings = self.user.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name)

        self.external_account = ExternalAccountFactory()
        self.user.external_accounts.append(self.external_account)
        self.user.save()

        self.project = ProjectFactory(creator=self.user)

    def tearDown(self):
        super(TestUserSettings, self).tearDown()

    def test_connected_accounts_empty(self):
        self.user.external_accounts = []

        assert_equal(self.user_settings.external_accounts, [])

    def test_connected_accounts(self):
        assert_equal(self.user_settings.external_accounts,
                     [self.external_account])

    def test_verify_false_no_grants(self):
        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account, node=self.project))

    def test_verify_false_with_grants(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account, node=ProjectFactory())

        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account, node=self.project))

    def test_verify_false_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'})

        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project,
                metadata={'baz': 'qiz'}))

    def test_verify_true(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account, node=self.project)

        assert_true(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account, node=self.project))

    def test_verify_true_with_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'})

        assert_true(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project,
                metadata={'foo': 'bar'}))

    def test_grant(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account, node=self.project)

        assert_equal(self.user_settings.oauth_grants,
                     {self.project._id: {
                         self.external_account._id: {}
                     }})

    def test_grant_not_owned(self):
        self.user.external_accounts = []

        with assert_raises(PermissionsError):
            self.user_settings.grant_oauth_access(
                external_account=self.external_account, node=self.project)

        assert_equal(self.user_settings.oauth_grants, {})

    def test_grant_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'})

        assert_equal(
            self.user_settings.oauth_grants,
            {self.project._id: {
                self.external_account._id: {
                    'foo': 'bar'
                }
            }})

    @mock.patch(
        'tests.test_addons_oauth.MockUserSettings.revoke_remote_oauth_access')
    @mock.patch('framework.auth.core._get_current_user')
    def test_revoke_remote_access_called(self, mock_decorator, mock_revoke):
        mock_decorator.return_value = self.user
        self.user_settings.delete()
        assert_equal(mock_revoke.call_count, 1)

    @mock.patch(
        'tests.test_addons_oauth.MockUserSettings.revoke_remote_oauth_access')
    @mock.patch('framework.auth.core._get_current_user')
    def test_revoke_remote_access_not_called(self, mock_decorator,
                                             mock_revoke):
        mock_decorator.return_value = self.user
        user2 = AuthUserFactory()
        user2.external_accounts.append(self.external_account)
        user2.save()
        self.user_settings.delete()
        assert_equal(mock_revoke.call_count, 0)

    def test_on_delete(self):
        node_settings = self.project.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name,
            auth=Auth(user=self.user))

        node_settings.set_auth(external_account=self.external_account,
                               user=self.user)

        self.user.delete_addon(MockUserSettings.oauth_provider.short_name)

        node_settings.reload()

        assert_is_none(node_settings.external_account)
        assert_is_none(node_settings.user_settings)
class TestNodeSettings(OsfTestCase):

    ADDONS_UNDER_TEST = {
        MockOAuth2Provider.short_name: {
            'user_settings': MockUserSettings,
            'node_settings': MockNodeSettings,
        }
    }

    @classmethod
    def setUpClass(cls):
        super(TestNodeSettings, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(TestNodeSettings, cls).tearDownClass()

    def setUp(self):
        super(TestNodeSettings, self).setUp()
        self.project = ProjectFactory()
        self.user = self.project.creator
        self.node_settings = self.project.get_or_add_addon(
            MockNodeSettings.oauth_provider.short_name,
            auth=Auth(user=self.user)
        )
        self.user_settings = self.user.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name
        )
        self.external_account = ExternalAccountFactory()
        self.user.external_accounts.append(self.external_account)
        self.user.save()

    def test_has_auth_false(self):
        assert_false(self.node_settings.has_auth)

    def test_has_auth_no_grant(self):
        self.node_settings.external_account = self.external_account
        self.node_settings.user_settings = self.user_settings

        assert_false(self.node_settings.has_auth)

    def test_has_auth(self):
        self.node_settings.set_auth(
            external_account=self.external_account,
            user=self.user
        )

        assert_true(self.node_settings.has_auth)

    def test_set_auth(self):
        self.node_settings.set_auth(
            external_account=self.external_account,
            user=self.user
        )

        assert_equal(
            self.node_settings.external_account,
            self.external_account
        )
        assert_equal(
            self.node_settings.user_settings,
            self.user_settings
        )
        assert_in(
            self.project._id,
            self.user_settings.oauth_grants.keys()
        )

    @mock.patch('tests.test_addons_oauth.MockNodeSettings.deauthorize')
    @mock.patch('framework.auth.core._get_current_user')
    def test_revoke_auth(self, mock_decorator, mock_deauth):
        mock_decorator.return_value = self.user
        self.node_settings.set_auth(
            external_account=self.external_account,
            user=self.user
        )
        self.user_settings.revoke_oauth_access(self.external_account, auth=Auth(self.user))
        self.user_settings.reload()

        mock_deauth.assert_called()
        assert_equal(
            self.user_settings.oauth_grants,
            {self.project._id: {}}
        )

    def test_clear_auth(self):
        self.node_settings.external_account = self.external_account
        self.node_settings.user_settings = self.user_settings

        self.node_settings.clear_auth()

        assert_is_none(self.node_settings.external_account)
        assert_is_none(self.node_settings.user_settings)
示例#8
0
class ApiAddonTestCase(ApiTestCase):
    """Base `TestCase` for tests that require interaction with addons.

    """

    @abc.abstractproperty
    def short_name(self):
        pass

    @abc.abstractproperty
    def addon_type(self):
        pass

    @abc.abstractmethod
    def _apply_auth_configuration(self):
        pass

    @abc.abstractmethod
    def _set_urls(self):
        pass

    def _settings_kwargs(self, node, user_settings):
        return {"user_settings": self.user_settings, "folder_id": "1234567890", "owner": self.node}

    def setUp(self):
        super(ApiAddonTestCase, self).setUp()
        from tests.factories import ProjectFactory, AuthUserFactory
        from website.addons.base import (
            AddonOAuthNodeSettingsBase,
            AddonNodeSettingsBase,
            AddonOAuthUserSettingsBase,
            AddonUserSettingsBase,
        )

        assert self.addon_type in ("CONFIGURABLE", "OAUTH", "UNMANAGEABLE", "INVALID")
        self.account = None
        self.node_settings = None
        self.user_settings = None
        self.user = AuthUserFactory()
        self.auth = Auth(self.user)
        self.node = ProjectFactory(creator=self.user)

        if self.addon_type not in ("UNMANAGEABLE", "INVALID"):
            if self.addon_type in ("OAUTH", "CONFIGURABLE"):
                self.account = self.AccountFactory()
                self.user.external_accounts.append(self.account)
                self.user.save()

            self.user_settings = self.user.get_or_add_addon(self.short_name)
            self.node_settings = self.node.get_or_add_addon(self.short_name, auth=self.auth)

            if self.addon_type in ("OAUTH", "CONFIGURABLE"):
                self.node_settings.set_auth(self.account, self.user)
                self._apply_auth_configuration()

        if self.addon_type in ("OAUTH", "CONFIGURABLE"):
            assert isinstance(self.node_settings, AddonOAuthNodeSettingsBase)
            assert isinstance(self.user_settings, AddonOAuthUserSettingsBase)

        self.account_id = self.account._id if self.account else None
        self.set_urls()

    def tearDown(self):
        super(ApiAddonTestCase, self).tearDown()
        self.user.remove()
        self.node.remove()
        if self.node_settings:
            self.node_settings.remove()
        if self.user_settings:
            self.user_settings.remove()
        if self.account:
            self.account.remove()
示例#9
0
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)
示例#10
0
class ApiAddonTestCase(ApiTestCase):
    """Base `TestCase` for tests that require interaction with addons.

    """
    @abc.abstractproperty
    def short_name(self):
        pass

    @abc.abstractproperty
    def addon_type(self):
        pass

    @abc.abstractmethod
    def _apply_auth_configuration(self):
        pass

    @abc.abstractmethod
    def _set_urls(self):
        pass

    def _settings_kwargs(self, node, user_settings):
        return {
            'user_settings': self.user_settings,
            'folder_id': '1234567890',
            'owner': self.node
        }

    def setUp(self):
        super(ApiAddonTestCase, self).setUp()
        from tests.factories import (
            ProjectFactory,
            AuthUserFactory,
        )
        from website.addons.base import (AddonOAuthNodeSettingsBase,
                                         AddonNodeSettingsBase,
                                         AddonOAuthUserSettingsBase,
                                         AddonUserSettingsBase)
        assert self.addon_type in ('CONFIGURABLE', 'OAUTH', 'UNMANAGEABLE',
                                   'INVALID')
        self.account = None
        self.node_settings = None
        self.user_settings = None
        self.user = AuthUserFactory()
        self.auth = Auth(self.user)
        self.node = ProjectFactory(creator=self.user)

        if self.addon_type not in ('UNMANAGEABLE', 'INVALID'):
            if self.addon_type in ('OAUTH', 'CONFIGURABLE'):
                self.account = self.AccountFactory()
                self.user.external_accounts.append(self.account)
                self.user.save()

            self.user_settings = self.user.get_or_add_addon(self.short_name)
            self.node_settings = self.node.get_or_add_addon(self.short_name,
                                                            auth=self.auth)

            if self.addon_type in ('OAUTH', 'CONFIGURABLE'):
                self.node_settings.set_auth(self.account, self.user)
                self._apply_auth_configuration()

        if self.addon_type in ('OAUTH', 'CONFIGURABLE'):
            assert isinstance(self.node_settings, AddonOAuthNodeSettingsBase)
            assert isinstance(self.user_settings, AddonOAuthUserSettingsBase)

        self.account_id = self.account._id if self.account else None
        self.set_urls()

    def tearDown(self):
        super(ApiAddonTestCase, self).tearDown()
        self.user.remove()
        self.node.remove()
        if self.node_settings:
            self.node_settings.remove()
        if self.user_settings:
            self.user_settings.remove()
        if self.account:
            self.account.remove()
示例#11
0
class TestNodeSettings(OsfTestCase):
    @classmethod
    def setUpClass(cls):
        init_mock_addon()
        super(TestNodeSettings, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        remove_mock_addon()
        super(TestNodeSettings, cls).tearDownClass()

    def setUp(self):
        super(TestNodeSettings, self).setUp()
        self.project = ProjectFactory()
        self.user = self.project.creator
        self.node_settings = self.project.get_or_add_addon(
            MockNodeSettings.oauth_provider.short_name,
            auth=Auth(user=self.user))
        self.user_settings = self.user.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name)
        self.external_account = ExternalAccountFactory()
        self.user.external_accounts.append(self.external_account)
        self.user.save()

    def test_has_auth_false(self):
        assert_false(self.node_settings.has_auth)

    def test_has_auth_no_grant(self):
        self.node_settings.external_account = self.external_account
        self.node_settings.user_settings = self.user_settings

        assert_false(self.node_settings.has_auth)

    def test_has_auth(self):
        self.node_settings.set_auth(external_account=self.external_account,
                                    user=self.user)

        assert_true(self.node_settings.has_auth)

    def test_set_auth(self):
        self.node_settings.set_auth(external_account=self.external_account,
                                    user=self.user)

        assert_equal(self.node_settings.external_account,
                     self.external_account)
        assert_equal(self.node_settings.user_settings, self.user_settings)
        assert_in(self.project._id, self.user_settings.oauth_grants.keys())

    def test_revoke_auth(self):
        self.node_settings.set_auth(external_account=self.external_account,
                                    user=self.user)
        self.user_settings.revoke_oauth_access(self.external_account)

        assert_equal(self.user_settings.oauth_grants, {self.project._id: {}})

    def test_clear_auth(self):
        self.node_settings.external_account = self.external_account
        self.node_settings.user_settings = self.user_settings

        self.node_settings.clear_auth()

        assert_is_none(self.node_settings.external_account)
        assert_is_none(self.node_settings.user_settings)
示例#12
0
class TestUserSettings(OsfTestCase):
    @classmethod
    def setUpClass(cls):
        init_mock_addon()
        super(TestUserSettings, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        remove_mock_addon()
        super(TestUserSettings, cls).tearDownClass()

    def setUp(self):
        super(TestUserSettings, self).setUp()
        self.user = AuthUserFactory()

        self.user_settings = self.user.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name)

        self.external_account = ExternalAccountFactory()
        self.user.external_accounts.append(self.external_account)
        self.user.save()

        self.project = ProjectFactory(creator=self.user)

    def tearDown(self):
        super(TestUserSettings, self).tearDown()

    def test_connected_accounts_empty(self):
        self.user.external_accounts = []

        assert_equal(self.user_settings.external_accounts, [])

    def test_connected_accounts(self):
        assert_equal(self.user_settings.external_accounts,
                     [self.external_account])

    def test_verify_false_no_grants(self):
        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account, node=self.project))

    def test_verify_false_with_grants(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account, node=ProjectFactory())

        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account, node=self.project))

    def test_verify_false_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'})

        assert_false(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project,
                metadata={'baz': 'qiz'}))

    def test_verify_true(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account, node=self.project)

        assert_true(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account, node=self.project))

    def test_verify_true_with_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'})

        assert_true(
            self.user_settings.verify_oauth_access(
                external_account=self.external_account,
                node=self.project,
                metadata={'foo': 'bar'}))

    def test_grant(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account, node=self.project)

        assert_equal(self.user_settings.oauth_grants,
                     {self.project._id: {
                         self.external_account._id: {}
                     }})

    def test_grant_not_owned(self):
        self.user.external_accounts = []

        with assert_raises(PermissionsError):
            self.user_settings.grant_oauth_access(
                external_account=self.external_account, node=self.project)

        assert_equal(self.user_settings.oauth_grants, {})

    def test_grant_metadata(self):
        self.user_settings.grant_oauth_access(
            external_account=self.external_account,
            node=self.project,
            metadata={'foo': 'bar'})

        assert_equal(
            self.user_settings.oauth_grants,
            {self.project._id: {
                self.external_account._id: {
                    'foo': 'bar'
                }
            }})

    def test_on_delete(self):
        node_settings = self.project.get_or_add_addon(
            MockUserSettings.oauth_provider.short_name,
            auth=Auth(user=self.user))

        node_settings.set_auth(external_account=self.external_account,
                               user=self.user)

        self.user.delete_addon(MockUserSettings.oauth_provider.short_name)

        node_settings.reload()

        assert_is_none(node_settings.external_account)
        assert_is_none(node_settings.user_settings)