1 #
2 # Copyright (C) 2007 Stefan Seefeld
3 # All rights reserved.
4 # For license terms see the file COPYING.txt.
5 #
7 import unittest, os, shutil, errno, sys, difflib, cgi, re
9 from roundup.cgi.exceptions import *
10 from roundup import init, instance, password, hyperdb, date
11 from roundup.xmlrpc import RoundupInstance
12 from roundup.backends import list_backends
14 import db_test_base
16 NEEDS_INSTANCE = 1
18 class TestCase(unittest.TestCase):
20 backend = None
22 def setUp(self):
23 self.dirname = '_test_xmlrpc'
24 # set up and open a tracker
25 self.instance = db_test_base.setupTracker(self.dirname, self.backend)
27 # open the database
28 self.db = self.instance.open('admin')
29 self.joeid = 'user' + self.db.user.create(username='joe',
30 password=password.Password('random'), address='random@home.org',
31 realname='Joe Random', roles='User')
33 self.db.commit()
34 self.db.close()
35 self.db = self.instance.open('joe')
36 self.server = RoundupInstance(self.db, self.instance.actions, None)
38 def tearDown(self):
39 try:
40 shutil.rmtree(self.dirname)
41 except OSError, error:
42 if error.errno not in (errno.ENOENT, errno.ESRCH): raise
44 def testAccess(self):
45 # Retrieve all three users.
46 results = self.server.list('user', 'id')
47 self.assertEqual(len(results), 3)
49 # Obtain data for 'joe'.
50 results = self.server.display(self.joeid)
51 self.assertEqual(results['username'], 'joe')
52 self.assertEqual(results['realname'], 'Joe Random')
54 def testChange(self):
55 # Reset joe's 'realname'.
56 results = self.server.set(self.joeid, 'realname=Joe Doe')
57 results = self.server.display(self.joeid, 'realname')
58 self.assertEqual(results['realname'], 'Joe Doe')
60 # check we can't change admin's details
61 self.assertRaises(Unauthorised, self.server.set, 'user1', 'realname=Joe Doe')
63 def testCreate(self):
64 results = self.server.create('issue', 'title=foo')
65 issueid = 'issue' + results
66 results = self.server.display(issueid, 'title')
67 self.assertEqual(results['title'], 'foo')
69 def testFileCreate(self):
70 results = self.server.create('file', 'content=hello\r\nthere')
71 fileid = 'file' + results
72 results = self.server.display(fileid, 'content')
73 self.assertEqual(results['content'], 'hello\r\nthere')
75 def testAction(self):
76 # As this action requires special previledges, we temporarily switch
77 # to 'admin'
78 self.db.setCurrentUser('admin')
79 users_before = self.server.list('user')
80 try:
81 tmp = 'user' + self.db.user.create(username='tmp')
82 self.server.action('retire', tmp)
83 finally:
84 self.db.setCurrentUser('joe')
85 users_after = self.server.list('user')
86 self.assertEqual(users_before, users_after)
88 def testAuthDeniedEdit(self):
89 # Wrong permissions (caught by roundup security module).
90 self.assertRaises(Unauthorised, self.server.set,
91 'user1', 'realname=someone')
93 def testAuthDeniedCreate(self):
94 self.assertRaises(Unauthorised, self.server.create,
95 'user', {'username': 'blah'})
97 def testAuthAllowedEdit(self):
98 self.db.setCurrentUser('admin')
99 try:
100 self.server.set('user2', 'realname=someone')
101 except Unauthorised, err:
102 self.fail('raised %s'%err)
103 finally:
104 self.db.setCurrentUser('joe')
106 def testAuthAllowedCreate(self):
107 self.db.setCurrentUser('admin')
108 try:
109 self.server.create('user', 'username=blah')
110 except Unauthorised, err:
111 self.fail('raised %s'%err)
112 finally:
113 self.db.setCurrentUser('joe')
115 def test_suite():
116 suite = unittest.TestSuite()
117 for l in list_backends():
118 dct = dict(backend = l)
119 subcls = type(TestCase)('TestCase_%s'%l, (TestCase,), dct)
120 suite.addTest(unittest.makeSuite(subcls))
121 return suite
123 if __name__ == '__main__':
124 runner = unittest.TextTestRunner()
125 unittest.main(testRunner=runner)