aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortom christie tom@tomchristie.com2011-02-01 21:05:49 +0000
committertom christie tom@tomchristie.com2011-02-01 21:05:49 +0000
commite19816598973cb40b2d331d61c399ed90c81f430 (patch)
treeb2076e4009660b435125eb80da2f22ab00b9d615
parent0c6f682cd0e03c06298cec78e79d10a87426fca8 (diff)
downloaddjango-rest-framework-e19816598973cb40b2d331d61c399ed90c81f430.tar.bz2
Tests for MSIE accept header munging
-rw-r--r--djangorestframework/authenticators.py2
-rw-r--r--djangorestframework/models.py1
-rw-r--r--djangorestframework/tests.py85
-rw-r--r--examples/objectstore/models.py3
-rw-r--r--examples/objectstore/tests.py23
5 files changed, 87 insertions, 27 deletions
diff --git a/djangorestframework/authenticators.py b/djangorestframework/authenticators.py
index 8de182de..24addb22 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 00000000..72d239e5
--- /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 00000000..90c3aebb
--- /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 71a83623..00000000
--- 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 2247054b..00000000
--- 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
-"""}
-