diff --git a/.travis.yml b/.travis.yml index 86c925c..5d1e612 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,10 +6,13 @@ env: - DJANGO=1.5.12 - DJANGO=1.6.11 - DJANGO=1.7.7 + - DJANGO=1.8 matrix: exclude: - python: "2.6" env: DJANGO=1.7.7 + - python: "2.6" + env: DJANGO=1.8 install: - pip install -q Django==$DJANGO --use-mirrors - pip install coveralls diff --git a/rest_auth/django_test_urls.py b/rest_auth/django_test_urls.py new file mode 100644 index 0000000..1b68574 --- /dev/null +++ b/rest_auth/django_test_urls.py @@ -0,0 +1,103 @@ +# Moved in Django 1.8 from django to tests/auth_tests/urls.py + +from django.conf.urls import include, url +from django.contrib import admin +from django.contrib.auth import views +from django.contrib.auth.decorators import login_required +from django.contrib.auth.forms import AuthenticationForm +from django.contrib.auth.urls import urlpatterns +from django.contrib.messages.api import info +from django.http import HttpRequest, HttpResponse +from django.shortcuts import render +from django.template import RequestContext, Template +from django.views.decorators.cache import never_cache + + +class CustomRequestAuthenticationForm(AuthenticationForm): + def __init__(self, request, *args, **kwargs): + assert isinstance(request, HttpRequest) + super(CustomRequestAuthenticationForm, self).__init__(request, *args, **kwargs) + + +@never_cache +def remote_user_auth_view(request): + "Dummy view for remote user tests" + t = Template("Username is {{ user }}.") + c = RequestContext(request, {}) + return HttpResponse(t.render(c)) + + +def auth_processor_no_attr_access(request): + render(request, 'context_processors/auth_attrs_no_access.html') + # *After* rendering, we check whether the session was accessed + return render(request, + 'context_processors/auth_attrs_test_access.html', + {'session_accessed': request.session.accessed}) + + +def auth_processor_attr_access(request): + render(request, 'context_processors/auth_attrs_access.html') + return render(request, + 'context_processors/auth_attrs_test_access.html', + {'session_accessed': request.session.accessed}) + + +def auth_processor_user(request): + return render(request, 'context_processors/auth_attrs_user.html') + + +def auth_processor_perms(request): + return render(request, 'context_processors/auth_attrs_perms.html') + + +def auth_processor_perm_in_perms(request): + return render(request, 'context_processors/auth_attrs_perm_in_perms.html') + + +def auth_processor_messages(request): + info(request, "Message 1") + return render(request, 'context_processors/auth_attrs_messages.html') + + +def userpage(request): + pass + + +def custom_request_auth_login(request): + return views.login(request, authentication_form=CustomRequestAuthenticationForm) + +# special urls for auth test cases +urlpatterns += [ + url(r'^logout/custom_query/$', views.logout, dict(redirect_field_name='follow')), + url(r'^logout/next_page/$', views.logout, dict(next_page='/somewhere/')), + url(r'^logout/next_page/named/$', views.logout, dict(next_page='password_reset')), + url(r'^remote_user/$', remote_user_auth_view), + url(r'^password_reset_from_email/$', views.password_reset, dict(from_email='staffmember@example.com')), + url(r'^password_reset/custom_redirect/$', views.password_reset, dict(post_reset_redirect='/custom/')), + url(r'^password_reset/custom_redirect/named/$', views.password_reset, dict(post_reset_redirect='password_reset')), + url(r'^password_reset/html_email_template/$', views.password_reset, + dict(html_email_template_name='registration/html_password_reset_email.html')), + url(r'^reset/custom/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', + views.password_reset_confirm, + dict(post_reset_redirect='/custom/')), + url(r'^reset/custom/named/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', + views.password_reset_confirm, + dict(post_reset_redirect='password_reset')), + url(r'^password_change/custom/$', views.password_change, dict(post_change_redirect='/custom/')), + url(r'^password_change/custom/named/$', views.password_change, dict(post_change_redirect='password_reset')), + url(r'^admin_password_reset/$', views.password_reset, dict(is_admin_site=True)), + url(r'^login_required/$', login_required(views.password_reset)), + url(r'^login_required_login_url/$', login_required(views.password_reset, login_url='/somewhere/')), + + url(r'^auth_processor_no_attr_access/$', auth_processor_no_attr_access), + url(r'^auth_processor_attr_access/$', auth_processor_attr_access), + url(r'^auth_processor_user/$', auth_processor_user), + url(r'^auth_processor_perms/$', auth_processor_perms), + url(r'^auth_processor_perm_in_perms/$', auth_processor_perm_in_perms), + url(r'^auth_processor_messages/$', auth_processor_messages), + url(r'^custom_request_auth_login/$', custom_request_auth_login), + url(r'^userpage/(.+)/$', userpage, name="userpage"), + + # This line is only required to render the password reset with is_admin=True + url(r'^admin/', include(admin.site.urls)), +] \ No newline at end of file diff --git a/rest_auth/registration/serializers.py b/rest_auth/registration/serializers.py index 2de467e..7b28484 100644 --- a/rest_auth/registration/serializers.py +++ b/rest_auth/registration/serializers.py @@ -31,7 +31,7 @@ class SocialLoginSerializer(serializers.Serializer): try: login = self.adapter.complete_login(request, app, token, response=access_token) - token.account = login.account + login.token = token complete_social_login(request, login) except HTTPError: diff --git a/rest_auth/test_urls.py b/rest_auth/test_urls.py index 02cbab5..95d4afb 100644 --- a/rest_auth/test_urls.py +++ b/rest_auth/test_urls.py @@ -1,6 +1,6 @@ from django.conf.urls import patterns, url, include from django.views.generic import TemplateView -from django.contrib.auth.tests import urls +import rest_auth.django_test_urls from allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter @@ -13,7 +13,7 @@ class FacebookLogin(SocialLogin): urlpatterns += patterns('', url(r'^rest-registration/', include('rest_auth.registration.urls')), - url(r'^test-admin/', include(urls)), + url(r'^test-admin/', include(rest_auth.django_test_urls)), url(r'^account-email-verification-sent/$', TemplateView.as_view(), name='account_email_verification_sent'), url(r'^account-confirm-email/(?P\w+)/$', TemplateView.as_view(), diff --git a/rest_auth/tests.py b/rest_auth/tests.py index 5479cd7..6dd75c8 100644 --- a/rest_auth/tests.py +++ b/rest_auth/tests.py @@ -1,5 +1,4 @@ import json -from datetime import datetime, date, time from django.conf import settings from django.core.urlresolvers import reverse @@ -26,18 +25,6 @@ class APIClient(Client): return self.generic('OPTIONS', path, data, content_type, **extra) -# class CustomJSONEncoder(json.JSONEncoder): -# """ -# Convert datetime/date objects into isoformat -# """ - -# def default(self, obj): -# if isinstance(obj, (datetime, date, time)): -# return obj.isoformat() -# else: -# return super(CustomJSONEncoder, self).default(obj) - - class BaseAPITestCase(object): """ @@ -471,7 +458,7 @@ class TestSocialAuth(TestCase, BaseAPITestCase): ACCOUNT_EMAIL_REQUIRED=True, REST_SESSION_LOGIN=False ) - def teste_edge_case(self): + def test_edge_case(self): resp_body = '{"id":"123123123123","first_name":"John","gender":"male","last_name":"Smith","link":"https:\\/\\/www.facebook.com\\/john.smith","locale":"en_US","name":"John Smith","timezone":2,"updated_time":"2014-08-13T10:14:38+0000","username":"john.smith","verified":true,"email":"%s"}' responses.add(responses.GET, self.graph_api_url, body=resp_body % self.EMAIL, diff --git a/test_requirements.pip b/test_requirements.pip index d619bed..9c6d5fa 100644 --- a/test_requirements.pip +++ b/test_requirements.pip @@ -1,2 +1,2 @@ -django-allauth>=0.19.0 +django-allauth>=0.19.1 responses>=0.3.0