web/ldt/test/client.py
author ymh <ymh.work@gmail.com>
Mon, 13 Dec 2010 23:55:19 +0100
changeset 22 83b28fc0d731
permissions -rw-r--r--
improve on ldt test framework start migration for text test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
#from django.test.client import Client as DClient
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
from django.conf import settings
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
from django.core.urlresolvers import reverse
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.http import HttpResponse, SimpleCookie
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from django.test.client import encode_multipart, encode_file, Client, BOUNDARY, \
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
    MULTIPART_CONTENT, CONTENT_TYPE_RE
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from django.utils.encoding import smart_str
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from django.utils.http import urlencode
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from ldt.utils import Property
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
from oauth2 import Request, Consumer, Token, SignatureMethod_HMAC_SHA1, \
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    generate_nonce, SignatureMethod_PLAINTEXT
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
from oauth_provider.consts import OUT_OF_BAND
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
from urlparse import urlsplit, urlunsplit, urlparse, urlunparse, parse_qs
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
import httplib2
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
import logging
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
import re
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
try:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    from cStringIO import StringIO
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
except ImportError:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    from StringIO import StringIO
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
class WebClient(object):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    A class that can act as a client for testing purposes.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    It allows the user to compose GET and POST requests, and
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    obtain the response that the server gave to those requests.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    The server Response objects are annotated with the details
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    of the contexts and templates that were rendered during the
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    process of serving the request.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    Client objects are stateful - they will retain cookie (and
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    thus session) details for the lifetime of the Client instance.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    This is not intended as a replacement for Twill/Selenium or
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    the like - it is here to allow testing against the
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    contexts and templates produced by a view, rather than the
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    HTML rendered to the end-user.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    def __init__(self, **defaults):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        self.handler = httplib2.Http()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        #self.defaults = defaults
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        self.cookies = SimpleCookie()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        #self.exc_info = None
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        #self.errors = StringIO()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        self.__baseurltuple = ()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        self.__login_url = None
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    @Property
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    def baseurl():
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        def fget(self):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
            return self.__baseurltuple
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        def fset(self, value):            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
            if isinstance(value, tuple):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
                self.__baseurltuple = value
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
                self.__baseurltuple = urlsplit(unicode(value))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        return locals()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    @Property
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    def login_url():
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        def fget(self):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
            return self.__login_url
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        def fset(self, value):            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            self.__login_url = value
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        return locals()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
    def _mergeurl(self, urltuple):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        res = ["" for i in range(5)]
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
        for i in range(min(len(self.baseurl), len(urltuple))):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
            res[i] = self.baseurl[i] or urltuple[i]
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
        return urlunsplit(res)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    def _process_response(self, response, content):        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        resp = HttpResponse(content=content, status=response.status, content_type=response['content-type'])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
        if 'set-cookie' in response:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
            self.cookies.load(response['set-cookie'])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
            resp.cookies.load(response['set-cookie'])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        resp.client = self
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        resp.raw_response = response
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
        for key,value in response.items():
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
            resp[key] = value 
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
        return resp
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    def _handle_redirects(self, response):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        response.redirect_chain = []
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        r = response.raw_response.previous
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        while not r is None:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
            response.redirect_chain.append((r['content-location'],r.status))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
            r = r.previous
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        return response
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    def get(self, path, data={}, follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        Requests a response from the server using GET.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        parsed = list(urlsplit(path))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
        parsed[3] = urlencode(data, doseq=True) or parsed[3]
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
        fullpath = self._mergeurl(parsed)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        self.handler.follow_redirects = follow
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        headers = {}
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        if len(self.cookies) > 0:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
            headers['Cookie'] = self.cookies.output()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
        if extra:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
            headers.update(extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        response, content = self.handler.request(fullpath, method="GET", headers=headers)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
        resp = self._process_response(response, content)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        if follow:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
            resp = self._handle_redirects(resp)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
        return resp
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
    def post(self, path, data={}, content_type="application/x-www-form-urlencoded",
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
             follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        Requests a response from the server using POST.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        if content_type == MULTIPART_CONTENT:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
            post_data = encode_multipart(BOUNDARY, data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        elif content_type  == "application/x-www-form-urlencoded":
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
            post_data = urlencode(data)            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
            # Encode the content so that the byte representation is correct.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
            match = CONTENT_TYPE_RE.match(content_type)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
            if match:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
                charset = match.group(1)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
            else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
                charset = settings.DEFAULT_CHARSET
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
            post_data = smart_str(data, encoding=charset)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
        parsed = list(urlsplit(path))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
        fullpath = self._mergeurl(parsed)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
        self.handler.follow_redirects = follow
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
        headers = {}
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
        headers['Content-type'] = content_type
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
        if len(self.cookies) > 0:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
            headers['Cookie'] = self.cookies.output()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
        if extra:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
            headers.update(extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
        response,content = self.handler.request(fullpath, method="POST", headers=headers, body=post_data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
        resp = self._process_response(response, content)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
        if follow:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
            resp = self._handle_redirects(response)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
        return resp
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
    def login(self, **credentials):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
        Sets the Client to appear as if it has successfully logged into a site.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
        Returns True if login is possible; False if the provided credentials
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
        are incorrect, or the user is inactive, or if the sessions framework is
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
        not available.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
        resp = self.post(path=self.login_url, data=credentials, follow=False, **{"X-Requested-With" : "XMLHttpRequest"})
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
        return resp.status_code == 302
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
#    def head(self, path, data={}, follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
#        Request a response from the server using HEAD.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
#        parsed = urlparse(path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
#        r = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
#            'CONTENT_TYPE':    'text/html; charset=utf-8',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
#            'PATH_INFO':       urllib.unquote(parsed[2]),
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
#            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
#            'REQUEST_METHOD': 'HEAD',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
#            'wsgi.input':      FakePayload('')
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
#        }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
#        r.update(extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
#        response = self.request(**r)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
#        if follow:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
#            response = self._handle_redirects(response)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
#        return response
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
#    def options(self, path, data={}, follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
#        Request a response from the server using OPTIONS.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
#        parsed = urlparse(path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
#        r = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
#            'PATH_INFO':       urllib.unquote(parsed[2]),
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
#            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
#            'REQUEST_METHOD': 'OPTIONS',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
#            'wsgi.input':      FakePayload('')
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
#        }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
#        r.update(extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
#        response = self.request(**r)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
#        if follow:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
#            response = self._handle_redirects(response)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
#        return response
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
#    def put(self, path, data={}, content_type=MULTIPART_CONTENT,
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
#            follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
#        Send a resource to the server using PUT.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
#        if content_type is MULTIPART_CONTENT:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
#            post_data = encode_multipart(BOUNDARY, data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
#        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
#            post_data = data
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
#        # Make `data` into a querystring only if it's not already a string. If
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
#        # it is a string, we'll assume that the caller has already encoded it.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
#        query_string = None
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
#        if not isinstance(data, basestring):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
#            query_string = urlencode(data, doseq=True)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
#        parsed = urlparse(path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
#        r = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
#            'CONTENT_LENGTH': len(post_data),
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
#            'CONTENT_TYPE':   content_type,
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
#            'PATH_INFO':      urllib.unquote(parsed[2]),
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
#            'QUERY_STRING':   query_string or parsed[4],
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
#            'REQUEST_METHOD': 'PUT',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
#            'wsgi.input':     FakePayload(post_data),
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
#        }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
#        r.update(extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
#        response = self.request(**r)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
#        if follow:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
#            response = self._handle_redirects(response)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
#        return response
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
#    def delete(self, path, data={}, follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
#        Send a DELETE request to the server.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
#        parsed = urlparse(path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
#        r = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
#            'PATH_INFO':       urllib.unquote(parsed[2]),
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
#            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
#            'REQUEST_METHOD': 'DELETE',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
#            'wsgi.input':      FakePayload('')
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
#        }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
#        r.update(extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
#        response = self.request(**r)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
#        if follow:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
#            response = self._handle_redirects(response)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
#        return response
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
#    def login(self, **credentials):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
#        Sets the Client to appear as if it has successfully logged into a site.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
#        Returns True if login is possible; False if the provided credentials
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
#        are incorrect, or the user is inactive, or if the sessions framework is
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
#        not available.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
#        user = authenticate(**credentials)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
#        if user and user.is_active \
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
#                and 'django.contrib.sessions' in settings.INSTALLED_APPS:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
#            engine = import_module(settings.SESSION_ENGINE)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
#            # Create a fake request to store login details.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
#            request = HttpRequest()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
#            if self.session:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
#                request.session = self.session
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
#            else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
#                request.session = engine.SessionStore()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
#            login(request, user)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
#            # Save the session values.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
#            request.session.save()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
#            # Set the cookie to represent the session.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
#            session_cookie = settings.SESSION_COOKIE_NAME
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
#            self.cookies[session_cookie] = request.session.session_key
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
#            cookie_data = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
#                'max-age': None,
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
#                'path': '/',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
#                'domain': settings.SESSION_COOKIE_DOMAIN,
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
#                'secure': settings.SESSION_COOKIE_SECURE or None,
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
#                'expires': None,
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
#            }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
#            self.cookies[session_cookie].update(cookie_data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
#            return True
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
#        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
#            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
#    def logout(self):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
#        Removes the authenticated user's cookies and session object.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
#        Causes the authenticated user to be logged out.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
#        """
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
#        session = import_module(settings.SESSION_ENGINE).SessionStore()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
#        session_cookie = self.cookies.get(settings.SESSION_COOKIE_NAME)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
#        if session_cookie:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
#            session.delete(session_key=session_cookie.value)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
#        self.cookies = SimpleCookie()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
class OAuthPayload(object):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
    def __init__(self, servername="testserver"):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
        self._token = None
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
        self._servername = servername
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
        self._oauth_parameters = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
            'oauth_version': '1.0'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
        }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
        self._oauth_parameters_extra = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
            'oauth_callback': 'http://127.0.0.1/callback',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
            'scope':'all'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
        }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
        self.errors = StringIO()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
    def _get_signed_request(self, method, path, params):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
        parameters = params.copy()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        parameters.update(self._oauth_parameters)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
        oauth_request = Request.from_consumer_and_token(consumer=self._consumer, token=self._token, http_method=method, http_url=path, parameters=parameters)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
        oauth_request.sign_request(SignatureMethod_HMAC_SHA1(), consumer=self._consumer, token=self._token)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
        return oauth_request
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
    def set_consumer(self, key, secret):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
        self._consumer = Consumer(key, secret)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
        self._oauth_parameters['oauth_consumer_key'] = key
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
    def set_scope(self, value):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
        self._oauth_parameters_extra['scope'] = value
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
    def inject_oauth_data(self, path, method, data):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
        path_parsed = urlparse(path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
        if method=='GET' and (data is None or len(data) == 0):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
            new_data = parse_qs(path_parsed[4])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
        elif  data is None:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
            new_data = {}
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
            new_data = data.copy()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
        clean_path = ['']*6
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
        clean_path[0] = 'http'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
        clean_path[1] = self._servername
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
        for i in range(0,4):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
            clean_path[i] = path_parsed[i] or clean_path[i]
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
        path = urlunparse(clean_path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
        oauth_request = self._get_signed_request(method, path, new_data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
        new_data.update(oauth_request)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
        return new_data
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
    def login(self, client, login_method, **credential):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
        self._oauth_parameters.update(self._oauth_parameters_extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
        #Obtaining a Request Token
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
        resp = client.get(reverse('oauth_request_token'), follow=True)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
        if resp.status_code == 200:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
            self._token = Token.from_string(resp.content)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
            self.errors.write("oauth_request_token response status code fail : " + repr(resp))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
        #Requesting User Authorization
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
        res = login_method(client, **credential)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
        if not res:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
            self.errors.write("login failed : " + repr(credential))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
        resp = client.get(reverse('oauth_user_authorization'))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
        if resp.status_code != 200:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
            self.errors.write("oauth_user_authorization get response status code fail : " + repr(resp))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
        #"X-Requested-With" : "XMLHttpRequest"
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
        resp = client.post(reverse('oauth_user_authorization'), {'authorize_access':1}, **{"X-Requested-With" : "XMLHttpRequest"})
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
        if resp.status_code != 302:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
            self.errors.write("oauth_user_authorization post response status code fail : " + repr(resp))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
        location_splitted = urlsplit(resp["Location"])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
        location_query_dict = parse_qs(location_splitted[3])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
        self._token.verifier = location_query_dict['oauth_verifier']
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
        #Obtaining an Access Token
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
        resp = client.get(reverse('oauth_access_token'))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
        if resp.status_code == 200:            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
            self._token = Token.from_string(resp.content)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
            for key in self._oauth_parameters_extra.keys():
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
                if key in self._oauth_parameters:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
                    del(self._oauth_parameters[key])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
            return True
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
            self.errors.write("oauth_access_token get response status code fail : " + repr(resp))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
    def logout(self):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
        self._token = None
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
METHOD_MAPPING = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
    'get'     : 'GET',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
    'post'    : 'POST',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
    'put'     : 'POST',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
    'head'    : 'GET',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
    'options' : 'GET',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
    'delete'  : 'GET'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
}
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
def _generate_request_wrapper(meth):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
    def request_wrapper(inst, *args, **kwargs):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
        path = args[0] if len(args) > 0 else kwargs.get('path','')
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
        data = args[1] if len(args) > 1 else kwargs.get('data',{})
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
        args = args[2:]
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
        if 'path' in kwargs:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
            del(kwargs['path'])        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
        if 'data' in kwargs:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
            del(kwargs['data'])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
        data = inst._oauth_data.inject_oauth_data(path, METHOD_MAPPING[meth.__name__], data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
        return meth(inst,path=path, data=data, *args, **kwargs)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
    return request_wrapper
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
def _generate_login_wrapper(meth):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
    def login_wrapper(inst, **credential):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
        return inst._oauth_data.login(inst, meth, **credential)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
    return login_wrapper
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
def _generate_logout_wrapper(meth):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
    def logout_wrapper(inst):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
        inst._oauth_data.logout()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
        meth(inst)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
    return logout_wrapper
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
class OAuthMetaclass(type):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
    def __new__(cls, name, bases, attrs):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
        newattrs = {}
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
        def set_consumer(inst, key, secret):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
            inst._oauth_data.set_consumer(key,secret)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
        newattrs['set_consumer'] = set_consumer
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
        def set_scope(inst, scope):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
            inst._oauth_data.set_scope(scope)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
        newattrs['set_scope'] = set_scope
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
        for attrname, attrvalue in attrs.iteritems():
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
            if attrname in ('get', 'post', 'head', 'options', 'put', 'delete'):                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
                newattrs[attrname] = _generate_request_wrapper(attrvalue)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
            elif attrname == 'login':
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
                newattrs[attrname] = _generate_login_wrapper(attrvalue)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
            elif attrname == 'logout':
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
                newattrs[attrname] = _generate_logout_wrapper(attrvalue)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
            else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
                newattrs[attrname] = attrvalue
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
        for klass in bases:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
            for attrname, attrvalue in klass.__dict__.iteritems():
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
                if attrname in newattrs:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
                    continue
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
                if attrname in ('get', 'post', 'head', 'options', 'put', 'delete'):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
                    newattrs[attrname] = _generate_request_wrapper(attrvalue)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
                elif attrname == 'login':
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
                    newattrs[attrname] = _generate_login_wrapper(attrvalue)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
                elif attrname == 'logout':
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
                    newattrs[attrname] = _generate_logout_wrapper(attrvalue)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
        init_method = newattrs.get("__init__", None)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
        def new_init(inst, *args, **kwargs):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
            inst._oauth_data = OAuthPayload(attrs.get('servername','testserver'))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
            if init_method is not None:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
                init_method(*args,**kwargs)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
            else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
                super(inst.__class__,inst).__init__(*args,**kwargs)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
        newattrs["__init__"] = new_init
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
                        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
        return super(OAuthMetaclass, cls).__new__(cls, name, bases, newattrs)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
class OAuthClient(Client):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
    __metaclass__ = OAuthMetaclass
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
#    def __init__(self, **default):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
#        super(OAuthClient,self).__init__(**default)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
#        self.__token = None
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
#        self.oauth_parameters = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
#            'oauth_version': '1.0',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
#            'oauth_callback': 'http://127.0.0.1/callback',
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
#            'scope':'all'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
#        }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
#    def __get_signed_request(self, method, path):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
#        oauth_request = Request.from_consumer_and_token(consumer=self.__consumer, token=self.__token, http_method=method, http_url=path, parameters=self.oauth_parameters)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
#        oauth_request.sign_request(SignatureMethod_HMAC_SHA1(), consumer=self.__consumer, token=self.__token)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
#        return oauth_request
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
#    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
#    def set_consumer(self, key, secret):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
#        self.__consumer = Consumer(key, secret)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
#        self.oauth_parameters['oauth_consumer_key'] = key
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
#    def set_scope(self, value):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
#        self.oauth_parameters['scope'] = value
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
#    def __inject_oauth_data(self, path, method, data):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
#        path_parsed = urlparse(path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
#        if method=='GET' and len(data) == 0:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
#            data= parse_qs(path_parsed[4])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
#            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
#        clean_path = ['']*6
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
#        clean_path[0] = 'http'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
#        clean_path[1] = 'testserver'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
#        for i in range(0,4):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
#            clean_path[i] = path_parsed[i] or clean_path[i]
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
#        path = urlunparse(clean_path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
#        oauth_request = self.__get_signed_request(method, path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
#                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
#        data.update(oauth_request)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
#    def get(self, path, data={}, follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
#        self.__inject_oauth_data(path, 'GET', data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
#        return super(OAuthClient, self).get(path, data, follow, **extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
#    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
#    def post(self, path, data={}, content_type=MULTIPART_CONTENT,
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
#             follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
#        self.__inject_oauth_data(path, 'POST', data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
#        return super(OAuthClient,self).post(path, data, content_type, follow, **extra)    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
#    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
#    def head(self, path, data={}, follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
#        self.__inject_oauth_data(path, 'GET', data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
#        return super(OAuthClient, self).head(path, data, follow, **extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
#    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
#    def options(self, path, data={}, follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
#        self.__inject_oauth_data(path, 'GET', data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
#        return options(OAuthClient, self).options(path, data, follow, **extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
#    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
#    def put(self, path, data={}, content_type=MULTIPART_CONTENT,
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
#            follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
#        self.__inject_oauth_data(path, 'POST', data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
#        return super(OAuthClient,self).put(path, data, content_type, follow, **extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
#    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
#    def delete(self, path, data={}, follow=False, **extra):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
#        self.__inject_oauth_data(path, 'GET', data)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
#        return super(OAuthClient, self).delete(path, data, follow, **extra)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
#    
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
#    ### TODO: better document errors
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
#    def login(self, **credential):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
#        #Obtaining a Request Token
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
#        resp = self.get(reverse('oauth_request_token'), follow=True)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
#        if resp.status_code == 200:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
#            self.__token = Token.from_string(resp.content)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
#        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
#            self.errors.write("oauth_request_token response status code fail : " + repr(resp))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
#            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
#                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
#        #Requesting User Authorization
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
#        res = super(OAuthClient, self).login(**credential)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
#        if not res:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
#            self.errors.write("login failed : " + repr(credential))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
#            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
#
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
#        resp = self.get(reverse('oauth_user_authorization'))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
#        if resp.status_code != 200:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
#            self.errors.write("oauth_user_authorization get response status code fail : " + repr(resp))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
#            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
#        resp = self.post(reverse('oauth_user_authorization'), {'authorize_access':1})
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
#        if resp.status_code != 302:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
#            self.errors.write("oauth_user_authorization post response status code fail : " + repr(resp))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
#            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
#        location_splitted = urlsplit(resp["Location"])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
#        location_query_dict = parse_qs(location_splitted[3])
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
#        self.__token.verifier = location_query_dict['oauth_verifier']
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
#                
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
#        #Obtaining an Access Token
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
#        resp = self.get(reverse('oauth_access_token'))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
#        if resp.status_code == 200:            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
#            self.__token = Token.from_string(resp.content)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
#            return True
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
#        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
#            self.errors.write("oauth_access_token get response status code fail : " + repr(resp))
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
#            return False
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
#        
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
#    def logout(self):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
#        super(OAuthClient,self).logout()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
#        self._token = None
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
class OAuthWebClient(WebClient):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
    __metaclass__ = OAuthMetaclass
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
    servername = '127.0.0.1:8000'