def test_context_for_enterprise_learner( self, mock_get_auth_provider, mock_enterprise_customer_for_request ): dummy_enterprise_customer = { 'uuid': 'real-ent-uuid', 'name': 'Dummy Enterprise', 'identity_provider': 'saml-ubc' } mock_enterprise_customer_for_request.return_value = dummy_enterprise_customer self.request.site = SiteFactory.create() mock_get_auth_provider.return_value.sync_learner_profile_data = True context = account_settings_context(self.request) user_accounts_api_url = reverse("accounts_api", kwargs={'username': self.user.username}) assert context['user_accounts_api_url'] == user_accounts_api_url user_preferences_api_url = reverse('preferences_api', kwargs={'username': self.user.username}) assert context['user_preferences_api_url'] == user_preferences_api_url for attribute in self.FIELDS: assert attribute in context['fields'] assert context['user_accounts_api_url'] == reverse('accounts_api', kwargs={'username': self.user.username}) assert context['user_preferences_api_url'] ==\ reverse('preferences_api', kwargs={'username': self.user.username}) assert context['duplicate_provider'] == 'facebook' assert context['auth']['providers'][0]['name'] == 'Facebook' assert context['auth']['providers'][1]['name'] == 'Google' assert context['sync_learner_profile_data'] == mock_get_auth_provider.return_value.sync_learner_profile_data assert context['edx_support_url'] == settings.SUPPORT_SITE_LINK assert context['enterprise_name'] == dummy_enterprise_customer['name'] assert context['enterprise_readonly_account_fields'] ==\ {'fields': list(get_enterprise_readonly_account_fields(self.user))}
def test_get_enterprise_readonly_account_fields_with_idp_sync( self, mock_tpa, mock_customer_for_request, mock_get_current_request, mock_user_social_auth): mock_get_current_request.return_value = mock.Mock( GET={'enterprise_customer': 'some-uuid'}, ) mock_customer_for_request.return_value = { 'uuid': 'some-uuid', 'identity_provider': 'mock-idp', } mock_idp = mock.MagicMock( backend_name='mock-backend', sync_learner_profile_data=True, ) mock_tpa.provider.Registry.get.return_value = mock_idp user = mock.Mock() actual_fields = get_enterprise_readonly_account_fields(user) assert set( settings.ENTERPRISE_READONLY_ACCOUNT_FIELDS) == actual_fields mock_customer_for_request.assert_called_once_with( mock_get_current_request.return_value) mock_get_current_request.assert_called_once_with() mock_tpa.provider.Registry.get.assert_called_with( provider_id='mock-idp') mock_select_related = mock_user_social_auth.objects.select_related mock_select_related.assert_called_once_with('user') mock_select_related.return_value.filter.assert_called_once_with( provider=mock_idp.backend_name, user=user)
def test_context(self, mock_enterprise_customer_for_request): self.request.site = SiteFactory.create() UserPreferenceFactory(user=self.user, key='pref-lang', value='lt-lt') DarkLangConfig(released_languages='en', changed_by=self.user, enabled=True, beta_languages='lt-lt', enable_beta_languages=True).save() mock_enterprise_customer_for_request.return_value = {} with override_settings(LANGUAGES=[EN, LT_LT], LANGUAGE_CODE='en'): context = account_settings_context(self.request) user_accounts_api_url = reverse( "accounts_api", kwargs={'username': self.user.username}) self.assertEqual(context['user_accounts_api_url'], user_accounts_api_url) user_preferences_api_url = reverse( 'preferences_api', kwargs={'username': self.user.username}) self.assertEqual(context['user_preferences_api_url'], user_preferences_api_url) for attribute in self.FIELDS: self.assertIn(attribute, context['fields']) self.assertEqual( context['user_accounts_api_url'], reverse("accounts_api", kwargs={'username': self.user.username})) self.assertEqual( context['user_preferences_api_url'], reverse('preferences_api', kwargs={'username': self.user.username})) self.assertEqual(context['duplicate_provider'], 'facebook') self.assertEqual(context['auth']['providers'][0]['name'], 'Facebook') self.assertEqual(context['auth']['providers'][1]['name'], 'Google') self.assertEqual(context['sync_learner_profile_data'], False) self.assertEqual(context['edx_support_url'], settings.SUPPORT_SITE_LINK) self.assertEqual(context['enterprise_name'], None) self.assertEqual(context['enterprise_readonly_account_fields'], { 'fields': list(get_enterprise_readonly_account_fields(self.user)) }) expected_beta_language = { 'code': 'lt-lt', 'name': settings.LANGUAGE_DICT.get('lt-lt') } self.assertEqual(context['beta_language'], expected_beta_language)
def _validate_read_only_fields(user, data, field_errors): # Check for fields that are not editable. Marking them read-only causes them to be ignored, but we wish to 400. read_only_fields = set(data.keys()).intersection( # Remove email since it is handled separately below when checking for changing_email. (set(AccountUserSerializer.get_read_only_fields()) - {"email"}) | set(AccountLegacyProfileSerializer.get_read_only_fields() or set()) | get_enterprise_readonly_account_fields(user) ) for read_only_field in read_only_fields: field_errors[read_only_field] = { "developer_message": "This field is not editable via this API", "user_message": _("The '{field_name}' field cannot be edited.").format(field_name=read_only_field) } del data[read_only_field]
def test_get_enterprise_readonly_account_fields_no_sync_learner_profile_data( self, mock_customer_for_request, mock_get_current_request): mock_get_current_request.return_value = mock.Mock( GET={'enterprise_customer': 'some-uuid'}, ) mock_customer_for_request.return_value = { 'uuid': 'some-uuid', 'identity_provider': None, } user = mock.Mock() actual_fields = get_enterprise_readonly_account_fields(user) assert set() == actual_fields mock_customer_for_request.assert_called_once_with( mock_get_current_request.return_value) mock_get_current_request.assert_called_once_with()
def _validate_read_only_fields(user, data, field_errors): # Check for fields that are not editable. Marking them read-only causes them to be ignored, but we wish to 400. read_only_fields = set(data.keys()).intersection( # Remove email since it is handled separately below when checking for changing_email. (set(AccountUserSerializer.get_read_only_fields()) - set(["email"])) | set(AccountLegacyProfileSerializer.get_read_only_fields() or set()) | get_enterprise_readonly_account_fields(user) ) for read_only_field in read_only_fields: field_errors[read_only_field] = { "developer_message": u"This field is not editable via this API", "user_message": _(u"The '{field_name}' field cannot be edited.").format(field_name=read_only_field) } del data[read_only_field]