diff test/db_test_base.py @ 5110:87b0358790ed

Adding some tests for admin.py. Specifically for issue2550572: setting nosy=+foo on multiple issues gives them all the same exact nosy list. To make this work had to change the admin.py code to use "sys.stdout.write" in place of "print". In the test I now hijack stdout.write following an existing example of this for admin's import/export command that hijacks sys.stderr.write. Also I corrected a misspelling in security.py. The word "everything" was misspelled. It is not inside _() markers so I don't think it's going to affect translation and grepping the locale subdir doesn't show the original string.
author John Rouillard <rouilj@ieee.org>
date Wed, 29 Jun 2016 18:35:19 -0400
parents e424987d294a
children 8901cc4ef0e0
line wrap: on
line diff
--- a/test/db_test_base.py	Tue Jun 28 15:39:38 2016 +1000
+++ b/test/db_test_base.py	Wed Jun 29 18:35:19 2016 -0400
@@ -25,7 +25,7 @@
     Interval, DatabaseError, Boolean, Number, Node, Integer
 from roundup.mailer import Mailer
 from roundup import date, password, init, instance, configuration, \
-    roundupdb, i18n
+    roundupdb, i18n, hyperdb
 from roundup.cgi.templating import HTMLItem
 
 from mocknull import MockNull
@@ -1959,6 +1959,120 @@
             roundup.admin.sys = sys
             shutil.rmtree('_test_export')
 
+    # test props from args parsing
+    def testAdminOtherCommands(self):
+        import roundup.admin
+        from roundup.exceptions import UsageError
+
+        # use the filtering setup to create a bunch of items
+        ae, dummy1, dummy2 = self.filteringSetup()
+        # create large field
+        self.db.priority.create(name = 'X' * 500)
+        self.db.config.CSV_FIELD_SIZE = 400
+        self.db.commit()
+
+        eoutput = [] # stderr output
+        soutput = [] # stdout output
+
+        def stderrwrite(s):
+            eoutput.append(s)
+        def stdoutwrite(s):
+            soutput.append(s)
+        roundup.admin.sys = MockNull ()
+        try:
+            roundup.admin.sys.stderr.write = stderrwrite
+            roundup.admin.sys.stdout.write = stdoutwrite
+
+            tool = roundup.admin.AdminTool()
+            home = '.'
+            tool.tracker_home = home
+            tool.db = self.db
+            tool.verbose = False
+            tool.separator = "\n"
+            tool.print_designator = True
+
+            # test props_from_args
+            self.assertRaises(UsageError, tool.props_from_args, "fullname") # invalid propname
+
+            self.assertEqual(tool.props_from_args("="), {'': None}) # not sure this desired, I'd expect UsageError
+            
+            props = tool.props_from_args(["fullname=robert", "friends=+rouilj,+other", "key="])
+            self.assertEqual(props, {'fullname': 'robert', 'friends': '+rouilj,+other', 'key': None})
+
+            # test get_class()
+            self.assertRaises(UsageError, tool.get_class, "bar") # invalid class
+
+            # This writes to stdout, need to figure out how to redirect to a variable.
+            # classhandle = tool.get_class("user") # valid class
+            # FIXME there should be some test here
+ 
+            issue_class_spec = tool.do_specification(["issue"])
+            self.assertEqual(soutput, ['files: <roundup.hyperdb.Multilink to "file">\n',
+                                       'status: <roundup.hyperdb.Link to "status">\n',
+                                       'feedback: <roundup.hyperdb.Link to "msg">\n',
+                                       'spam: <roundup.hyperdb.Multilink to "msg">\n',
+                                       'nosy: <roundup.hyperdb.Multilink to "user">\n',
+                                       'title: <roundup.hyperdb.String>\n',
+                                       'messages: <roundup.hyperdb.Multilink to "msg">\n',
+                                       'priority: <roundup.hyperdb.Link to "priority">\n',
+                                       'assignedto: <roundup.hyperdb.Link to "user">\n',
+                                       'deadline: <roundup.hyperdb.Date>\n',
+                                       'foo: <roundup.hyperdb.Interval>\n',
+                                       'superseder: <roundup.hyperdb.Multilink to "issue">\n'])
+
+            #userclassprop=tool.do_list(["mls"])
+            #tool.print_designator = False
+            #userclassprop=tool.do_get(["realname","user1"])
+
+            # test do_create
+            soutput[:] = [] # empty for next round of output
+            userclass=tool.do_create(["issue", "title='title1 title'", "nosy=1,3"]) # should be issue 5
+            userclass=tool.do_create(["issue", "title='title2 title'", "nosy=2,3"]) # should be issue 6
+            self.assertEqual(soutput, ['5\n', '6\n'])
+            # verify nosy setting
+            props=self.db.issue.get('5', "nosy")
+            self.assertEqual(props, ['1','3'])
+
+            # test do_set using newly created issues
+            # remove user 3 from issues
+            # verifies issue2550572
+            userclass=tool.do_set(["issue5,issue6", "nosy=-3"])
+            # verify proper result
+            props=self.db.issue.get('5', "nosy")
+            self.assertEqual(props, ['1'])
+            props=self.db.issue.get('6', "nosy")
+            self.assertEqual(props, ['2'])
+
+            # basic usage test. TODO add full output verification
+            soutput[:] = [] # empty for next round of output
+            tool.usage(message="Hello World")
+            self.failUnless(soutput[0].startswith('Problem: Hello World'), None)
+
+            # check security output
+            soutput[:] = [] # empty for next round of output
+            tool.do_security("Admin")
+            self.assertEqual(soutput, [ 'New Web users get the Role "User"\n',
+                                       'New Email users get the Role "User"\n',
+                                       'Role "admin":\n',
+                                       ' User may create everything (Create)\n',
+                                       ' User may edit everything (Edit)\n',
+                                       ' User may retire everything (Retire)\n',
+                                       ' User may view everything (View)\n',
+                                       ' User may access the web interface (Web Access)\n',
+                                       ' User may manipulate user Roles through the web (Web Roles)\n',
+                                       ' User may use the email interface (Email Access)\n',
+                                       'Role "anonymous":\n', 'Role "user":\n',
+                                       ' User is allowed to access msg (View for "msg" only)\n'])
+
+
+            self.nukeAndCreate()
+            tool = roundup.admin.AdminTool()
+            tool.tracker_home = home
+            tool.db = self.db
+            tool.verbose = False
+        finally:
+            roundup.admin.sys = sys
+
     def testAddProperty(self):
         self.db.issue.create(title="spam", status='1')
         self.db.commit()

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