src/ldt/ldt/test/client.py
author ymh <ymh.work@gmail.com>
Tue, 12 May 2015 14:40:49 +0200
changeset 1370 166d4c070210
parent 198 202107fff250
permissions -rw-r--r--
Added tag V01.56 for changeset e7cd1595f512
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
     1
#from django.test.client import Client as DClient
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
     2
from django.conf import settings
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
     3
from django.core.urlresolvers import reverse
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
     4
from django.http import HttpResponse, SimpleCookie
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
     5
from django.test.client import (encode_multipart, Client, BOUNDARY, 
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
     6
    MULTIPART_CONTENT, CONTENT_TYPE_RE)
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
     7
from django.utils.encoding import smart_str
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
     8
from django.utils.http import urlencode
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
     9
from ldt.utils import Property
198
202107fff250 Fixed minor bugs
verrierj
parents: 63
diff changeset
    10
from oauth2 import Request, Consumer, Token, SignatureMethod_HMAC_SHA1#@UnresolvedImport
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    11
from urlparse import urlsplit, urlunsplit, urlparse, urlunparse, parse_qs
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    12
import httplib2
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    13
try:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    14
    from cStringIO import StringIO
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    15
except ImportError:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    16
    from StringIO import StringIO
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    17
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    18
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    19
class WebClient(object):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    20
    """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    21
    A class that can act as a client for testing purposes.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    23
    It allows the user to compose GET and POST requests, and
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    24
    obtain the response that the server gave to those requests.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    25
    The server Response objects are annotated with the details
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    26
    of the contexts and templates that were rendered during the
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    27
    process of serving the request.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    28
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    29
    Client objects are stateful - they will retain cookie (and
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    30
    thus session) details for the lifetime of the Client instance.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    31
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    32
    This is not intended as a replacement for Twill/Selenium or
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    33
    the like - it is here to allow testing against the
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    34
    contexts and templates produced by a view, rather than the
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    35
    HTML rendered to the end-user.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    36
    """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    37
    def __init__(self, **defaults):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    38
        self.handler = httplib2.Http()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    39
        #self.defaults = defaults
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    40
        self.cookies = SimpleCookie()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    41
        #self.exc_info = None
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    42
        #self.errors = StringIO()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    43
        self.__baseurltuple = ()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    44
        self.__login_url = None
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    45
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    46
    @Property
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
    47
    def baseurl(): #@NoSelf
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    48
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    49
        def fget(self):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    50
            return self.__baseurltuple
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    51
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    52
        def fset(self, value):            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    53
            if isinstance(value, tuple):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    54
                self.__baseurltuple = value
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    55
            else:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    56
                self.__baseurltuple = urlsplit(unicode(value))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    57
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    58
        return locals()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    59
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    60
    @Property
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
    61
    def login_url(): #@NoSelf
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    62
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    63
        def fget(self):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    64
            return self.__login_url
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    65
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    66
        def fset(self, value):            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    67
            self.__login_url = value
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    68
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    69
        return locals()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    70
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    71
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    72
    def _mergeurl(self, urltuple):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    73
        res = ["" for i in range(5)]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    74
        for i in range(min(len(self.baseurl), len(urltuple))):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    75
            res[i] = self.baseurl[i] or urltuple[i]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    76
                
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    77
        return urlunsplit(res)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    78
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    79
    def _process_response(self, response, content):        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    80
        resp = HttpResponse(content=content, status=response.status, content_type=response['content-type'])
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    81
        if 'set-cookie' in response:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    82
            self.cookies.load(response['set-cookie'])
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    83
            resp.cookies.load(response['set-cookie'])
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    84
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    85
        resp.client = self
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    86
        resp.raw_response = response
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
    87
        for key, value in response.items():
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    88
            resp[key] = value 
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    89
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    90
        return resp
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    91
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    92
    def _handle_redirects(self, response):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    93
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    94
        response.redirect_chain = []
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    95
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    96
        r = response.raw_response.previous
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    97
        while not r is None:
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
    98
            response.redirect_chain.append((r['content-location'], r.status))
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
    99
            r = r.previous
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   100
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   101
        return response
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   102
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   103
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   104
    def get(self, path, data={}, follow=False, **extra):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   105
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   106
        Requests a response from the server using GET.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   107
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   108
        parsed = list(urlsplit(path))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   109
        parsed[3] = urlencode(data, doseq=True) or parsed[3]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   110
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   111
        fullpath = self._mergeurl(parsed)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   112
        self.handler.follow_redirects = follow
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   113
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   114
        headers = {}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   115
        if len(self.cookies) > 0:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   116
            headers['Cookie'] = self.cookies.output()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   117
            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   118
        if extra:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   119
            headers.update(extra)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   120
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   121
        response, content = self.handler.request(fullpath, method="GET", headers=headers)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   122
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   123
        resp = self._process_response(response, content)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   124
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   125
        if follow:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   126
            resp = self._handle_redirects(resp)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   127
        return resp
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   128
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   129
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   130
    def post(self, path, data={}, content_type="application/x-www-form-urlencoded",
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   131
             follow=False, **extra):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   132
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   133
        Requests a response from the server using POST.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   134
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   135
        if content_type == MULTIPART_CONTENT:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   136
            post_data = encode_multipart(BOUNDARY, data)
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   137
        elif content_type == "application/x-www-form-urlencoded":
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   138
            post_data = urlencode(data)            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   139
        else:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   140
            # Encode the content so that the byte representation is correct.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   141
            match = CONTENT_TYPE_RE.match(content_type)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   142
            if match:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   143
                charset = match.group(1)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   144
            else:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   145
                charset = settings.DEFAULT_CHARSET
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   146
            post_data = smart_str(data, encoding=charset)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   147
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   148
        parsed = list(urlsplit(path))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   149
        fullpath = self._mergeurl(parsed)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   150
        self.handler.follow_redirects = follow
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   151
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   152
        headers = {}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   153
        headers['Content-type'] = content_type
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   154
        if len(self.cookies) > 0:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   155
            headers['Cookie'] = self.cookies.output()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   156
            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   157
        if extra:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   158
            headers.update(extra)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   159
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   160
        response, content = self.handler.request(fullpath, method="POST", headers=headers, body=post_data)
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   161
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   162
        resp = self._process_response(response, content)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   163
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   164
        if follow:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   165
            resp = self._handle_redirects(response)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   166
        return resp
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   167
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   168
    def login(self, **credentials):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   169
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   170
        Sets the Client to appear as if it has successfully logged into a site.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   171
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   172
        Returns True if login is possible; False if the provided credentials
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   173
        are incorrect, or the user is inactive, or if the sessions framework is
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   174
        not available.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   175
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   176
        resp = self.post(path=self.login_url, data=credentials, follow=False, **{"X-Requested-With" : "XMLHttpRequest"})
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   177
        return resp.status_code == 302
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   178
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   179
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   180
    def logout(self):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   181
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   182
        Removes the authenticated user's cookies and session object.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   183
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   184
        Causes the authenticated user to be logged out.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   185
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   186
        self.cookies = SimpleCookie()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   187
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   188
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   189
    def head(self, path, data={}, follow=False, **extra):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   190
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   191
        Request a response from the server using HEAD.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   192
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   193
        parsed = list(urlsplit(path))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   194
        parsed[3] = urlencode(data, doseq=True) or parsed[3]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   195
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   196
        fullpath = self._mergeurl(parsed)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   197
        self.handler.follow_redirects = follow
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   198
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   199
        headers = {}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   200
        if len(self.cookies) > 0:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   201
            headers['Cookie'] = self.cookies.output()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   202
            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   203
        if extra:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   204
            headers.update(extra)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   205
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   206
        response, content = self.handler.request(fullpath, method="HEAD", headers=headers)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   207
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   208
        resp = self._process_response(response, content)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   209
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   210
        if follow:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   211
            resp = self._handle_redirects(resp)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   212
        return resp
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   213
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   214
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   215
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   216
    def options(self, path, data={}, follow=False, **extra):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   217
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   218
        Request a response from the server using OPTIONS.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   219
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   220
        parsed = list(urlsplit(path))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   221
        parsed[3] = urlencode(data, doseq=True) or parsed[3]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   222
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   223
        fullpath = self._mergeurl(parsed)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   224
        self.handler.follow_redirects = follow
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   225
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   226
        headers = {}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   227
        if len(self.cookies) > 0:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   228
            headers['Cookie'] = self.cookies.output()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   229
            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   230
        if extra:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   231
            headers.update(extra)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   232
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   233
        response, content = self.handler.request(fullpath, method="OPTIONS", headers=headers)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   234
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   235
        resp = self._process_response(response, content)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   236
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   237
        if follow:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   238
            resp = self._handle_redirects(resp)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   239
        return resp
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   240
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   241
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   242
    def put(self, path, data={}, content_type="application/x-www-form-urlencoded",
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   243
            follow=False, **extra):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   244
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   245
        Send a resource to the server using PUT.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   246
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   247
        if content_type is MULTIPART_CONTENT:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   248
            put_data = encode_multipart(BOUNDARY, data)
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   249
        elif content_type == "application/x-www-form-urlencoded":
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   250
            put_data = urlencode(data)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   251
        else:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   252
            put_data = data
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   253
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   254
        parsed = list(urlsplit(path))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   255
        parsed[3] = urlencode(data, doseq=True) or parsed[3]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   256
        fullpath = self._mergeurl(parsed)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   257
        self.handler.follow_redirects = follow
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   258
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   259
        headers = {}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   260
        headers['Content-type'] = content_type
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   261
        if len(self.cookies) > 0:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   262
            headers['Cookie'] = self.cookies.output()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   263
            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   264
        if extra:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   265
            headers.update(extra)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   266
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   267
        response, content = self.handler.request(fullpath, method="PUT", headers=headers, body=put_data)
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   268
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   269
        resp = self._process_response(response, content)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   270
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   271
        if follow:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   272
            resp = self._handle_redirects(response)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   273
        return resp
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   274
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   275
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   276
    def delete(self, path, data={}, follow=False, **extra):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   277
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   278
        Send a DELETE request to the server.
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   279
        """
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   280
        parsed = list(urlsplit(path))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   281
        parsed[3] = urlencode(data, doseq=True) or parsed[3]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   282
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   283
        fullpath = self._mergeurl(parsed)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   284
        self.handler.follow_redirects = follow
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   285
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   286
        headers = {}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   287
        if len(self.cookies) > 0:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   288
            headers['Cookie'] = self.cookies.output()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   289
            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   290
        if extra:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   291
            headers.update(extra)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   292
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   293
        response, content = self.handler.request(fullpath, method="DELETE", headers=headers)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   294
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   295
        resp = self._process_response(response, content)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   296
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   297
        if follow:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   298
            resp = self._handle_redirects(resp)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   299
        return resp
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   300
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   301
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   302
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   303
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   304
class OAuthPayload(object):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   305
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   306
    def __init__(self, servername="testserver"):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   307
        self._token = None
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   308
        self._servername = servername
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   309
        self._oauth_parameters = {
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   310
            'oauth_version': '1.0'
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   311
        }
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   312
        self._oauth_parameters_extra = {
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   313
            'oauth_callback': 'http://127.0.0.1/callback',
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   314
            'scope':'all'
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   315
        }
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   316
        self.errors = StringIO()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   317
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   318
    def _get_signed_request(self, method, path, params):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   319
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   320
        parameters = params.copy()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   321
        parameters.update(self._oauth_parameters)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   322
        oauth_request = Request.from_consumer_and_token(consumer=self._consumer, token=self._token, http_method=method, http_url=path, parameters=parameters)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   323
        oauth_request.sign_request(SignatureMethod_HMAC_SHA1(), consumer=self._consumer, token=self._token)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   324
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   325
        return oauth_request
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   326
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   327
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   328
    def set_consumer(self, key, secret):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   329
        self._consumer = Consumer(key, secret)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   330
        self._oauth_parameters['oauth_consumer_key'] = key
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   331
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   332
    def set_scope(self, value):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   333
        self._oauth_parameters_extra['scope'] = value
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   334
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   335
    def inject_oauth_data(self, path, method, data):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   336
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   337
        path_parsed = urlparse(path)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   338
                
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   339
        if method == 'GET' and (data is None or len(data) == 0):
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   340
            new_data = parse_qs(path_parsed[4])
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   341
        elif  data is None:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   342
            new_data = {}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   343
        else:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   344
            new_data = data.copy()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   345
            
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   346
        clean_path = [''] * 6
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   347
        clean_path[0] = 'http'
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   348
        clean_path[1] = self._servername
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   349
        for i in range(0, 4):
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   350
            clean_path[i] = path_parsed[i] or clean_path[i]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   351
        path = urlunparse(clean_path)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   352
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   353
        oauth_request = self._get_signed_request(method, path, new_data)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   354
                
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   355
        new_data.update(oauth_request)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   356
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   357
        return new_data
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   358
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   359
    def login(self, client, login_method, **credential):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   360
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   361
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   362
        self._oauth_parameters.update(self._oauth_parameters_extra)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   363
        #Obtaining a Request Token
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   364
        resp = client.get(reverse('oauth_request_token'), follow=True)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   365
        if resp.status_code == 200:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   366
            self._token = Token.from_string(resp.content)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   367
        else:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   368
            self.errors.write("oauth_request_token response status code fail : " + repr(resp))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   369
            return False
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   370
                
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   371
        #Requesting User Authorization
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   372
        res = login_method(client, **credential)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   373
        if not res:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   374
            self.errors.write("login failed : " + repr(credential))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   375
            return False
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   376
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   377
        resp = client.get(reverse('oauth_user_authorization'))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   378
        if resp.status_code != 200:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   379
            self.errors.write("oauth_user_authorization get response status code fail : " + repr(resp))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   380
            return False
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   381
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   382
        #"X-Requested-With" : "XMLHttpRequest"
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   383
        resp = client.post(reverse('oauth_user_authorization'), {'authorize_access':1}, **{"X-Requested-With" : "XMLHttpRequest"})
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   384
        if resp.status_code != 302:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   385
            self.errors.write("oauth_user_authorization post response status code fail : " + repr(resp))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   386
            return False
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   387
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   388
        location_splitted = urlsplit(resp["Location"])
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   389
        location_query_dict = parse_qs(location_splitted[3])
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   390
        self._token.verifier = location_query_dict['oauth_verifier']
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   391
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   392
                
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   393
        #Obtaining an Access Token
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   394
        resp = client.get(reverse('oauth_access_token'))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   395
        if resp.status_code == 200:            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   396
            self._token = Token.from_string(resp.content)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   397
            for key in self._oauth_parameters_extra.keys():
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   398
                if key in self._oauth_parameters:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   399
                    del(self._oauth_parameters[key])
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   400
            return True
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   401
        else:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   402
            self.errors.write("oauth_access_token get response status code fail : " + repr(resp))
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   403
            return False
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   404
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   405
    def logout(self):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   406
        self._token = None
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   407
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   408
METHOD_MAPPING = {
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   409
    'get'     : 'GET',
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   410
    'post'    : 'POST',
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   411
    'put'     : 'PUT',
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   412
    'head'    : 'HEAD',
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   413
    'options' : 'OPTIONS',
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   414
    'delete'  : 'DELETE'
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   415
}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   416
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   417
def _generate_request_wrapper(meth):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   418
    def request_wrapper(inst, *args, **kwargs):
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   419
        path = args[0] if len(args) > 0 else kwargs.get('path', '')
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   420
        data = args[1] if len(args) > 1 else kwargs.get('data', {})
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   421
        args = args[2:]
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   422
        if 'path' in kwargs:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   423
            del(kwargs['path'])        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   424
        if 'data' in kwargs:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   425
            del(kwargs['data'])
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   426
        data = inst._oauth_data.inject_oauth_data(path, METHOD_MAPPING[meth.__name__], data)
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   427
        return meth(inst, path=path, data=data, *args, **kwargs)
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   428
    return request_wrapper
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   429
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   430
def _generate_login_wrapper(meth):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   431
    def login_wrapper(inst, **credential):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   432
        return inst._oauth_data.login(inst, meth, **credential)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   433
    return login_wrapper
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   434
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   435
def _generate_logout_wrapper(meth):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   436
    def logout_wrapper(inst):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   437
        inst._oauth_data.logout()
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   438
        meth(inst)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   439
    return logout_wrapper
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   440
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   441
class OAuthMetaclass(type):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   442
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   443
    def __new__(cls, name, bases, attrs):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   444
        newattrs = {}
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   445
        def set_consumer(inst, key, secret):
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   446
            inst._oauth_data.set_consumer(key, secret)
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   447
        newattrs['set_consumer'] = set_consumer
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   448
        def set_scope(inst, scope):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   449
            inst._oauth_data.set_scope(scope)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   450
        newattrs['set_scope'] = set_scope
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   451
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   452
        for attrname, attrvalue in attrs.iteritems():
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   453
            if attrname in ('get', 'post', 'head', 'options', 'put', 'delete'):                
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   454
                newattrs[attrname] = _generate_request_wrapper(attrvalue)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   455
            elif attrname == 'login':
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   456
                newattrs[attrname] = _generate_login_wrapper(attrvalue)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   457
            elif attrname == 'logout':
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   458
                newattrs[attrname] = _generate_logout_wrapper(attrvalue)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   459
            else:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   460
                newattrs[attrname] = attrvalue
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   461
                
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   462
        for klass in bases:
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   463
            for attrname, attrvalue in klass.__dict__.iteritems():
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   464
                if attrname in newattrs:  
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   465
                    continue
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   466
                if attrname in ('get', 'post', 'head', 'options', 'put', 'delete'):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   467
                    newattrs[attrname] = _generate_request_wrapper(attrvalue)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   468
                elif attrname == 'login':
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   469
                    newattrs[attrname] = _generate_login_wrapper(attrvalue)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   470
                elif attrname == 'logout':
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   471
                    newattrs[attrname] = _generate_logout_wrapper(attrvalue)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   472
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   473
        init_method = newattrs.get("__init__", None)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   474
        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   475
        def new_init(inst, *args, **kwargs):
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   476
            inst._oauth_data = OAuthPayload(attrs.get('servername', 'testserver'))
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   477
            if init_method is not None:
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   478
                init_method(*args, **kwargs)
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   479
            else:
63
93325a5d61f0 organize format and import
ymh <ymh.work@gmail.com>
parents: 22
diff changeset
   480
                super(inst.__class__, inst).__init__(*args, **kwargs)
22
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   481
        newattrs["__init__"] = new_init
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   482
                        
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   483
        return super(OAuthMetaclass, cls).__new__(cls, name, bases, newattrs)
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   484
    
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   485
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   486
            
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   487
class OAuthClient(Client):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   488
    __metaclass__ = OAuthMetaclass
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   489
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   490
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   491
class OAuthWebClient(WebClient):
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   492
    __metaclass__ = OAuthMetaclass
03d02cf0bea7 Added text API, test Clients and Testcases
wakimd
parents:
diff changeset
   493
    servername = '127.0.0.1:8000'