diff --git a/djangorestframework/authenticators.py b/djangorestframework/authenticators.py index 8de182deb..24addb229 100644 --- a/djangorestframework/authenticators.py +++ b/djangorestframework/authenticators.py @@ -38,7 +38,7 @@ class BasicAuthenticator(BaseAuthenticator): class UserLoggedInAuthenticator(BaseAuthenticator): """Use Djagno's built-in request session for authentication.""" def authenticate(self, request): - if request.user and request.user.is_active: + if getattr(request, 'user', None) and request.user.is_active: return request.user return None diff --git a/djangorestframework/models.py b/djangorestframework/models.py new file mode 100644 index 000000000..72d239e50 --- /dev/null +++ b/djangorestframework/models.py @@ -0,0 +1 @@ +# Just to keep things like ./manage.py test happy \ No newline at end of file diff --git a/djangorestframework/tests.py b/djangorestframework/tests.py new file mode 100644 index 000000000..90c3aebb2 --- /dev/null +++ b/djangorestframework/tests.py @@ -0,0 +1,85 @@ +from django.test import Client, TestCase +from django.core.handlers.wsgi import WSGIRequest +from djangorestframework.resource import Resource + +# From: http://djangosnippets.org/snippets/963/ +class RequestFactory(Client): + """ + Class that lets you create mock Request objects for use in testing. + + Usage: + + rf = RequestFactory() + get_request = rf.get('/hello/') + post_request = rf.post('/submit/', {'foo': 'bar'}) + + This class re-uses the django.test.client.Client interface, docs here: + http://www.djangoproject.com/documentation/testing/#the-test-client + + Once you have a request object you can pass it to any view function, + just as if that view had been hooked up using a URLconf. + + """ + def request(self, **request): + """ + Similar to parent class, but returns the request object as soon as it + has created it. + """ + environ = { + 'HTTP_COOKIE': self.cookies, + 'PATH_INFO': '/', + 'QUERY_STRING': '', + 'REQUEST_METHOD': 'GET', + 'SCRIPT_NAME': '', + 'SERVER_NAME': 'testserver', + 'SERVER_PORT': 80, + 'SERVER_PROTOCOL': 'HTTP/1.1', + } + environ.update(self.defaults) + environ.update(request) + return WSGIRequest(environ) + +# See: http://www.useragentstring.com/ +MSIE_9_USER_AGENT = 'Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))' +MSIE_8_USER_AGENT = 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)' +MSIE_7_USER_AGENT = 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)' +FIREFOX_4_0_USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)' +CHROME_11_0_USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17' +SAFARI_5_0_USER_AGENT = 'Mozilla/5.0 (X11; U; Linux x86_64; en-ca) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+' +OPERA_11_0_MSIE_USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; pl) Opera 11.00' +OPERA_11_0_OPERA_USER_AGENT = 'Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00' + +class UserAgentMungingTest(TestCase): + """""" + + class MockResource(Resource): + anon_allowed_methods = allowed_methods = ('GET',) + def get(self, request, auth): + return {'a':1, 'b':2, 'c':3} + + def setUp(self): + self.rf = RequestFactory() + + def test_msie8_ua_munge_accept(self): + """Send MSIE user agent strings and ensure that we get an HTML response, + even if we set a */* accept header. (Which MSIE annoyingly does)""" + for user_agent in (MSIE_9_USER_AGENT, + MSIE_8_USER_AGENT, + MSIE_7_USER_AGENT): + req = self.rf.get('/', HTTP_ACCEPT='*/*', HTTP_USER_AGENT=user_agent) + resp = self.MockResource(req) + self.assertEqual(resp['Content-Type'], 'text/html') + + def test_other_ua_dont_munge_accept(self): + """Send Non-MSIE user agent strings and ensure that we get a JSON response, + if we set a */* Accept header. (Other browsers will correctly set the Accept header)""" + for user_agent in (FIREFOX_4_0_USER_AGENT, + CHROME_11_0_USER_AGENT, + SAFARI_5_0_USER_AGENT, + OPERA_11_0_MSIE_USER_AGENT, + OPERA_11_0_OPERA_USER_AGENT): + req = self.rf.get('/', HTTP_ACCEPT='*/*', HTTP_USER_AGENT=user_agent) + resp = self.MockResource(req) + self.assertEqual(resp['Content-Type'], 'application/json') + + diff --git a/examples/objectstore/models.py b/examples/objectstore/models.py deleted file mode 100644 index 71a836239..000000000 --- a/examples/objectstore/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/examples/objectstore/tests.py b/examples/objectstore/tests.py deleted file mode 100644 index 2247054b3..000000000 --- a/examples/objectstore/tests.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -This file demonstrates two different styles of tests (one doctest and one -unittest). These will both pass when you run "manage.py test". - -Replace these with more appropriate tests for your application. -""" - -from django.test import TestCase - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.failUnlessEqual(1 + 1, 2) - -__test__ = {"doctest": """ -Another way to test that 1 + 1 is equal to 2. - ->>> 1 + 1 == 2 -True -"""} -