9
from django.test.client import Client
9
from django.core.urlresolvers import reverse
10
10
from rpc4django.jsonrpcdispatcher import json, JSONRPC_SERVICE_ERROR
14
class TestRPCViews(unittest.TestCase):
11
from rpc4django import views
12
from rpc4django.tests.utils import SettingsTestCase
15
class TestRPCViews(SettingsTestCase):
17
urls = "rpc4django.tests.test_urls"
17
self.client = Client()
20
self.settings_manager.set(
23
"rpc4django.tests.testmod",
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',
32
DEBUG_PROPAGATE_EXCEPTIONS=False,
35
views._register_rpcmethods(
38
"rpc4django.tests.testmod",
40
restrict_introspection=False,
41
dispatchers=views.dispatchers)
43
self.rpc_path = reverse("serve_rpc_request")
44
self.ns_rpc_path = reverse("my_url_name")
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')
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
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))
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)
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))
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
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)
70
97
data = '{"params":[],"method":"system.listMethods","id":123}'
72
response = self.client.post(RPCPATH, data, 'text/xml')
99
response = self.client.post(self.rpc_path, data, 'text/xml')
74
101
# for some reason, this throws an expat error
75
102
# but only in python 2.4
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)
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)
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))
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')
142
def test_good_url_name(self):
144
Make sure we call functions based on the url they are arriving on.
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)
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)
160
def test_bad_url_name(self):
162
Make sure we cannot call functions using the wrong url_name.
164
data = xmlrpclib.dumps((5, 4), "subtract")
165
response = self.client.post(self.ns_rpc_path, data, 'text/xml')
167
self.assertEqual(response.status_code, 200)
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'))
115
175
if __name__ == '__main__':
b'\\ No newline at end of file'