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))}
Beispiel #2
0
    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)
Beispiel #4
0
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]
Beispiel #5
0
    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()
Beispiel #6
0
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]