1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
# -*- coding: utf-8 -*-
"""
License: BSD
(c) 2009 ::: www.CodeResort.com - BV Network AS (simon-code@bvnetwork.no)
"""
import unittest
import xmlrpclib
import os
import shutil
from tracrpc.tests import rpc_testenv
class RpcTicketTestCase(unittest.TestCase):
def setUp(self):
self.anon = xmlrpclib.ServerProxy(rpc_testenv.url_anon)
self.user = xmlrpclib.ServerProxy(rpc_testenv.url_user)
self.admin = xmlrpclib.ServerProxy(rpc_testenv.url_admin)
def test_getActions(self):
tid = self.admin.ticket.create("ticket_getActions", "kjsald", {})
actions = self.admin.ticket.getActions(tid)
default = [['leave', 'leave', '.', []], ['resolve', 'resolve',
"The resolution will be set. Next status will be 'closed'.",
[['action_resolve_resolve_resolution', 'fixed',
['fixed', 'invalid', 'wontfix', 'duplicate', 'worksforme']]]],
['reassign', 'reassign',
"The owner will change from (none). Next status will be 'assigned'.",
[['action_reassign_reassign_owner', 'admin', []]]],
['accept', 'accept',
"The owner will change from (none) to admin. Next status will be 'accepted'.", []]]
self.assertEquals(default, actions)
self.admin.ticket.delete(tid)
def test_getAvailableActions_DeleteTicket(self):
# http://trac-hacks.org/ticket/5387
tid = self.admin.ticket.create('abc', 'def', {})
self.assertEquals(False,
'delete' in self.admin.ticket.getAvailableActions(tid))
env = rpc_testenv.get_trac_environment()
shutil.copy(os.path.join(
rpc_testenv.trac_src, 'sample-plugins', 'workflow', 'DeleteTicket.py'),
os.path.join(rpc_testenv.tracdir, 'plugins'))
env.config.set('ticket', 'workflow',
'ConfigurableTicketWorkflow,DeleteTicketActionController')
env.config.save()
self.assertEquals(True,
'delete' in self.admin.ticket.getAvailableActions(tid))
self.assertEquals(False,
'delete' in self.user.ticket.getAvailableActions(tid))
env.config.set('ticket', 'workflow',
'ConfigurableTicketWorkflow')
env.config.save()
rpc_testenv.restart()
self.assertEquals(False,
'delete' in self.admin.ticket.getAvailableActions(tid))
def test_FineGrainedSecurity(self):
self.assertEquals(1, self.admin.ticket.create('abc', '123', {}))
self.assertEquals(2, self.admin.ticket.create('def', '456', {}))
# First some non-restricted tests for comparison:
self.assertRaises(xmlrpclib.Fault, self.anon.ticket.create, 'abc', 'def')
self.assertEquals([1,2], self.user.ticket.query())
self.assertTrue(self.user.ticket.get(2))
self.assertTrue(self.user.ticket.update(1, "ok"))
self.assertTrue(self.user.ticket.update(2, "ok"))
# Enable security policy and test
from trac.core import Component, implements
from trac.perm import IPermissionPolicy
policy = os.path.join(rpc_testenv.tracdir, 'plugins', 'TicketPolicy.py')
open(policy, 'w').write(
"from trac.core import *\n"
"from trac.perm import IPermissionPolicy\n"
"class TicketPolicy(Component):\n"
" implements(IPermissionPolicy)\n"
" def check_permission(self, action, username, resource, perm):\n"
" if username == 'user' and resource and resource.id == 2:\n"
" return False\n"
" if username == 'anonymous' and action == 'TICKET_CREATE':\n"
" return True\n")
env = rpc_testenv.get_trac_environment()
_old_conf = env.config.get('trac', 'permission_policies')
env.config.set('trac', 'permission_policies', 'TicketPolicy,'+_old_conf)
env.config.save()
rpc_testenv.restart()
self.assertEquals([1], self.user.ticket.query())
self.assertTrue(self.user.ticket.get(1))
self.assertRaises(xmlrpclib.Fault, self.user.ticket.get, 2)
self.assertTrue(self.user.ticket.update(1, "ok"))
self.assertRaises(xmlrpclib.Fault, self.user.ticket.update, 2, "not ok")
self.assertEquals(3, self.anon.ticket.create('efg', '789', {}))
# Clean, reset and simple verification
env.config.set('trac', 'permission_policies', _old_conf)
env.config.save()
os.unlink(policy)
rpc_testenv.restart()
self.assertEquals([1,2,3], self.user.ticket.query())
self.assertEquals(0, self.admin.ticket.delete(1))
self.assertEquals(0, self.admin.ticket.delete(2))
self.assertEquals(0, self.admin.ticket.delete(3))
def suite():
return unittest.makeSuite(RpcTicketTestCase)
if __name__ == '__main__':
unittest.main(defaultTest='suite')
|