1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-10 11:21:29 +00:00
Files
seahub/thirdpart/registration/tests/backends.py
sniper-py 99a9ece04e Python3 master (#4076)
* delete thridpart/social_django

* delete social_django in seahub/urls.py

* delete social_django in seahub/settings.py

* delete seahub/notifications/management/commands/send_wxwork_notices.py

* delete social_django in code annotation

* delete seahub/social_core

* delete tests/seahub/social_core

* delete social_core in seahub/urls.py

* delete social_core in seahub/settings.py

* change app_label to auth in SocialAuthUser model

* 2to3 asserts

* 2to3 basestring

* 2to3 dict

* 2to3 except

* 2to3 filter

* 2to3 future

* 2to3 has_key

* 2to3 idioms

* 2to3 import

* 2to3 imports

* 2to3 long

* 2to3 map

* 2to3 next

* 2to3 numliterals

* 2to3 print

* 2to3 raise

* 2to3 raw_input

* 2to3 reduce

* 2to3 reload

* 2to3 set_literal

* 2to3 unicode

* 2to3 urllib

* 2to3 ws_comma

* 2to3 xrange

* 2to3 zip

* add pymysql in __init__.py

* fix encode and decode in seahub/cconvert.py

* fix seafserv_rpc.is_passwd_set in seahub/views/__init__.py

* fix smart_unicode to smart_text

* fix force_unicode to force_text

* delete seaserv.get_session_info

* delete seaserv.ccnet_rpc

* fix indent error in seahub/auth/middleware.py

* update dev-requirements

* update test-requirements

* update requirements

* fix StringIO to BytesIO in thumbnail

* fix seaserv.list_inner_pub_repos to seafile_api.get_inner_pub_repo_list

* fix seaserv.list_org_inner_pub_repos to seafile_api.list_org_inner_pub_repos

* add logger in seahub/utils/__init__.py

* fix sort cmp in seahub/views/__init__.py

* fix sort cmp in seahub/base/management/commands/export_file_access_log.py

* fix sort cmp in seahub/api2/endpoints/repo_trash.py

* fix sort cmp in seahub/api2/endpoints/shared_repos.py

* fix sort cmp in seahub/api2/endpoints/shared_folders.py

* fix sort cmp in seahub/wiki/views.py

* fix sort cmp in seahub/api2/endpoints/wiki_pages.py

* fix sort cmp in seahub/api2/endpoints/group_libraries.py

* fix sort cmp in seahub/base/models.py

* fix sort cmp in seahub/api2/endpoints/upload_links.py

* fix sort cmp in seahub/views/ajax.py

* fix sort cmp in seahub/api2/views.py

* fix sort cmp in seahub/views/wiki.py

* fix sort cmp in seahub/api2/endpoints/repos.py

* fix sort cmp in seahub/api2/endpoints/starred_items.py

* fix sort cmp in seahub/views/file.py

* fix sort cmp in seahub/api2/endpoints/dir.py

* fix sort cmp in seahub/api2/endpoints/share_links.py

* fix cmp to cmp_to_key in seahub/api2/endpoints/admin/device_trusted_ip.py

* fix cmp to cmp_to_key in tests/api/endpoints/admin/test_device_trusted_ip.py

* delete encode('utf-8') in seafile_api.list_dir_by_commit_and_path

* delete encode('utf-8') in is_file_starred

* delete encode('utf-8') in seafile_api.list_dir_by_path

* delete path.encode('utf-8') in seahub/views/file.py

* fix os.write to add encode('utf-8')

* add encode('utf-8') for hashlib

* add encode('utf-8') for hmac

* fix with open(file, 'wb') for binary file

* fix encode and decode in seahub/utils/hasher.py

* fix next in thirdpart/shibboleth/views.py

* fix next in seahub/profile/views.py

* fix next in seahub/notifications/views.py

* fix next in seahub/institutions/views.py

* fix next in seahub/options/views.py

* fix next in seahub/share/views.py

* fix next in seahub/avatar/views.py

* fix next in seahub/views/__init__.py

* fix next in seahub/group/views.py

* fix next in seahub/views/wiki.py

* fix next in seahub/views/sysadmin.py

* fix next in seahub/views/file.py

* fix string.lowercase to string.ascii_lowercase in test

* fix open file add 'rb' in test

* fix self.user.username in test

* add migrations in file_participants

* fix list_org_inner_pub_repos to list_org_inner_pub_repos_by_owner

* fix from seaserv import is_passwd_set to seafile_api.is_password_set

* fix assert bytes resp.content in test

* fix seafile_api.get_inner_pub_repo_list to seafile_api.list_inner_pub_repos_by_owner

* fix seafile_api.is_passwd_set to seafile_api.is_password_set

* fix AccountsApiTest assert length

* rewrite sort_devices cmp to operator.lt

* fix bytes + str in seahub/api2/views.py

* fix assert bytes resp.content in test

* fix hashlib encode in seahub/thirdpart/registration/models.py

* change app_label to base in SocialAuthUser

* fix base64 encode in seahub/base/database_storage/database_storage.py

* fix assert bytes resp.content

* remove path.decode in def mkstemp()

* remove path.decode in FpathToLinkTest

* remove str decode in FileTagTest

* remove mock_write_xls.assert_called_once() in SysUserAdminExportExcelTest

* fix urllib assert in FilesApiTest

* fix link fields in FileCommentsTest

* fix get_related_users_by_repo()

* fix assert list in GetRepoSharedUsersTest

* fix create user in AccountTest

* fix repeated key in dict seahub/api2/views.py

* add drone.yml

* update nginx conf in test

* update test conf in test

* update dist and push after test success

* update drone conf to dist and push

* fix assert in BeSharedReposTest

* fix seafile_api.list_org_inner_pub_repos_by_owner(org_id, username) to seafile_api.list_org_inner_pub_repos(org_id)

* fix seafile_api.list_inner_pub_repos_by_owner(username) to seafile_api.get_inner_pub_repo_list()

* update pyjwt requirement

* update dist branch in drone

* add SKIP in dist and push

* fix StringIO to BytesIO in seahub/avatar/models.py

* fix if org_id > 0 to if org_id and org_id > 0

* remove payment

* fix StringIO to BytesIO in seahub/base/database_storage/database_storage.py

* fix send_message to seafile_api.publish_event in seahub/drafts/utils.py

* fix send_message to seafile_api.publish_event in seahub/api2/views.py

* fix send_message to seafile_api.publish_event in seahub/api2/endpoints/repos.py

* fix send_message to seafile_api.publish_event in seahub/views/file.py

* fix send_message to seafile_api.publish_event in seahub/utils/__init__.py

* fix image_file.read encode in seahub/base/database_storage/database_storage.py

* fix DatabaseStorageTest

* remove .travis.yml

* drone branch include master
2019-09-11 11:46:43 +08:00

362 lines
14 KiB
Python

import datetime
from django.conf import settings
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.sites.models import Site
from django.core import mail
from django.core.exceptions import ImproperlyConfigured
from django.core.handlers.wsgi import WSGIRequest
from django.test import Client
from django.test import TestCase
from registration import forms
from registration import signals
from registration.admin import RegistrationAdmin
from registration.backends import get_backend
from registration.backends.default import DefaultBackend
from registration.models import RegistrationProfile
class _MockRequestClient(Client):
"""
A ``django.test.Client`` subclass which can return mock
``HttpRequest`` objects.
"""
def request(self, **request):
"""
Rather than issuing a request and returning the response, this
simply constructs an ``HttpRequest`` object and returns it.
"""
environ = {
'HTTP_COOKIE': self.cookies,
'PATH_INFO': '/',
'QUERY_STRING': '',
'REMOTE_ADDR': '127.0.0.1',
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': '',
'SERVER_NAME': 'testserver',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.1',
'wsgi.version': (1, 0),
'wsgi.url_scheme': 'http',
'wsgi.errors': self.errors,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
}
environ.update(self.defaults)
environ.update(request)
return WSGIRequest(environ)
def _mock_request():
"""
Construct and return a mock ``HttpRequest`` object; this is used
in testing backend methods which expect an ``HttpRequest`` but
which are not being called from views.
"""
return _MockRequestClient().request()
class BackendRetrievalTests(TestCase):
"""
Test that utilities for retrieving the active backend work
properly.
"""
def test_get_backend(self):
"""
Verify that ``get_backend()`` returns the correct value when
passed a valid backend.
"""
self.assertTrue(isinstance(get_backend('registration.backends.default.DefaultBackend'),
DefaultBackend))
def test_backend_error_invalid(self):
"""
Test that a nonexistent/unimportable backend raises the
correct exception.
"""
self.assertRaises(ImproperlyConfigured, get_backend,
'registration.backends.doesnotexist.NonExistentBackend')
def test_backend_attribute_error(self):
"""
Test that a backend module which exists but does not have a
class of the specified name raises the correct exception.
"""
self.assertRaises(ImproperlyConfigured, get_backend,
'registration.backends.default.NonexistentBackend')
class DefaultRegistrationBackendTests(TestCase):
"""
Test the default registration backend.
Running these tests successfull will require two templates to be
created for the sending of activation emails; details on these
templates and their contexts may be found in the documentation for
the default backend.
"""
def setUp(self):
"""
Create an instance of the default backend for use in testing,
and set ``ACCOUNT_ACTIVATION_DAYS`` if it's not set already.
"""
from registration.backends.default import DefaultBackend
self.backend = DefaultBackend()
self.old_activation = getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', None)
if self.old_activation is None:
settings.ACCOUNT_ACTIVATION_DAYS = 7
def tearDown(self):
"""
Yank out ``ACCOUNT_ACTIVATION_DAYS`` back out if it wasn't
originally set.
"""
if self.old_activation is None:
settings.ACCOUNT_ACTIVATION_DAYS = self.old_activation
def test_registration(self):
"""
Test the registration process: registration creates a new
inactive account and a new profile with activation key,
populates the correct account data and sends an activation
email.
"""
new_user = self.backend.register(_mock_request(),
username='bob',
email='bob@example.com',
password1='secret')
# Details of the returned user must match what went in.
self.assertEqual(new_user.username, 'bob')
self.assertTrue(new_user.check_password('secret'))
self.assertEqual(new_user.email, 'bob@example.com')
# New user must not be active.
self.assertFalse(new_user.is_active)
# A registration profile was created, and an activation email
# was sent.
self.assertEqual(RegistrationProfile.objects.count(), 1)
self.assertEqual(len(mail.outbox), 1)
def test_registration_no_sites(self):
"""
Test that registration still functions properly when
``django.contrib.sites`` is not installed; the fallback will
be a ``RequestSite`` instance.
"""
Site._meta.installed = False
new_user = self.backend.register(_mock_request(),
username='bob',
email='bob@example.com',
password1='secret')
self.assertEqual(new_user.username, 'bob')
self.assertTrue(new_user.check_password('secret'))
self.assertEqual(new_user.email, 'bob@example.com')
self.assertFalse(new_user.is_active)
self.assertEqual(RegistrationProfile.objects.count(), 1)
self.assertEqual(len(mail.outbox), 1)
Site._meta.installed = True
def test_valid_activation(self):
"""
Test the activation process: activating within the permitted
window sets the account's ``is_active`` field to ``True`` and
resets the activation key.
"""
valid_user = self.backend.register(_mock_request(),
username='alice',
email='alice@example.com',
password1='swordfish')
valid_profile = RegistrationProfile.objects.get(user=valid_user)
activated = self.backend.activate(_mock_request(),
valid_profile.activation_key)
self.assertEqual(activated.username, valid_user.username)
self.assertTrue(activated.is_active)
# Fetch the profile again to verify its activation key has
# been reset.
valid_profile = RegistrationProfile.objects.get(user=valid_user)
self.assertEqual(valid_profile.activation_key,
RegistrationProfile.ACTIVATED)
def test_invalid_activation(self):
"""
Test the activation process: trying to activate outside the
permitted window fails, and leaves the account inactive.
"""
expired_user = self.backend.register(_mock_request(),
username='bob',
email='bob@example.com',
password1='secret')
expired_user.date_joined = expired_user.date_joined - datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS)
expired_user.save()
expired_profile = RegistrationProfile.objects.get(user=expired_user)
self.assertFalse(self.backend.activate(_mock_request(),
expired_profile.activation_key))
self.assertTrue(expired_profile.activation_key_expired())
def test_allow(self):
"""
Test that the setting ``REGISTRATION_OPEN`` appropriately
controls whether registration is permitted.
"""
old_allowed = getattr(settings, 'REGISTRATION_OPEN', True)
settings.REGISTRATION_OPEN = True
self.assertTrue(self.backend.registration_allowed(_mock_request()))
settings.REGISTRATION_OPEN = False
self.assertFalse(self.backend.registration_allowed(_mock_request()))
settings.REGISTRATION_OPEN = old_allowed
def test_form_class(self):
"""
Test that the default form class returned is
``registration.forms.RegistrationForm``.
"""
self.assertTrue(self.backend.get_form_class(_mock_request()) is forms.RegistrationForm)
def test_post_registration_redirect(self):
"""
Test that the default post-registration redirect is the named
pattern ``registration_complete``.
"""
self.assertEqual(self.backend.post_registration_redirect(_mock_request(), User()),
('registration_complete', (), {}))
def test_registration_signal(self):
"""
Test that registering a user sends the ``user_registered``
signal.
"""
def receiver(sender, **kwargs):
self.assertTrue('user' in kwargs)
self.assertEqual(kwargs['user'].username, 'bob')
self.assertTrue('request' in kwargs)
self.assertTrue(isinstance(kwargs['request'], WSGIRequest))
received_signals.append(kwargs.get('signal'))
received_signals = []
signals.user_registered.connect(receiver, sender=self.backend.__class__)
self.backend.register(_mock_request(),
username='bob',
email='bob@example.com',
password1='secret')
self.assertEqual(len(received_signals), 1)
self.assertEqual(received_signals, [signals.user_registered])
def test_activation_signal_success(self):
"""
Test that successfully activating a user sends the
``user_activated`` signal.
"""
def receiver(sender, **kwargs):
self.assertTrue('user' in kwargs)
self.assertEqual(kwargs['user'].username, 'bob')
self.assertTrue('request' in kwargs)
self.assertTrue(isinstance(kwargs['request'], WSGIRequest))
received_signals.append(kwargs.get('signal'))
received_signals = []
signals.user_activated.connect(receiver, sender=self.backend.__class__)
new_user = self.backend.register(_mock_request(),
username='bob',
email='bob@example.com',
password1='secret')
profile = RegistrationProfile.objects.get(user=new_user)
self.backend.activate(_mock_request(), profile.activation_key)
self.assertEqual(len(received_signals), 1)
self.assertEqual(received_signals, [signals.user_activated])
def test_activation_signal_failure(self):
"""
Test that an unsuccessful activation attempt does not send the
``user_activated`` signal.
"""
receiver = lambda sender, **kwargs: received_signals.append(kwargs.get('signal'))
received_signals = []
signals.user_activated.connect(receiver, sender=self.backend.__class__)
new_user = self.backend.register(_mock_request(),
username='bob',
email='bob@example.com',
password1='secret')
new_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
new_user.save()
profile = RegistrationProfile.objects.get(user=new_user)
self.backend.activate(_mock_request(), profile.activation_key)
self.assertEqual(len(received_signals), 0)
def test_email_send_action(self):
"""
Test re-sending of activation emails via admin action.
"""
admin_class = RegistrationAdmin(RegistrationProfile, admin.site)
alice = self.backend.register(_mock_request(),
username='alice',
email='alice@example.com',
password1='swordfish')
admin_class.resend_activation_email(_mock_request(),
RegistrationProfile.objects.all())
self.assertEqual(len(mail.outbox), 2) # One on registering, one more on the resend.
RegistrationProfile.objects.filter(user=alice).update(activation_key=RegistrationProfile.ACTIVATED)
admin_class.resend_activation_email(_mock_request(),
RegistrationProfile.objects.all())
self.assertEqual(len(mail.outbox), 2) # No additional email because the account has activated.
def test_activation_action(self):
"""
Test manual activation of users view admin action.
"""
admin_class = RegistrationAdmin(RegistrationProfile, admin.site)
alice = self.backend.register(_mock_request(),
username='alice',
email='alice@example.com',
password1='swordfish')
admin_class.activate_users(_mock_request(),
RegistrationProfile.objects.all())
self.assertTrue(User.objects.get(username='alice').is_active)