diff options
| -rw-r--r-- | djangorestframework/authenticators.py | 2 | ||||
| -rw-r--r-- | djangorestframework/models.py | 1 | ||||
| -rw-r--r-- | djangorestframework/tests.py | 85 | ||||
| -rw-r--r-- | examples/objectstore/models.py | 3 | ||||
| -rw-r--r-- | examples/objectstore/tests.py | 23 | 
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 -"""} - | 
