Mercurial > p > roundup > code
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) |
