class TestViews(OsfTestCase): def setUp(self): super(TestViews, self).setUp() self.user = AuthUserFactory() self.user_addon = self.user.get_or_add_addon('twofactor') self.user_settings = self.user.get_addon('twofactor') def test_confirm_code(self): # Send a valid code to the API endpoint for the user settings. url = api_url_for('twofactor_settings_put') res = self.app.put_json( url, {'code': _valid_code(self.user_settings.totp_secret)}, auth=self.user.auth) # reload the user settings object from the DB self.user_settings.reload() assert_true(self.user_settings.is_confirmed) assert_equal(res.status_code, 200) def test_confirm_code_failure(self): url = api_url_for('twofactor_settings_put') res = self.app.put_json(url, {'code': '0000000'}, auth=self.user.auth, expect_errors=True) assert_equal(res.status_code, 403) json = res.json assert_in('verification code', json['message_long']) # reload the user settings object from the DB self.user_settings.reload() assert_false(self.user_settings.is_confirmed)
class TestRemove2Factor(AdminTestCase): def setUp(self): super(TestRemove2Factor, self).setUp() self.user = AuthUserFactory() self.request = RequestFactory().post('/fake_path') self.view = views.User2FactorDeleteView self.setup_view = setup_log_view(self.view(), self.request, guid=self.user._id) self.url = reverse('users:remove2factor', kwargs={'guid': self.user._id}) @mock.patch('osf.models.user.OSFUser.delete_addon') def test_remove_two_factor_get(self, mock_delete_addon): self.setup_view.delete(self.request) mock_delete_addon.assert_called_with('twofactor') def test_integration_delete_two_factor(self): user_addon = self.user.get_or_add_addon('twofactor') nt.assert_not_equal(user_addon, None) user_settings = self.user.get_addon('twofactor') nt.assert_not_equal(user_settings, None) count = AdminLogEntry.objects.count() self.setup_view.delete(self.request) post_addon = self.user.get_addon('twofactor') nt.assert_equal(post_addon, None) nt.assert_equal(AdminLogEntry.objects.count(), count + 1) def test_no_user_permissions_raises_error(self): guid = self.user._id request = RequestFactory().get(self.url) request.user = self.user with self.assertRaises(PermissionDenied): self.view.as_view()(request, guid=guid) def test_correct_view_permissions(self): guid = self.user._id change_permission = Permission.objects.get(codename='change_osfuser') self.user.user_permissions.add(change_permission) self.user.save() request = RequestFactory().get(self.url) request.user = self.user response = self.view.as_view()(request, guid=guid) self.assertEqual(response.status_code, 200)
class TestViews(OsfTestCase): def setUp(self): super(TestViews, self).setUp() self.user = AuthUserFactory() self.user_addon = self.user.get_or_add_addon('twofactor') self.user_settings = self.user.get_addon('twofactor') def test_confirm_code(self): # Send a valid code to the API endpoint for the user settings. url = api_url_for('twofactor_settings_put') res = self.app.put_json( url, {'code': _valid_code(self.user_settings.totp_secret)}, auth=self.user.auth ) # reload the user settings object from the DB self.user_settings.reload() assert_true(self.user_settings.is_confirmed) assert_equal(res.status_code, 200) def test_confirm_code_failure(self): url = api_url_for('twofactor_settings_put') res = self.app.put_json( url, {'code': '0000000'}, auth=self.user.auth, expect_errors=True ) assert_equal(res.status_code, 403) json = res.json assert_in('verification code', json['message_long']) # reload the user settings object from the DB self.user_settings.reload() assert_false(self.user_settings.is_confirmed)
class TestRemove2Factor(AdminTestCase): def setUp(self): super(TestRemove2Factor, self).setUp() self.user = AuthUserFactory() self.request = RequestFactory().post('/fake_path') self.view = User2FactorDeleteView() self.view = setup_log_view(self.view, self.request, guid=self.user._id) @mock.patch('osf.models.user.OSFUser.delete_addon') def test_remove_two_factor_get(self, mock_delete_addon): self.view.delete(self.request) mock_delete_addon.assert_called_with('twofactor') def test_integration_delete_two_factor(self): user_addon = self.user.get_or_add_addon('twofactor') nt.assert_not_equal(user_addon, None) user_settings = self.user.get_addon('twofactor') nt.assert_not_equal(user_settings, None) count = AdminLogEntry.objects.count() self.view.delete(self.request) post_addon = self.user.get_addon('twofactor') nt.assert_equal(post_addon, None) nt.assert_equal(AdminLogEntry.objects.count(), count + 1)
class ApiAddonTestCase(ApiTestCase): """Base `TestCase` for tests that require interaction with addons. """ DISABLE_OUTGOING_CONNECTIONS = True @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 osf_tests.factories import ( ProjectFactory, AuthUserFactory, ) from addons.base.models import (BaseOAuthNodeSettings, BaseOAuthUserSettings) 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.add(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, BaseOAuthNodeSettings) assert isinstance(self.user_settings, BaseOAuthUserSettings) self.node_settings.reload() self.user_settings.reload() 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()
class TestBasicAuthenticationValidation(ApiTestCase): """Test that APIv2 requests can validate and respond to Basic Authentication""" TOTP_SECRET = 'b8f85986068f8079aa9d' def setUp(self): super(TestBasicAuthenticationValidation, self).setUp() self.user1 = AuthUserFactory() self.user2 = AuthUserFactory() # Test projects for which a given user DOES and DOES NOT have # appropriate permissions self.reachable_project = ProjectFactory( title='Private Project User 1', is_public=False, creator=self.user1 ) self.unreachable_project = ProjectFactory( title='Private Project User 2', is_public=False, creator=self.user2 ) self.reachable_url = '/{}nodes/{}/'.format( API_BASE, self.reachable_project._id ) # User1 can't access this self.unreachable_url = '/{}nodes/{}/'.format( API_BASE, self.unreachable_project._id ) def test_missing_credential_fails(self): res = self.app.get(self.unreachable_url, auth=None, expect_errors=True) assert_equal(res.status_code, 401) assert_equal( res.json.get('errors')[0]['detail'], 'Authentication credentials were not provided.' ) def test_invalid_credential_fails(self): res = self.app.get( self.unreachable_url, auth=(self.user1.username, 'invalid password'), expect_errors=True ) assert_equal(res.status_code, 401) assert_equal( res.json.get('errors')[0]['detail'], 'Invalid username/password.' ) def test_valid_credential_authenticates_and_has_permissions(self): res = self.app.get(self.reachable_url, auth=self.user1.auth) assert_equal(res.status_code, 200, msg=res.json) def test_valid_credential_authenticates_but_user_lacks_object_permissions( self): res = self.app.get( self.unreachable_url, auth=self.user1.auth, expect_errors=True ) assert_equal(res.status_code, 403, msg=res.json) def test_valid_credential_but_twofactor_required(self): user1_addon = self.user1.get_or_add_addon('twofactor') user1_addon.totp_drift = 1 user1_addon.totp_secret = self.TOTP_SECRET user1_addon.is_confirmed = True user1_addon.save() res = self.app.get( self.reachable_url, auth=self.user1.auth, expect_errors=True ) assert_equal(res.status_code, 401) assert_equal(res.headers['X-OSF-OTP'], 'required; app') assert_equal( res.json.get('errors')[0]['detail'], 'Must specify two-factor authentication OTP code.' ) def test_valid_credential_twofactor_invalid_otp(self): user1_addon = self.user1.get_or_add_addon('twofactor') user1_addon.totp_drift = 1 user1_addon.totp_secret = self.TOTP_SECRET user1_addon.is_confirmed = True user1_addon.save() res = self.app.get( self.reachable_url, auth=self.user1.auth, headers={'X-OSF-OTP': 'invalid otp'}, expect_errors=True ) assert_equal(res.status_code, 401) assert_true('X-OSF-OTP' not in res.headers) assert_equal( res.json.get('errors')[0]['detail'], 'Invalid two-factor authentication OTP code.' ) def test_valid_credential_twofactor_valid_otp(self): user1_addon = self.user1.get_or_add_addon('twofactor') user1_addon.totp_drift = 1 user1_addon.totp_secret = self.TOTP_SECRET user1_addon.is_confirmed = True user1_addon.save() res = self.app.get( self.reachable_url, auth=self.user1.auth, headers={'X-OSF-OTP': _valid_code(self.TOTP_SECRET)} ) assert_equal(res.status_code, 200)
class ApiAddonTestCase(ApiTestCase): """Base `TestCase` for tests that require interaction with addons. """ DISABLE_OUTGOING_CONNECTIONS = True @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 osf_tests.factories import ( ProjectFactory, AuthUserFactory, ) from addons.base.models import ( BaseOAuthNodeSettings, BaseOAuthUserSettings ) 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.add(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, BaseOAuthNodeSettings) assert isinstance(self.user_settings, BaseOAuthUserSettings) self.node_settings.reload() self.user_settings.reload() self.account_id = self.account._id if self.account else None self.set_urls() def tearDown(self): super(ApiAddonTestCase, self).tearDown() self.user.delete() self.node.delete() if self.account: self.account.delete()
class TestAddonCount(OsfTestCase): def setUp(self): super(TestAddonCount, self).setUp() self.user = AuthUserFactory() self.node = ProjectFactory(creator=self.user) self.user.add_addon('github') self.user_addon = self.user.get_addon('github') self.external_account = GitHubAccountFactory(display_name='hmoco1') self.user_settings = self.user.get_or_add_addon('github') self.user_settings.save() self.user.external_accounts.add(self.external_account) self.user.save() self.node.add_addon('github', Auth(self.user)) self.node_addon = self.node.get_addon('github') self.node_addon.user = self.user.fullname self.node_addon.repo = '29 #Strafford APTS' self.node_addon.user_settings = self.user_addon self.node_addon.external_account = self.external_account self.node_addon.save() self.user_settings.grant_oauth_access( node=self.node, external_account=self.external_account, ) def test_run_for_all_addon(self): results = AddonSnapshot().get_events() names = [res['provider']['name'] for res in results] for addon in ADDONS_AVAILABLE: assert_in(addon.short_name, names) def test_one_user_one_node_one_addon(self): results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['users']['enabled'], 1) assert_equal(github_res['nodes']['total'], 1) def test_one_user_one_node_one_addon_one_node_linked(self): results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['users']['enabled'], 1) assert_equal(github_res['nodes']['total'], 1) def test_one_user_with_multiple_githubs(self): oauth_settings2 = GitHubAccountFactory(display_name='hmoco2') oauth_settings2.save() self.user.external_accounts.add(oauth_settings2) self.user.save() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['users']['enabled'], 1) def test_one_user_with_multiple_addons(self): results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] googledrive_res = [res for res in results if res['provider']['name'] == 'googledrive'][0] assert_equal(github_res['users']['enabled'], 1) assert_equal(googledrive_res['users']['enabled'], 0) self.user.add_addon('googledrive') oauth_settings = GoogleDriveAccountFactory() oauth_settings.save() self.user.external_accounts.add(oauth_settings) self.user.save() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] googledrive_res = [res for res in results if res['provider']['name'] == 'googledrive'][0] assert_equal(github_res['users']['enabled'], 1) assert_equal(googledrive_res['users']['enabled'], 1) def test_many_users_each_with_a_different_github(self): user = AuthUserFactory() user.add_addon('github') oauth_settings2 = GitHubAccountFactory(display_name='hmoco2') oauth_settings2.save() user.external_accounts.add(oauth_settings2) user.save() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['users']['enabled'], 2) assert_equal(github_res['users']['authorized'], 1) assert_equal(github_res['users']['linked'], 1) def test_many_users_each_with_the_same_github_enabled(self): user = AuthUserFactory() user.add_addon('github') user.external_accounts.add(self.external_account) user.save() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['users']['enabled'], 2) def test_github_enabled_not_linked_or_authorized(self): user = AuthUserFactory() user.add_addon('github') user.external_accounts.add(self.external_account) user.save() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['users']['enabled'], 2) assert_equal(github_res['users']['authorized'], 1) assert_equal(github_res['users']['linked'], 1) def test_one_node_with_multiple_addons(self): results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] googledrive_res = [res for res in results if res['provider']['name'] == 'googledrive'][0] assert_equal(github_res['nodes']['total'], 1) assert_equal(googledrive_res['nodes']['total'], 0) self.user.add_addon('googledrive') user_addon = self.user.get_addon('googledrive') oauth_settings = GoogleDriveAccountFactory() oauth_settings.save() self.user.external_accounts.add(oauth_settings) self.user.save() self.node.add_addon('googledrive', Auth(self.user)) node_addon = self.node.get_addon('googledrive') node_addon.user = self.user.fullname node_addon.user_settings = user_addon node_addon.external_account = oauth_settings node_addon.save() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] googledrive_res = [res for res in results if res['provider']['name'] == 'googledrive'][0] assert_equal(github_res['nodes']['total'], 1) assert_equal(googledrive_res['nodes']['total'], 1) def test_many_nodes_with_one_addon(self): results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['nodes']['total'], 1) node = ProjectFactory(creator=self.user) node.add_addon('github', Auth(self.user)) node_addon = node.get_addon('github') node_addon.user = self.user.fullname node_addon.repo = '8 (circle)' node_addon.user_settings = self.user_addon node_addon.external_account = self.external_account node_addon.save() node.save() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['nodes']['total'], 2) def test_node_count_deleted_addon(self): results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['nodes']['deleted'], 0) node = ProjectFactory(creator=self.user) node.add_addon('github', Auth(self.user)) node_addon = node.get_addon('github') node_addon.delete() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['nodes']['deleted'], 1) def test_node_count_disconected_addon(self): results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['nodes']['disconnected'], 0) node = ProjectFactory(creator=self.user) node.add_addon('github', Auth(self.user)) node_addon = node.get_addon('github') node_addon.external_account = None node_addon.save() results = AddonSnapshot().get_events() github_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(github_res['nodes']['disconnected'], 1) def test_all_users_have_wiki_osfstorage_enabled(self): all_user_count = OSFUser.objects.all().count() results = AddonSnapshot().get_events() osfstorage_res = [res for res in results if res['provider']['name'] == 'osfstorage'][0] wiki_res = [res for res in results if res['provider']['name'] == 'osfstorage'][0] assert_equal(osfstorage_res['users']['enabled'], all_user_count) assert_equal(wiki_res['users']['enabled'], all_user_count) 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_node_settings_has_no_owner_not_connected(self): self.node_addon.owner = None self.node_addon.save() results = AddonSnapshot().get_events() storage_res = [res for res in results if res['provider']['name'] == 'github'][0] assert_equal(storage_res['nodes']['connected'], 0)
class TestAuthBasicAuthentication(OsfTestCase): TOTP_SECRET = 'b8f85986068f8079aa9d' def setUp(self): super(TestAuthBasicAuthentication, self).setUp() self.user1 = AuthUserFactory() self.user2 = AuthUserFactory() # Test projects for which a given user DOES and DOES NOT have appropriate permissions self.reachable_project = ProjectFactory(title='Private Project User 1', is_public=False, creator=self.user1) self.unreachable_project = ProjectFactory(title='Private Project User 2', is_public=False, creator=self.user2) self.reachable_url = self.reachable_project.web_url_for('view_project') self.unreachable_url = self.unreachable_project.web_url_for('view_project') def test_missing_credential_fails(self): res = self.app.get(self.unreachable_url, auth=None, expect_errors=True) assert_equal(res.status_code, 302) assert_true('Location' in res.headers) assert_true('/login' in res.headers['Location']) def test_invalid_credential_fails(self): res = self.app.get(self.unreachable_url, auth=(self.user1.username, 'invalid password'), expect_errors=True) assert_equal(res.status_code, 401) assert_true('<h2 id=\'error\' data-http-status-code="401">Unauthorized</h2>' in res.body) def test_valid_credential_authenticates_and_has_permissions(self): res = self.app.get(self.reachable_url, auth=self.user1.auth) assert_equal(res.status_code, 200) def test_valid_credential_authenticates_but_user_lacks_object_permissions(self): res = self.app.get(self.unreachable_url, auth=self.user1.auth, expect_errors=True) assert_equal(res.status_code, 403) def test_valid_credential_but_twofactor_required(self): user1_addon = self.user1.get_or_add_addon('twofactor') user1_addon.totp_drift = 1 user1_addon.totp_secret = self.TOTP_SECRET user1_addon.is_confirmed = True user1_addon.save() res = self.app.get(self.reachable_url, auth=self.user1.auth, expect_errors=True) assert_equal(res.status_code, 401) assert_true('<h2 id=\'error\' data-http-status-code="401">Unauthorized</h2>' in res.body) def test_valid_credential_twofactor_invalid_otp(self): user1_addon = self.user1.get_or_add_addon('twofactor') user1_addon.totp_drift = 1 user1_addon.totp_secret = self.TOTP_SECRET user1_addon.is_confirmed = True user1_addon.save() res = self.app.get(self.reachable_url, auth=self.user1.auth, headers={'X-OSF-OTP': 'invalid otp'}, expect_errors=True) assert_equal(res.status_code, 401) assert_true('<h2 id=\'error\' data-http-status-code="401">Unauthorized</h2>' in res.body) def test_valid_credential_twofactor_valid_otp(self): user1_addon = self.user1.get_or_add_addon('twofactor') user1_addon.totp_drift = 1 user1_addon.totp_secret = self.TOTP_SECRET user1_addon.is_confirmed = True user1_addon.save() res = self.app.get(self.reachable_url, auth=self.user1.auth, headers={'X-OSF-OTP': _valid_code(self.TOTP_SECRET)}) assert_equal(res.status_code, 200) def test_valid_cookie(self): cookie = self.user1.get_or_create_cookie() self.app.set_cookie(settings.COOKIE_NAME, str(cookie)) res = self.app.get(self.reachable_url) assert_equal(res.status_code, 200) def test_expired_cookie(self): self.session = SessionFactory(user=self.user1) with connection.cursor() as cursor: cursor.execute(""" UPDATE osf_session SET date_created = %s WHERE id = %s """, [(timezone.now() - timedelta(seconds=settings.OSF_SESSION_TIMEOUT)), self.session.id]) cookie = self.user1.get_or_create_cookie() self.app.set_cookie(settings.COOKIE_NAME, str(cookie)) res = self.app.get(self.reachable_url) assert_equal(res.status_code, 302) assert_in('login', res.location)
class TestAddonCount(OsfTestCase): def setUp(self): super(TestAddonCount, self).setUp() self.user = AuthUserFactory() self.node = ProjectFactory(creator=self.user) self.user.add_addon('github') self.user_addon = self.user.get_addon('github') self.external_account = GitHubAccountFactory(display_name='hmoco1') self.user_settings = self.user.get_or_add_addon('github') self.user_settings.save() self.user.external_accounts.add(self.external_account) self.user.save() self.node.add_addon('github', Auth(self.user)) self.node_addon = self.node.get_addon('github') self.node_addon.user = self.user.fullname self.node_addon.repo = '29 #Strafford APTS' self.node_addon.user_settings = self.user_addon self.node_addon.external_account = self.external_account self.node_addon.save() self.user_settings.grant_oauth_access( node=self.node, external_account=self.external_account, ) def test_run_for_all_addon(self): results = AddonSnapshot().get_events() names = [res['provider']['name'] for res in results] for addon in ADDONS_AVAILABLE: assert_in(addon.short_name, names) def test_one_user_one_node_one_addon(self): results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['users']['enabled'], 1) assert_equal(github_res['nodes']['total'], 1) def test_one_user_one_node_one_addon_one_node_linked(self): results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['users']['enabled'], 1) assert_equal(github_res['nodes']['total'], 1) def test_one_user_with_multiple_githubs(self): oauth_settings2 = GitHubAccountFactory(display_name='hmoco2') oauth_settings2.save() self.user.external_accounts.add(oauth_settings2) self.user.save() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['users']['enabled'], 1) def test_one_user_with_multiple_addons(self): results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] googledrive_res = [ res for res in results if res['provider']['name'] == 'googledrive' ][0] assert_equal(github_res['users']['enabled'], 1) assert_equal(googledrive_res['users']['enabled'], 0) self.user.add_addon('googledrive') oauth_settings = GoogleDriveAccountFactory() oauth_settings.save() self.user.external_accounts.add(oauth_settings) self.user.save() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] googledrive_res = [ res for res in results if res['provider']['name'] == 'googledrive' ][0] assert_equal(github_res['users']['enabled'], 1) assert_equal(googledrive_res['users']['enabled'], 1) def test_many_users_each_with_a_different_github(self): user = AuthUserFactory() user.add_addon('github') oauth_settings2 = GitHubAccountFactory(display_name='hmoco2') oauth_settings2.save() user.external_accounts.add(oauth_settings2) user.save() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['users']['enabled'], 2) assert_equal(github_res['users']['authorized'], 1) assert_equal(github_res['users']['linked'], 1) def test_many_users_each_with_the_same_github_enabled(self): user = AuthUserFactory() user.add_addon('github') user.external_accounts.add(self.external_account) user.save() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['users']['enabled'], 2) def test_github_enabled_not_linked_or_authorized(self): user = AuthUserFactory() user.add_addon('github') user.external_accounts.add(self.external_account) user.save() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['users']['enabled'], 2) assert_equal(github_res['users']['authorized'], 1) assert_equal(github_res['users']['linked'], 1) def test_one_node_with_multiple_addons(self): results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] googledrive_res = [ res for res in results if res['provider']['name'] == 'googledrive' ][0] assert_equal(github_res['nodes']['total'], 1) assert_equal(googledrive_res['nodes']['total'], 0) self.user.add_addon('googledrive') user_addon = self.user.get_addon('googledrive') oauth_settings = GoogleDriveAccountFactory() oauth_settings.save() self.user.external_accounts.add(oauth_settings) self.user.save() self.node.add_addon('googledrive', Auth(self.user)) node_addon = self.node.get_addon('googledrive') node_addon.user = self.user.fullname node_addon.user_settings = user_addon node_addon.external_account = oauth_settings node_addon.save() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] googledrive_res = [ res for res in results if res['provider']['name'] == 'googledrive' ][0] assert_equal(github_res['nodes']['total'], 1) assert_equal(googledrive_res['nodes']['total'], 1) def test_many_nodes_with_one_addon(self): results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['nodes']['total'], 1) node = ProjectFactory(creator=self.user) node.add_addon('github', Auth(self.user)) node_addon = node.get_addon('github') node_addon.user = self.user.fullname node_addon.repo = '8 (circle)' node_addon.user_settings = self.user_addon node_addon.external_account = self.external_account node_addon.save() node.save() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['nodes']['total'], 2) def test_node_count_deleted_addon(self): results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['nodes']['deleted'], 0) node = ProjectFactory(creator=self.user) node.add_addon('github', Auth(self.user)) node_addon = node.get_addon('github') node_addon.delete() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['nodes']['deleted'], 1) def test_node_count_disconected_addon(self): results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['nodes']['disconnected'], 0) node = ProjectFactory(creator=self.user) node.add_addon('github', Auth(self.user)) node_addon = node.get_addon('github') node_addon.external_account = None node_addon.save() results = AddonSnapshot().get_events() github_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(github_res['nodes']['disconnected'], 1) def test_all_users_have_wiki_osfstorage_enabled(self): all_user_count = OSFUser.objects.all().count() results = AddonSnapshot().get_events() osfstorage_res = [ res for res in results if res['provider']['name'] == 'osfstorage' ][0] wiki_res = [ res for res in results if res['provider']['name'] == 'osfstorage' ][0] assert_equal(osfstorage_res['users']['enabled'], all_user_count) assert_equal(wiki_res['users']['enabled'], all_user_count) 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_node_settings_has_no_owner_not_connected(self): self.node_addon.owner = None self.node_addon.save() results = AddonSnapshot().get_events() storage_res = [ res for res in results if res['provider']['name'] == 'github' ][0] assert_equal(storage_res['nodes']['connected'], 0)