~jnaous/rpc4django/urlgroups

« back to all changes in this revision

Viewing changes to rpc4django/tests/test_rpcviews.py

  • Committer: Jad Naous
  • Date: 2010-11-20 07:43:51 UTC
  • Revision ID: jnaous@jadsm-20101120074351-u40j1micda55hzqd
Implement isolation across URLs

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
 
7
7
import unittest
8
8
import xmlrpclib
9
 
from django.test.client import Client
 
9
from django.core.urlresolvers import reverse
10
10
from rpc4django.jsonrpcdispatcher import json, JSONRPC_SERVICE_ERROR
11
 
 
12
 
RPCPATH = '/RPC2'
13
 
 
14
 
class TestRPCViews(unittest.TestCase):
15
 
 
 
11
from rpc4django import views
 
12
from rpc4django.tests.utils import SettingsTestCase
 
13
 
 
14
 
 
15
class TestRPCViews(SettingsTestCase):
 
16
 
 
17
    urls = "rpc4django.tests.test_urls"
 
18
    
16
19
    def setUp(self):
17
 
        self.client = Client()
18
 
 
 
20
        self.settings_manager.set(
 
21
            INSTALLED_APPS=(
 
22
                "rpc4django",
 
23
                "rpc4django.tests.testmod",
 
24
            ),
 
25
            MIDDLEWARE_CLASSES=(
 
26
                'django.middleware.common.CommonMiddleware',
 
27
                'django.middleware.transaction.TransactionMiddleware',
 
28
                'django.middleware.csrf.CsrfViewMiddleware',
 
29
                'django.contrib.sessions.middleware.SessionMiddleware',
 
30
                'django.contrib.auth.middleware.AuthenticationMiddleware',
 
31
            ),
 
32
            DEBUG_PROPAGATE_EXCEPTIONS=False,
 
33
        )
 
34
        
 
35
        views._register_rpcmethods(
 
36
            [
 
37
                "rpc4django",
 
38
                "rpc4django.tests.testmod",
 
39
            ],
 
40
            restrict_introspection=False,
 
41
            dispatchers=views.dispatchers)
 
42
        
 
43
        self.rpc_path = reverse("serve_rpc_request")
 
44
        self.ns_rpc_path = reverse("my_url_name")
 
45
        
19
46
    def test_methodsummary(self):
20
 
        response = self.client.get(RPCPATH)
 
47
        response = self.client.get(self.rpc_path)
21
48
        self.assertEqual(response.status_code, 200)
22
49
        self.assertEqual(response.template.name, 'rpc4django/rpcmethod_summary.html')
23
50
    
24
51
    def test_xmlrequests(self):
25
52
        data = '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>'
26
 
        response = self.client.post(RPCPATH, data, 'text/xml')
 
53
        response = self.client.post(self.rpc_path, data, 'text/xml')
27
54
        self.assertEqual(response.status_code, 200)
28
55
        xmlrpclib.loads(response.content)       # this will throw an exception with bad data
29
56
        
30
57
    def test_jsonrequests(self):
31
58
        data = '{"params":[],"method":"system.listMethods","id":123}'
32
 
        response = self.client.post(RPCPATH, data, 'application/json')
 
59
        response = self.client.post(self.rpc_path, data, 'application/json')
33
60
        self.assertEqual(response.status_code, 200)
34
61
        jsondict = json.loads(response.content)
35
62
        self.assertTrue(jsondict['error'] is None)
37
64
        self.assertTrue(isinstance(jsondict['result'], list))
38
65
        
39
66
        data = '{"params":[],"method":"system.describe","id":456}'
40
 
        response = self.client.post(RPCPATH, data, 'text/javascript')
 
67
        response = self.client.post(self.rpc_path, data, 'text/javascript')
41
68
        self.assertEqual(response.status_code, 200)
42
69
        jsondict = json.loads(response.content)
43
70
        self.assertTrue(jsondict['error'] is None)
46
73
        
47
74
    def test_typedetection(self):
48
75
        data = '{"params":[],"method":"system.listMethods","id":123}'
49
 
        response = self.client.post(RPCPATH, data, 'text/plain')
 
76
        response = self.client.post(self.rpc_path, data, 'text/plain')
50
77
        self.assertEqual(response.status_code, 200)
51
78
        jsondict = json.loads(response.content)
52
79
        self.assertTrue(jsondict['error'] is None)
54
81
        self.assertTrue(isinstance(jsondict['result'], list))
55
82
        
56
83
        data = '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>'
57
 
        response = self.client.post(RPCPATH, data, 'text/plain')
 
84
        response = self.client.post(self.rpc_path, data, 'text/plain')
58
85
        self.assertEqual(response.status_code, 200)
59
86
        xmlrpclib.loads(response.content)       # this will throw an exception with bad data
60
87
        
61
88
        # jsonrpc request with xmlrpc data (should be error)
62
89
        data = '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>'
63
 
        response = self.client.post(RPCPATH, data, 'application/json')
 
90
        response = self.client.post(self.rpc_path, data, 'application/json')
64
91
        self.assertEqual(response.status_code, 200)
65
92
        jsondict = json.loads(response.content)
66
93
        self.assertTrue(jsondict['result'] is None)
69
96
        
70
97
        data = '{"params":[],"method":"system.listMethods","id":123}'
71
98
        try:
72
 
            response = self.client.post(RPCPATH, data, 'text/xml')
 
99
            response = self.client.post(self.rpc_path, data, 'text/xml')
73
100
        except:
74
101
            # for some reason, this throws an expat error
75
102
            # but only in python 2.4
83
110
        
84
111
    def test_badrequests(self):
85
112
        data = '{"params":[],"method":"system.methodHelp","id":456}'
86
 
        response = self.client.post(RPCPATH, data, 'application/json')
 
113
        response = self.client.post(self.rpc_path, data, 'application/json')
87
114
        self.assertEqual(response.status_code, 200)
88
115
        jsondict = json.loads(response.content)
89
116
        self.assertTrue(jsondict['error'] is not None)
92
119
        self.assertEqual(jsondict['error']['code'], JSONRPC_SERVICE_ERROR)
93
120
        
94
121
        data = '<?xml version="1.0"?><methodCall><methodName>method.N0t.Exists</methodName><params></params></methodCall>'
95
 
        response = self.client.post(RPCPATH, data, 'text/xml')
 
122
        response = self.client.post(self.rpc_path, data, 'text/xml')
96
123
        self.assertEqual(response.status_code, 200)
97
124
        try:
98
125
            xmlrpclib.loads(response.content)
108
135
            # options requests can only be tested by django 1.1+
109
136
            self.fail('This version of django "%s" does not support http access control' %str(t))
110
137
        
111
 
        response = self.client.options(RPCPATH, '', 'text/plain')
 
138
        response = self.client.options(self.rpc_path, '', 'text/plain')
112
139
        self.assertEqual(response['Access-Control-Allow-Methods'], 'POST, GET, OPTIONS')
113
140
        self.assertEqual(response['Access-Control-Max-Age'], '0')
114
141
        
 
142
    def test_good_url_name(self):
 
143
        """
 
144
        Make sure we call functions based on the url they are arriving on. 
 
145
        """
 
146
        data = xmlrpclib.dumps((5, 4), "subtract")
 
147
        response = self.client.post(self.rpc_path, data, 'text/xml')
 
148
        self.assertEqual(response.status_code, 200)
 
149
        result, methname = xmlrpclib.loads(response.content)
 
150
        self.assertEqual(result, (1,))
 
151
        self.assertEqual(methname, None)
 
152
        
 
153
        data = xmlrpclib.dumps((5, 4), "product")
 
154
        response = self.client.post(self.ns_rpc_path, data, 'text/xml')
 
155
        self.assertEqual(response.status_code, 200)
 
156
        result, methname = xmlrpclib.loads(response.content)
 
157
        self.assertEqual(result, (20,))
 
158
        self.assertEqual(methname, None)
 
159
 
 
160
    def test_bad_url_name(self):
 
161
        """
 
162
        Make sure we cannot call functions using the wrong url_name.
 
163
        """
 
164
        data = xmlrpclib.dumps((5, 4), "subtract")
 
165
        response = self.client.post(self.ns_rpc_path, data, 'text/xml')
 
166
        
 
167
        self.assertEqual(response.status_code, 200)
 
168
        try:
 
169
            result, methname = xmlrpclib.loads(response.content)
 
170
            self.fail("Expected xmlrpclib Fault")
 
171
        except xmlrpclib.Fault as fault:
 
172
            self.assertEqual(fault.faultCode, 1)
 
173
            self.assertTrue(fault.faultString.endswith('method "subtract" is not supported'))
 
174
        
115
175
if __name__ == '__main__':
116
176
    unittest.main()
 
 
b'\\ No newline at end of file'