def test_merge_user_settings(self): # give the other user an external account external_account = factories.ExternalAccountFactory( provider=self.OAUTH_PROVIDER) self.other_user.external_accounts.append(external_account) # set up a project, whose addon is authenticated to the other user other_user_settings = self.other_user.get_or_add_addon( self.OAUTH_PROVIDER) node_settings = self.project.get_or_add_addon(self.OAUTH_PROVIDER, auth=Auth( self.other_user)) node_settings.set_auth(user=self.other_user, external_account=external_account) user_settings = self.user.get_or_add_addon(self.OAUTH_PROVIDER) self.user.merge_user(self.other_user) self.user.save() self.project.reload() node_settings.reload() user_settings.reload() other_user_settings.reload() assert_true(node_settings.has_auth) assert_in(self.project._id, user_settings.oauth_grants) assert_equal(node_settings.user_settings, user_settings)
def test_merge(self, mock_get_mailchimp_api): other_user = factories.UserFactory() other_user.save() # define values for users' fields today = datetime.datetime.now() yesterday = today - datetime.timedelta(days=1) self.user.comments_viewed_timestamp['shared_gt'] = today other_user.comments_viewed_timestamp['shared_gt'] = yesterday self.user.comments_viewed_timestamp['shared_lt'] = yesterday other_user.comments_viewed_timestamp['shared_lt'] = today self.user.comments_viewed_timestamp['user'] = yesterday other_user.comments_viewed_timestamp['other'] = yesterday self.user.email_verifications = {'user': {'email': 'a'}} other_user.email_verifications = {'other': {'email': 'b'}} self.user.external_accounts = [factories.ExternalAccountFactory()] other_user.external_accounts = [factories.ExternalAccountFactory()] self.user.mailchimp_mailing_lists = { 'user': True, 'shared_gt': True, 'shared_lt': False, } other_user.mailchimp_mailing_lists = { 'other': True, 'shared_gt': False, 'shared_lt': True, } self.user.piwik_token = 'abc' other_user.piwik_token = 'def' self.user.security_messages = { 'user': today, 'shared': today, } other_user.security_messages = { 'other': today, 'shared': today, } self.user.system_tags = ['user', 'shared'] other_user.system_tags = ['other', 'shared'] self.user.watched = [factories.WatchConfigFactory()] other_user.watched = [factories.WatchConfigFactory()] self.user.save() other_user.save() # define expected behavior for ALL FIELDS of the User object default_to_master_user_fields = [ '_id', 'date_confirmed', 'date_disabled', 'date_last_login', 'date_registered', 'family_name', 'fullname', 'given_name', 'is_claimed', 'is_invited', 'is_registered', 'jobs', 'locale', 'merged_by', 'middle_names', 'password', 'piwik_token', 'recently_added', 'schools', 'social', 'suffix', 'timezone', 'username', 'mailing_lists', 'verification_key', 'contributor_added_email_records' ] calculated_fields = { 'comments_viewed_timestamp': { 'user': yesterday, 'other': yesterday, 'shared_gt': today, 'shared_lt': today, }, 'email_verifications': { 'user': { 'email': 'a' }, 'other': { 'email': 'b' }, }, 'emails': [ self.user.username, other_user.username, ], 'external_accounts': [ self.user.external_accounts[0]._id, other_user.external_accounts[0]._id, ], 'mailchimp_mailing_lists': { 'user': True, 'other': True, 'shared_gt': True, 'shared_lt': True, }, 'osf_mailing_lists': { 'Open Science Framework Help': True }, 'security_messages': { 'user': today, 'other': today, 'shared': today, }, 'system_tags': ['user', 'shared', 'other'], 'unclaimed_records': {}, 'watched': [ self.user.watched[0]._id, other_user.watched[0]._id, ], } # from the explicit rules above, compile expected field/value pairs expected = {} expected.update(calculated_fields) for key in default_to_master_user_fields: expected[key] = getattr(self.user, key) # ensure all fields of the user object have an explicit expectation assert_equal( set(expected.keys()), set(self.user._fields), ) # mock mailchimp mock_client = mock.MagicMock() mock_get_mailchimp_api.return_value = mock_client mock_client.lists.list.return_value = { 'data': [{ 'id': x, 'list_name': list_name } for x, list_name in enumerate(self.user.mailchimp_mailing_lists)] } # perform the merge self.user.merge_user(other_user) self.user.save() handlers.celery_teardown_request() # check each field/value pair for k, v in expected.iteritems(): assert_equal( getattr(self.user, k), v, # "{} doesn't match expectation".format(k) ) # check fields set on merged user assert_equal(other_user.merged_by, self.user) assert_equal( 0, models.Session.find(Q('data.auth_user_id', 'eq', other_user._id)).count())