|
4 | 4 | import errno |
5 | 5 |
|
6 | 6 | from roundup.cgi.exceptions import * |
| 7 | +from roundup.hyperdb import HyperdbValueError |
7 | 8 | from roundup.exceptions import * |
8 | 9 | from roundup import password, hyperdb |
9 | 10 | from roundup.rest import RestfulInstance, calculate_etag |
@@ -1295,6 +1296,26 @@ def testDeleteAttributeUri(self): |
1295 | 1296 | expected['error']['status']) |
1296 | 1297 | self.assertEqual(type(results['error']['msg']), |
1297 | 1298 | type(expected['error']['msg'])) |
| 1299 | + self.assertEqual(str(results['error']['msg']), |
| 1300 | + str(expected['error']['msg'])) |
| 1301 | + self.assertEqual(self.dummy_client.response_code, 400) |
| 1302 | + |
| 1303 | + # delete bogus property |
| 1304 | + etag = calculate_etag(self.db.issue.getnode(issue_id)) |
| 1305 | + form.list.append(cgi.MiniFieldStorage('@etag', etag)) |
| 1306 | + results = self.server.delete_attribute( |
| 1307 | + 'issue', issue_id, 'nosuchprop', form |
| 1308 | + ) |
| 1309 | + expected= {'error': {'status': 400, |
| 1310 | + 'msg': UsageError("Attribute 'nosuchprop' not valid " |
| 1311 | + "for class issue.")}} |
| 1312 | + print(results) |
| 1313 | + self.assertEqual(results['error']['status'], |
| 1314 | + expected['error']['status']) |
| 1315 | + self.assertEqual(type(results['error']['msg']), |
| 1316 | + type(expected['error']['msg'])) |
| 1317 | + self.assertEqual(str(results['error']['msg']), |
| 1318 | + str(expected['error']['msg'])) |
1298 | 1319 | self.assertEqual(self.dummy_client.response_code, 400) |
1299 | 1320 |
|
1300 | 1321 | def testPatchAdd(self): |
@@ -1331,6 +1352,46 @@ def testPatchAdd(self): |
1331 | 1352 | self.assertEqual(len(results['attributes']['nosy']), 2) |
1332 | 1353 | self.assertListEqual(results['attributes']['nosy'], ['1', '2']) |
1333 | 1354 |
|
| 1355 | + etag = calculate_etag(self.db.issue.getnode(issue_id)) |
| 1356 | + form = cgi.FieldStorage() |
| 1357 | + form.list = [ |
| 1358 | + cgi.MiniFieldStorage('@op', 'add'), |
| 1359 | + cgi.MiniFieldStorage('data', '3'), |
| 1360 | + cgi.MiniFieldStorage('@etag', etag) |
| 1361 | + ] |
| 1362 | + results = self.server.patch_attribute('issue', issue_id, 'nosy', form) |
| 1363 | + self.assertEqual(self.dummy_client.response_code, 200) |
| 1364 | + |
| 1365 | + # verify the result |
| 1366 | + results = self.server.get_element('issue', issue_id, self.terse_form) |
| 1367 | + results = results['data'] |
| 1368 | + self.assertEqual(self.dummy_client.response_code, 200) |
| 1369 | + self.assertEqual(len(results['attributes']['nosy']), 3) |
| 1370 | + self.assertListEqual(results['attributes']['nosy'], ['1', '2', '3']) |
| 1371 | + |
| 1372 | + |
| 1373 | + # patch invalid property |
| 1374 | + etag = calculate_etag(self.db.issue.getnode(issue_id)) |
| 1375 | + form = cgi.FieldStorage() |
| 1376 | + form.list = [ |
| 1377 | + cgi.MiniFieldStorage('@op', 'add'), |
| 1378 | + cgi.MiniFieldStorage('data', '3'), |
| 1379 | + cgi.MiniFieldStorage('@etag', etag) |
| 1380 | + ] |
| 1381 | + results = self.server.patch_attribute('issue', issue_id, 'notGoingToWork', form) |
| 1382 | + self.assertEqual(self.dummy_client.response_code, 400) |
| 1383 | + print(results) |
| 1384 | + expected={'error': {'status': 400, |
| 1385 | + 'msg': UsageError( |
| 1386 | + HyperdbValueError( |
| 1387 | + "'notGoingToWork' is not a property of issue",),)}} |
| 1388 | + self.assertEqual(results['error']['status'], |
| 1389 | + expected['error']['status']) |
| 1390 | + self.assertEqual(type(results['error']['msg']), |
| 1391 | + type(expected['error']['msg'])) |
| 1392 | + self.assertEqual(str(results['error']['msg']), |
| 1393 | + str(expected['error']['msg'])) |
| 1394 | + |
1334 | 1395 | def testPatchReplace(self): |
1335 | 1396 | """ |
1336 | 1397 | Test Patch op 'Replace' |
@@ -1374,6 +1435,23 @@ def testPatchReplace(self): |
1374 | 1435 | self.assertEqual(len(results['attributes']['nosy']), 1) |
1375 | 1436 | self.assertListEqual(results['attributes']['nosy'], ['2']) |
1376 | 1437 |
|
| 1438 | + # replace status = 2 using status attribute |
| 1439 | + etag = calculate_etag(self.db.issue.getnode(issue_id)) |
| 1440 | + form = cgi.FieldStorage() |
| 1441 | + form.list = [ |
| 1442 | + cgi.MiniFieldStorage('@op', 'replace'), |
| 1443 | + cgi.MiniFieldStorage('data', '2'), |
| 1444 | + cgi.MiniFieldStorage('@etag', etag) |
| 1445 | + ] |
| 1446 | + results = self.server.patch_attribute('issue', issue_id, 'status', |
| 1447 | + form) |
| 1448 | + self.assertEqual(self.dummy_client.response_code, 200) |
| 1449 | + # verify the result |
| 1450 | + results = self.server.get_element('issue', issue_id, self.terse_form) |
| 1451 | + results = results['data'] |
| 1452 | + self.assertEqual(self.dummy_client.response_code, 200) |
| 1453 | + self.assertEqual(results['attributes']['status'], '2') |
| 1454 | + |
1377 | 1455 | # try to set a protected prop. It should fail. |
1378 | 1456 | etag = calculate_etag(self.db.issue.getnode(issue_id)) |
1379 | 1457 | form = cgi.FieldStorage() |
|
0 commit comments