comparison test/test_rest.py @ 5583:c65d98a16780 REST-rebased

Added rest unit test Fixed a bug with printing error message Patch operation remove now replace empty list instead of None committer: Ralf Schlatterbeck <rsc@runtux.com>
author Chau Nguyen <dangchau1991@yahoo.com>
date Wed, 30 Jan 2019 10:26:35 +0100
parents
children 8725c09802b8
comparison
equal deleted inserted replaced
5582:519b7fd8c8c3 5583:c65d98a16780
1 import unittest, os, shutil, errno, sys, difflib, cgi, re
2
3 from xmlrpclib import MultiCall
4 from roundup.cgi.exceptions import *
5 from roundup import init, instance, password, hyperdb, date
6 from roundup.rest import RestfulInstance
7 from roundup.backends import list_backends
8 from roundup.hyperdb import String
9 from roundup.cgi import TranslationService, client
10
11 import db_test_base
12
13 NEEDS_INSTANCE = 1
14
15 class TestCase(unittest.TestCase):
16
17 backend = None
18
19 def setUp(self):
20 self.dirname = '_test_rest'
21 # set up and open a tracker
22 self.instance = db_test_base.setupTracker(self.dirname, self.backend)
23
24 # open the database
25 self.db = self.instance.open('admin')
26
27 # Get user id (user4 maybe). Used later to get data from db.
28 self.joeid = self.db.user.create(
29 username='joe',
30 password=password.Password('random'),
31 address='random@home.org',
32 realname='Joe Random',
33 roles='User'
34 )
35
36 self.db.commit()
37 self.db.close()
38 self.db = self.instance.open('joe')
39
40 self.db.tx_Source = 'web'
41
42 self.db.issue.addprop(tx_Source=hyperdb.String())
43 self.db.msg.addprop(tx_Source=hyperdb.String())
44
45 self.db.post_init()
46
47 thisdir = os.path.dirname(__file__)
48 vars = {}
49 execfile(os.path.join(thisdir, "tx_Source_detector.py"), vars)
50 vars['init'](self.db)
51
52 env = {
53 'PATH_INFO': 'http://localhost/rounduptest/rest/',
54 'HTTP_HOST': 'localhost',
55 'TRACKER_NAME': 'rounduptest'
56 }
57 dummy_client = client.Client(self.instance, None, env, [], None)
58
59 self.server = RestfulInstance(dummy_client, self.db)
60
61 def tearDown(self):
62 self.db.close()
63 try:
64 shutil.rmtree(self.dirname)
65 except OSError, error:
66 if error.errno not in (errno.ENOENT, errno.ESRCH):
67 raise
68
69 def testGet(self):
70 """
71 Retrieve all three users
72 obtain data for 'joe'
73 """
74 # Retrieve all three users.
75 code, results = self.server.get_collection('user', {})
76 self.assertEqual(code, 200)
77 self.assertEqual(len(results), 3)
78
79 # Obtain data for 'joe'.
80 code, results = self.server.get_element('user', self.joeid, {})
81 self.assertEqual(code, 200)
82 self.assertEqual(results['attributes']['username'], 'joe')
83 self.assertEqual(results['attributes']['realname'], 'Joe Random')
84
85 def testPut(self):
86 """
87 Change joe's 'realname'
88 Check if we can't change admin's detail
89 """
90 # Reset joe's 'realname'.
91 form = cgi.FieldStorage()
92 form.list = [
93 cgi.MiniFieldStorage('realname', 'Joe Doe')
94 ]
95 code, results = self.server.put_element('user', self.joeid, form)
96 code, results = self.server.get_element('user', self.joeid, {})
97 self.assertEqual(code, 200)
98 self.assertEqual(results['attributes']['realname'], 'Joe Doe')
99
100 # check we can't change admin's details
101 self.assertRaises(
102 Unauthorised,
103 self.server.put_element, 'user', '1', form
104 )
105
106 def testPost(self):
107 """
108 Post a new issue with title: foo
109 Verify the information of the created issue
110 """
111 form = cgi.FieldStorage()
112 form.list = [
113 cgi.MiniFieldStorage('title', 'foo')
114 ]
115 code, results = self.server.post_collection('issue', form)
116 self.assertEqual(code, 201)
117 issueid = results['id']
118 code, results = self.server.get_element('issue', issueid, {})
119 self.assertEqual(code, 200)
120 self.assertEqual(results['attributes']['title'], 'foo')
121 self.assertEqual(self.db.issue.get(issueid, "tx_Source"), 'web')
122
123 def testPostFile(self):
124 """
125 Post a new file with content: hello\r\nthere
126 Verify the information of the created file
127 """
128 form = cgi.FieldStorage()
129 form.list = [
130 cgi.MiniFieldStorage('content', 'hello\r\nthere')
131 ]
132 code, results = self.server.post_collection('file', form)
133 self.assertEqual(code, 201)
134 fileid = results['id']
135 code, results = self.server.get_element('file', fileid, {})
136 self.assertEqual(code, 200)
137 self.assertEqual(results['attributes']['content'], 'hello\r\nthere')
138
139 def testAuthDeniedPut(self):
140 """
141 Test unauthorized PUT request
142 """
143 # Wrong permissions (caught by roundup security module).
144 form = cgi.FieldStorage()
145 form.list = [
146 cgi.MiniFieldStorage('realname', 'someone')
147 ]
148 self.assertRaises(
149 Unauthorised,
150 self.server.put_element, 'user', '1', form
151 )
152
153 def testAuthDeniedPost(self):
154 """
155 Test unauthorized POST request
156 """
157 form = cgi.FieldStorage()
158 form.list = [
159 cgi.MiniFieldStorage('username', 'blah')
160 ]
161 self.assertRaises(
162 Unauthorised,
163 self.server.post_collection, 'user', form
164 )
165
166 def testAuthAllowedPut(self):
167 """
168 Test authorized PUT request
169 """
170 self.db.setCurrentUser('admin')
171 form = cgi.FieldStorage()
172 form.list = [
173 cgi.MiniFieldStorage('realname', 'someone')
174 ]
175 try:
176 try:
177 self.server.put_element('user', '2', form)
178 except Unauthorised, err:
179 self.fail('raised %s' % err)
180 finally:
181 self.db.setCurrentUser('joe')
182
183 def testAuthAllowedPost(self):
184 """
185 Test authorized POST request
186 """
187 self.db.setCurrentUser('admin')
188 form = cgi.FieldStorage()
189 form.list = [
190 cgi.MiniFieldStorage('username', 'blah')
191 ]
192 try:
193 try:
194 self.server.post_collection('user', form)
195 except Unauthorised, err:
196 self.fail('raised %s' % err)
197 finally:
198 self.db.setCurrentUser('joe')
199
200 def testPatchAdd(self):
201 """
202 Test Patch op 'Add'
203 """
204 # create a new issue with userid 1 in the nosy list
205 issue_id = self.db.issue.create(title='foo', nosy=['1'])
206
207 # add userid 2 to the nosy list
208 form = cgi.FieldStorage()
209 form.list = [
210 cgi.MiniFieldStorage('op', 'add'),
211 cgi.MiniFieldStorage('nosy', '2')
212 ]
213 code, results = self.server.patch_element('issue', issue_id, form)
214 self.assertEqual(code, 200)
215
216 # verify the result
217 code, results = self.server.get_element('issue', issue_id, {})
218 self.assertEqual(code, 200)
219 self.assertEqual(len(results['attributes']['nosy']), 2)
220 self.assertListEqual(results['attributes']['nosy'], ['1', '2'])
221
222 def testPatchReplace(self):
223 """
224 Test Patch op 'Replace'
225 """
226 # create a new issue with userid 1 in the nosy list and status = 1
227 issue_id = self.db.issue.create(title='foo', nosy=['1'], status='1')
228
229 # replace userid 2 to the nosy list and status = 3
230 form = cgi.FieldStorage()
231 form.list = [
232 cgi.MiniFieldStorage('op', 'replace'),
233 cgi.MiniFieldStorage('nosy', '2'),
234 cgi.MiniFieldStorage('status', '3')
235 ]
236 code, results = self.server.patch_element('issue', issue_id, form)
237 self.assertEqual(code, 200)
238
239 # verify the result
240 code, results = self.server.get_element('issue', issue_id, {})
241 self.assertEqual(code, 200)
242 self.assertEqual(results['attributes']['status'], '3')
243 self.assertEqual(len(results['attributes']['nosy']), 1)
244 self.assertListEqual(results['attributes']['nosy'], ['2'])
245
246 def testPatchRemoveAll(self):
247 """
248 Test Patch Action 'Remove'
249 """
250 # create a new issue with userid 1 in the nosy list
251 issue_id = self.db.issue.create(title='foo', nosy=['1', '2'])
252
253 # remove the nosy list and the title
254 form = cgi.FieldStorage()
255 form.list = [
256 cgi.MiniFieldStorage('op', 'remove'),
257 cgi.MiniFieldStorage('nosy', ''),
258 cgi.MiniFieldStorage('title', '')
259 ]
260 code, results = self.server.patch_element('issue', issue_id, form)
261 self.assertEqual(code, 200)
262
263 # verify the result
264 code, results = self.server.get_element('issue', issue_id, {})
265 self.assertEqual(code, 200)
266 self.assertEqual(results['attributes']['title'], None)
267 self.assertEqual(len(results['attributes']['nosy']), 0)
268 self.assertEqual(results['attributes']['nosy'], [])
269
270 def test_suite():
271 suite = unittest.TestSuite()
272 for l in list_backends():
273 dct = dict(backend=l)
274 subcls = type(TestCase)('TestCase_%s' % l, (TestCase,), dct)
275 suite.addTest(unittest.makeSuite(subcls))
276 return suite
277
278 if __name__ == '__main__':
279 runner = unittest.TextTestRunner()
280 unittest.main(testRunner=runner)

Roundup Issue Tracker: http://roundup-tracker.org/