Custom icons for third party auth login buttons
- Icon images can be uploaded from the django admin - Test coverage improved
This commit is contained in:
85
common/djangoapps/third_party_auth/tests/test_admin.py
Normal file
85
common/djangoapps/third_party_auth/tests/test_admin.py
Normal file
@@ -0,0 +1,85 @@
|
||||
"""
|
||||
Tests third_party_auth admin views
|
||||
"""
|
||||
import unittest
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.admin.sites import AdminSite
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from django.forms import models
|
||||
|
||||
from student.tests.factories import UserFactory
|
||||
from third_party_auth.admin import OAuth2ProviderConfigAdmin
|
||||
from third_party_auth.models import OAuth2ProviderConfig
|
||||
from third_party_auth.tests import testutil
|
||||
|
||||
|
||||
# This is necessary because cms does not implement third party auth
|
||||
@unittest.skipUnless(settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'), 'third party auth not enabled')
|
||||
class Oauth2ProviderConfigAdminTest(testutil.TestCase):
|
||||
"""
|
||||
Tests for oauth2 provider config admin
|
||||
"""
|
||||
def test_oauth2_provider_edit_icon_image(self):
|
||||
"""
|
||||
Test that we can update an OAuth provider's icon image from the admin
|
||||
form.
|
||||
|
||||
OAuth providers are updated using KeyedConfigurationModelAdmin, which
|
||||
updates models by adding a new instance that replaces the old one,
|
||||
instead of editing the old instance directly.
|
||||
|
||||
Updating the icon image is tricky here because
|
||||
KeyedConfigurationModelAdmin copies data over from the previous
|
||||
version by injecting its attributes into request.GET, but the icon
|
||||
ends up in request.FILES. We need to ensure that the value is
|
||||
prepopulated correctly, and that we can clear and update the image.
|
||||
"""
|
||||
# Login as a super user
|
||||
user = UserFactory.create(is_staff=True, is_superuser=True)
|
||||
user.save()
|
||||
self.client.login(username=user.username, password='test')
|
||||
|
||||
# Get baseline provider count
|
||||
providers = OAuth2ProviderConfig.objects.all()
|
||||
pcount = len(providers)
|
||||
|
||||
# Create a provider
|
||||
provider1 = self.configure_dummy_provider(
|
||||
enabled=True,
|
||||
icon_class='',
|
||||
icon_image=SimpleUploadedFile('icon.svg', '<svg><rect width="50" height="100"/></svg>'),
|
||||
)
|
||||
|
||||
# Get the provider instance with active flag
|
||||
providers = OAuth2ProviderConfig.objects.all()
|
||||
self.assertEquals(len(providers), 1)
|
||||
self.assertEquals(providers[pcount].id, provider1.id)
|
||||
|
||||
# Edit the provider via the admin edit link
|
||||
admin = OAuth2ProviderConfigAdmin(provider1, AdminSite())
|
||||
# pylint: disable=protected-access
|
||||
update_url = reverse('admin:{}_{}_add'.format(admin.model._meta.app_label, admin.model._meta.model_name))
|
||||
update_url += "?source={}".format(provider1.pk)
|
||||
|
||||
# Remove the icon_image from the POST data, to simulate unchanged icon_image
|
||||
post_data = models.model_to_dict(provider1)
|
||||
del post_data['icon_image']
|
||||
|
||||
# Change the name, to verify POST
|
||||
post_data['name'] = 'Another name'
|
||||
|
||||
# Post the edit form: expecting redirect
|
||||
response = self.client.post(update_url, post_data)
|
||||
self.assertEquals(response.status_code, 302)
|
||||
|
||||
# Editing the existing provider creates a new provider instance
|
||||
providers = OAuth2ProviderConfig.objects.all()
|
||||
self.assertEquals(len(providers), pcount + 2)
|
||||
self.assertEquals(providers[pcount].id, provider1.id)
|
||||
provider2 = providers[pcount + 1]
|
||||
|
||||
# Ensure the icon_image was preserved on the new provider instance
|
||||
self.assertEquals(provider2.icon_image, provider1.icon_image)
|
||||
self.assertEquals(provider2.name, post_data['name'])
|
||||
Reference in New Issue
Block a user