def runTest(self):
     self._tester.login_as(Usernames.admin)
     page_url = self._tester.url + '/admin/agilo/types/requirement'
     tc.go(page_url)
     
     html = tc.show()
     assert "sum:get_outgoing.rd_points|type=story|story_priority=Mandatory" in html
Esempio n. 2
0
 def runTest(self):
     self._tester.login_as(Usernames.admin)
     # get page for editing requirement ticket type
     page_url = self._tester.url + '/admin/agilo/types/requirement'
     tc.go(page_url)
     tc.url(page_url)
     tc.code(200)
     tc.find('requirement')
     tc.find('Alias:')
     
     # test default field
     tc.find('name="fields" value="businessvalue" checked="checked"')
     
     # change alias and fields and save
     tc.formvalue('modcomp', 'fields', '+priority')
     tc.formvalue('modcomp', 'fields', '-businessvalue')
     tc.formvalue('modcomp', 'fields', '-milestone')
     tc.formvalue('modcomp', 'fields', '-keywords')
     tc.submit('save')
     
     # redirects to list page, now only the priority should be selected
     tc.find('<td class="fields">[\n ]*Priority<br />[\n ]*</td>')
     
     tc.go(page_url)
     # We must ensure that these fields are available for later tests.
     tc.formvalue('modcomp', 'fields', '+businessvalue')
     tc.formvalue('modcomp', 'fields', '+milestone')
     tc.submit('save')
Esempio n. 3
0
    def runTest(self):
        """Admin modify priority details"""
        name = "DetailPriority"
        # Create a priority
        self._tester.create_priority(name + '1')

        # Modify the details of the priority
        priority_url = self._tester.url + "/admin/ticket/priority"
        tc.go(priority_url)
        tc.url(priority_url + '$')
        tc.follow(name + '1')
        tc.url(priority_url + '/' + name + '1')
        tc.formvalue('edit', 'name', name + '2')
        tc.submit('save')
        tc.url(priority_url + '$')

        # Cancel more modifications
        tc.go(priority_url)
        tc.follow(name)
        tc.formvalue('edit', 'name', name + '3')
        tc.submit('cancel')
        tc.url(priority_url + '$')

        # Verify that only the correct modifications show up
        tc.notfind(name + '1')
        tc.find(name + '2')
        tc.notfind(name + '3')
Esempio n. 4
0
    def runTest(self):
        env = self._testenv.get_trac_environment()
        env.config.set('components', 'RaiseExceptionPlugin.*', 'enabled')
        env.config.save()
        create_file(os.path.join(env.path, 'plugins', 'RaiseExceptionPlugin.py'),
"""\
from trac.core import Component, implements
from trac.web.api import IRequestHandler

url = 'http://trac-hacks.org/wiki/HelloWorldMacro'

class RaiseExceptionPlugin(Component):
    implements(IRequestHandler)

    def match_request(self, req):
        if req.path_info == '/raise-exception':
            return True

    def process_request(self, req):
        raise Exception

""")

        try:
            tc.go(self._tester.url + '/raise-exception')
            tc.find(internal_error)
            tc.find('<form class="newticket" method="get" '
                    'action="http://trac-hacks.org/newticket">')
            tc.find('<input type="hidden" name="component" '
                    'value="HelloWorldMacro" />')
        finally:
            env.config.set('components', 'RaiseExceptionPlugin.*', 'disabled')
 def runTest(self):
     self._tester.login_as(Usernames.admin)
     page_url = self._tester.url + '/admin/agilo/fields'
     tc.go(page_url)
     tc.formvalue('addcf', 'name', 'ä')
     tc.submit('add')
     assert 'Only alphanumeric characters allowed for custom field' in tc.show()
Esempio n. 6
0
 def runTest(self):
     """Verify browser log for a new file"""
     tempfilename = random_word() + '_new.txt'
     fulltempfilename = 'component1/trunk/' + tempfilename
     revision = self._testenv.svn_add(fulltempfilename, '')
     tc.go(self._tester.url + '/log/' + fulltempfilename)
     tc.find('@%d' % revision)
     tc.find('Add %s' % fulltempfilename)
Esempio n. 7
0
 def runTest(self):
     """Verify browser log for a new file"""
     tempfilename = random_word() + "_new.txt"
     fulltempfilename = "component1/trunk/" + tempfilename
     revision = self._testenv.svn_add(fulltempfilename, "")
     tc.go(self._tester.url + "/log/" + fulltempfilename)
     tc.find("@%d" % revision)
     tc.find("Add %s" % fulltempfilename)
Esempio n. 8
0
 def _test_adding_a_backlog(self, page_url, backlog_name):
     tc.go(page_url)
     tc.url(page_url)
     tc.fv('addbacklog', 'name', backlog_name)
     tc.submit('add')
     # we're at the edit page
     backlog_url = page_url + '/' + backlog_name
     tc.url(backlog_url)
Esempio n. 9
0
 def runTest(self):
     """Admin remove component"""
     name = "RemovalComponent"
     self._tester.create_component(name)
     component_url = self._tester.url + "/admin/ticket/components"
     tc.go(component_url)
     tc.formvalue('component_table', 'sel', name)
     tc.submit('remove')
     tc.notfind(name)
Esempio n. 10
0
 def runTest(self):
     default_handler = self._testenv.get_config("trac", "default_handler")
     self._testenv.set_config("trac", "default_handler", "PreferencesModule")
     try:
         tc.go(self._tester.url)
         tc.notfind(internal_error)
         tc.find(r"\bPreferences\b")
     finally:
         self._testenv.set_config("trac", "default_handler", default_handler)
Esempio n. 11
0
 def download_as_csv(self):
     url_template = '%(prefix)s/%(backlog)s'
     backlog_path = url_template % dict(prefix=BACKLOG_URL, backlog='Product Backlog')
     url = self.tester.url + unicode_quote(backlog_path) + '?format=csv'
     tc.go(url)
     tc.code(200)
     csv_export = tc.show()
     csvfile = CSVFile(StringIO(csv_export), None, 'UTF-8')
     return csvfile
Esempio n. 12
0
 def runTest(self):
     self._tester.login_as(Usernames.team_member)
     page_url = self._tester.url + TEAM_URL
     tc.go(page_url)
     tc.url(page_url)
     tc.code(200)
     tc.follow('Team#1')
     tc.code(200)
     tc.find('Member#1')
Esempio n. 13
0
 def runTest(self):
     """Admin create duplicate component"""
     name = "DuplicateComponent"
     self._tester.create_component(name)
     component_url = self._tester.url + "/admin/ticket/components"
     tc.go(component_url)
     tc.formvalue('addcomponent', 'name', name)
     tc.submit()
     tc.notfind(internal_error)
     tc.find('Component .* already exists')
Esempio n. 14
0
 def runTest(self):
     """Admin remove version"""
     name = "VersionRemove"
     self._tester.create_version(name)
     version_url = self._tester.url + "/admin/ticket/versions"
     tc.go(version_url)
     tc.formvalue('version_table', 'sel', name)
     tc.submit('remove')
     tc.url(version_url + '$')
     tc.notfind(name)
Esempio n. 15
0
 def runTest(self):
     """Test for regression of http://trac.edgewall.org/ticket/11518
     ResourceNotFound should be raised when version is invalid.
     """
     tc.go(self._tester.url + '/wiki/WikiStart?version=1abc')
     tc.find(r"<h1>Trac Error</h1>")
     tc.find('No version "1abc" for Wiki page "WikiStart')
     tc.go(self._tester.url + '/wiki/WikiStart?version=')
     tc.find(r"<h1>Trac Error</h1>")
     tc.find('No version "" for Wiki page "WikiStart')
Esempio n. 16
0
 def runTest(self):
     """Test for regression of http://trac.edgewall.org/ticket/11777
     fix for raw revisions in search results.
     """
     self._testenv.svn_mkdir(["ticket11777"], "")
     rev = self._testenv.svn_add("ticket11777/file1.txt", "data", "ticket-11777")
     tc.go(self._tester.url + "/search?q=ticket-11777&noquickjump=1&changeset=on")
     tc.notfind(r"\[%010d\]: ticket-11777" % rev)
     tc.find(r"\[%d\]: ticket-11777" % rev)
     tc.find(' href="/changeset/%d"' % rev)
Esempio n. 17
0
    def runTest(self):
        """TracError should be raised when navigating to the attachment
        page for a nonexistent resource."""
        self._tester.go_to_wiki('NonexistentPage')
        tc.find("The page <strong>NonexistentPage</strong> does not exist. "
                "You can create it here.")
        tc.find(r"\bCreate this page\b")

        tc.go(self._tester.url + '/attachment/wiki/NonexistentPage')
        tc.find('<h1>Trac Error</h1>\s+<p class="message">'
                'Parent resource NonexistentPage doesn\'t exist</p>')
Esempio n. 18
0
 def runTest(self):
     """Admin create duplicate version"""
     name = "DuplicateVersion"
     self._tester.create_version(name)
     version_admin = self._tester.url + "/admin/ticket/versions"
     tc.go(version_admin)
     tc.url(version_admin)
     tc.formvalue('addversion', 'name', name)
     tc.submit()
     tc.notfind(internal_error)
     tc.find('Version "%s" already exists.' % name)
Esempio n. 19
0
 def runTest(self):
     default_handler = self._testenv.get_config('trac', 'default_handler')
     self._testenv.set_config('trac', 'default_handler',
                              'PreferencesModule')
     try:
         tc.go(self._tester.url)
         tc.notfind(internal_error)
         tc.find(r"\bPreferences\b")
     finally:
         self._testenv.set_config('trac', 'default_handler',
                                  default_handler)
Esempio n. 20
0
 def runTest(self):
     """Admin badly renumber priorities"""
     # Make the first priority the 2nd priority, and leave the 2nd priority
     # as the 2nd priority.
     priority_url = self._tester.url + '/admin/ticket/priority'
     tc.go(priority_url)
     tc.url(priority_url + '$')
     tc.formvalue('enumtable', 'value_1', '2')
     tc.submit('apply')
     tc.url(priority_url + '$')
     tc.find('Order numbers must be unique')
Esempio n. 21
0
 def runTest(self):
     tc.go(self.tester.url + '/admin/ticket/milestones/' + unicode_quote(self.milestone_name()))
     new_name = self.milestone_name() + 'Renamed'
     tc.formvalue('modifymilestone', 'name', new_name)
     tc.submit('save')
     tc.code(200)
     # Now we expect that the ticket and the sprint have updated milestone
     ticket_page = self.tester.navigate_to_ticket_page(self.tkt_id)
     self.assert_equals(new_name, ticket_page.milestone())
     self.tester.go_to_sprint_edit_page("SprintFor" + self.milestone_name())
     tc.find('for milestone %s</h1>' % new_name)
Esempio n. 22
0
    def runTest(self):
        self.tester.login_as(Usernames.admin)
        tc.go("backlog/Sprint%20Backlog?bscope=non-existing-sprint")
        tc.code(500)
        tc.find("Invalid Sprint name")
        try:
            tc.notfind("trac.edgewall.org/newticket")
        except TwillAssertionError:
            raise Exception("Found a link to the official trac bug tracking platform")

        tc.find("trac-hacks.org/newticket")
Esempio n. 23
0
 def runTest(self):
     self._tester.login_as(Usernames.product_owner)
     dashboard_url = self._tester.url + DASHBOARD_URL
     tc.go(dashboard_url)
     tc.code(200)
     
     self._tester.logout()
     tc.go(dashboard_url)
     tc.code(403)
     
     self._tester.go_to_front()
     tc.notfind('href="%s"' % DASHBOARD_URL)
Esempio n. 24
0
 def runTest(self):
     """Admin remove priority"""
     name = "RemovePriority"
     self._tester.create_priority(name)
     priority_url = self._tester.url + '/admin/ticket/priority'
     tc.go(priority_url)
     tc.url(priority_url + '$')
     tc.find(name)
     tc.formvalue('enumtable', 'sel', name)
     tc.submit('remove')
     tc.url(priority_url + '$')
     tc.notfind(name)
Esempio n. 25
0
    def runTest(self):
        self._tester.logout()
        self._tester.login('user')
        page_name = self._tester.create_wiki_page()
        permission_policies = \
            self._testenv.get_config('trac', 'permission_policies')
        readonly_checkbox = '<input type="checkbox" name="readonly" ' + \
                            'id="readonly" />'
        attach_button = '<input type="submit" id="attachfilebutton" ' + \
                        'value="Attach.+file" />'
        try:
            # User without WIKI_ADMIN can't set a page read-only
            tc.formvalue('modifypage', 'action', 'edit')
            tc.submit()
            tc.notfind(readonly_checkbox)

            # User with WIKI_ADMIN can set a page read-only
            # and still edit that page
            self._testenv.grant_perm('user', 'WIKI_ADMIN')
            self._tester.go_to_wiki(page_name)
            tc.formvalue('modifypage', 'action', 'edit')
            tc.submit()
            tc.find(readonly_checkbox)
            tc.formvalue('edit', 'readonly', True)
            tc.submit('save')
            tc.go(self._tester.url + '/attachment/wiki/' + page_name)
            tc.find(attach_button)
            self._tester.edit_wiki_page(page_name)

            # User without WIKI_ADMIN can't edit a read-only page
            self._testenv.revoke_perm('user', 'WIKI_ADMIN')
            self._tester.go_to_wiki(page_name)
            tc.notfind('<input type="submit" value="Edit this page">')
            tc.go(self._tester.url + '/attachment/wiki/' + page_name)
            tc.notfind(attach_button)

            # Read-only checkbox is not present when ReadonlyWikiPolicy
            # is not in the list of active permission policies
            pp_list = [p.strip() for p in permission_policies.split(',')]
            pp_list.remove('ReadonlyWikiPolicy')
            self._testenv._tracadmin('trac', 'permission_policies',
                                     ', '.join(pp_list))
            self._testenv.grant_perm('user', 'WIKI_ADMIN')
            self._tester.go_to_wiki(page_name)
            tc.formvalue('modifypage', 'action', 'edit')
            tc.submit()
            tc.notfind(readonly_checkbox)
        finally:
            self._testenv.set_config('trac', 'permission_policies',
                                     permission_policies)
            self._testenv.revoke_perm('user', 'WIKI_ADMIN')
            self._tester.logout()
            self._tester.login('admin')
Esempio n. 26
0
    def runTest(self):
        self._tester.login_as(Usernames.admin)

        page_url = self.go_to_admin_links_page()
        # see if one of the default links is there
        tc.find('story-task">Task</a>')
        
        # check if the alias module works correctly, reload the page
        tc.go(page_url)
        tc.find('story-task">Task</a>')

        self.create_link('Bug', 'Requirement', 'bug', 'requirement')
Esempio n. 27
0
 def runTest(self):
     """Test for regression of http://trac.edgewall.org/ticket/11777
     fix for raw revisions in search results.
     """
     self._testenv.svn_mkdir(['ticket11777'], '')
     rev = self._testenv.svn_add('ticket11777/file1.txt', 'data',
                                 'ticket-11777')
     tc.go(self._tester.url +
           '/search?q=ticket-11777&noquickjump=1&changeset=on')
     tc.notfind(r'\[%010d\]: ticket-11777' % rev)
     tc.find(r'\[%d\]: ticket-11777' % rev)
     tc.find(' href="/changeset/%d"' % rev)
Esempio n. 28
0
 def runTest(self):
     """Admin milestone completed"""
     name = "CompletedMilestone"
     self._tester.create_milestone(name)
     milestone_url = self._tester.url + "/admin/ticket/milestones"
     tc.go(milestone_url)
     tc.url(milestone_url)
     tc.follow(name)
     tc.url(milestone_url + '/' + name)
     tc.formvalue('edit', 'completed', True)
     tc.submit('save')
     tc.url(milestone_url + "$")
Esempio n. 29
0
 def runTest(self):
     """Check empty repository"""
     browser_url = self._tester.url + "/browser"
     tc.go(browser_url)
     tc.url(browser_url)
     # This tests the current behavior; I'm not sure it's the best
     # behavior.
     tc.follow("Last Change")
     tc.find("Error: No such changeset")
     tc.back()
     tc.follow("Revision Log")
     tc.notfind("Error: Nonexistent path")
Esempio n. 30
0
 def runTest(self):
     """Admin modify priority"""
     name = "ModifyPriority"
     self._tester.create_priority(name)
     priority_url = self._tester.url + '/admin/ticket/priority'
     tc.go(priority_url)
     tc.url(priority_url + '$')
     tc.find(name)
     tc.follow(name)
     tc.formvalue('edit', 'name', name * 2)
     tc.submit('save')
     tc.url(priority_url + '$')
     tc.find(name * 2)
Esempio n. 31
0
 def runTest(self):
     """Admin create duplicate milestone"""
     name = "DuplicateMilestone"
     self._tester.create_milestone(name)
     milestone_url = self._tester.url + "/admin/ticket/milestones"
     tc.go(milestone_url)
     tc.url(milestone_url)
     tc.formvalue('addmilestone', 'name', name)
     tc.submit()
     tc.notfind(internal_error)
     tc.find('Milestone "%s" already exists, please choose '
             'another name.' % name)
     tc.notfind('%s')
Esempio n. 32
0
 def runTest(self):
     """Admin component detail"""
     name = "DetailComponent"
     self._tester.create_component(name)
     component_url = self._tester.url + "/admin/ticket/components"
     tc.go(component_url)
     tc.follow(name)
     desc = 'Some component description'
     tc.formvalue('edit', 'description', desc)
     tc.submit('cancel')
     tc.url(component_url + '$')
     tc.follow(name)
     tc.notfind(desc)
Esempio n. 33
0
 def runTest(self):
     """Test for regression of http://trac.edgewall.org/ticket/11438
     fix for log: link with revision ranges included "head" keyword
     """
     rev = self._testenv.svn_mkdir(['ticket11438'], '')
     rev = self._testenv.svn_add('ticket11438/file1.txt', '')
     rev = self._testenv.svn_add('ticket11438/file2.txt', '')
     tc.go(self._tester.url + '/intertrac/log:@%d:head' % (rev - 1))
     tc.url(self._tester.url + r'/log/\?revs=' + str(rev - 1) + '-head')
     tc.notfind('@%d' % (rev + 1))
     tc.find('@%d' % rev)
     tc.find('@%d' % (rev - 1))
     tc.notfind('@%d' % (rev - 2))
Esempio n. 34
0
    def runTest(self):
        """Regression test for non-UTF-8 PATH_INFO (#3663)

        Verify that URLs not encoded with UTF-8 are reported as invalid.
        """
        # invalid PATH_INFO
        self._tester.go_to_wiki(u'été'.encode('latin1'))
        tc.code(404)
        tc.find('Invalid URL encoding')
        # invalid SCRIPT_NAME
        tc.go(u'été'.encode('latin1'))
        tc.code(404)
        tc.find('Invalid URL encoding')
Esempio n. 35
0
    def runTest(self):
        """Regression test for non-UTF-8 PATH_INFO (#3663)

        Verify that URLs not encoded with UTF-8 are reported as invalid.
        """
        # invalid PATH_INFO
        self._tester.go_to_wiki(u'été'.encode('latin1'))
        tc.code(404)
        tc.find('Invalid URL encoding')
        # invalid SCRIPT_NAME
        tc.go(u'été'.encode('latin1'))
        tc.code(404)
        tc.find('Invalid URL encoding')
Esempio n. 36
0
    def runTest(self):
        """Admin version detail set time"""
        name = "DetailTimeVersion"
        self._tester.create_version(name)
        version_admin = self._tester.url + "/admin/ticket/versions"
        tc.go(version_admin)
        tc.url(version_admin)
        tc.follow(name)

        tc.formvalue('edit', 'time', '')
        tc.submit('save')
        tc.url(version_admin + '$')
        tc.find(name + '(<[^>]*>|\\s)*<[^>]* name="default" value="%s"' % name,
                's')
Esempio n. 37
0
 def runTest(self):
     """Test for regression of http://trac.edgewall.org/ticket/10850"""
     pagename = self._tester.create_wiki_page()
     # colon characters
     self._tester.attach_file_to_wiki(
         pagename, filename='2012-09-11_15:36:40-test.tbz2')
     base_url = self._tester.url
     tc.go(base_url + '/attachment/wiki/' + pagename +
           '/2012-09-11_15:36:40-test.tbz2')
     tc.notfind('Error: Invalid Attachment')
     # backslash characters
     self._tester.attach_file_to_wiki(pagename,
                                      filename=r'/tmp/back\slash.txt')
     base_url = self._tester.url
     tc.go(base_url + '/attachment/wiki/' + pagename + r'/back\slash.txt')
     tc.notfind('Error: Invalid Attachment')
     # Windows full path
     self._tester.attach_file_to_wiki(pagename,
                                      filename=r'z:\tmp\windows:path.txt')
     base_url = self._tester.url
     tc.go(base_url + '/attachment/wiki/' + pagename + r'/windows:path.txt')
     tc.notfind('Error: Invalid Attachment')
     # Windows share folder path
     self._tester.attach_file_to_wiki(
         pagename, filename=r'\\server\share\file:name.txt')
     base_url = self._tester.url
     tc.go(base_url + '/attachment/wiki/' + pagename + r'/file:name.txt')
     tc.notfind('Error: Invalid Attachment')
Esempio n. 38
0
 def runTest(self):
     """Test for regression of http://trac.edgewall.org/ticket/11346
     fix for log: link with revision ranges included oldest wrongly
     showing HEAD revision
     """
     # create new 3 revisions
     self._testenv.svn_mkdir(['ticket11346'], '')
     for i in (1, 2):
         rev = self._testenv.svn_add('ticket11346/file%d.txt' % i, '')
     tc.go(self._tester.url + '/log?revs=1-2')
     tc.find('@1')
     tc.find('@2')
     tc.notfind('@3')
     tc.notfind('@%d' % rev)
Esempio n. 39
0
    def runTest(self):
        self._tester.logout()
        self._tester.login('user')
        page_name = self._tester.create_wiki_page()
        permission_policies = \
            self._testenv.get_config('trac', 'permission_policies')
        readonly_checkbox = ('<input type="checkbox" name="readonly" '
                             'id="readonly"/>')
        attach_button = ('<input type="submit" id="attachfilebutton" '
                         'value="Attach.+file"/>')
        try:
            # User without WIKI_ADMIN can't set a page read-only
            tc.submit(formname='modifypage')
            tc.notfind(readonly_checkbox)

            # User with WIKI_ADMIN can set a page read-only
            # and still edit that page
            self._testenv.grant_perm('user', 'WIKI_ADMIN')
            self._tester.go_to_wiki(page_name)
            tc.submit(formname='modifypage')
            tc.find(readonly_checkbox)
            tc.formvalue('edit', 'readonly', True)
            tc.submit('save')
            tc.go(self._tester.url + '/attachment/wiki/' + page_name)
            tc.find(attach_button)
            self._tester.edit_wiki_page(page_name)

            # User without WIKI_ADMIN can't edit a read-only page
            self._testenv.revoke_perm('user', 'WIKI_ADMIN')
            self._tester.go_to_wiki(page_name)
            tc.notfind('<input type="submit" value="Edit this page" />')
            tc.go(self._tester.url + '/attachment/wiki/' + page_name)
            tc.notfind(attach_button)

            # Read-only checkbox is not present when DefaultWikiPolicy
            # is not in the list of active permission policies
            pp_list = [p.strip() for p in permission_policies.split(',')]
            pp_list.remove('DefaultWikiPolicy')
            self._testenv.set_config('trac', 'permission_policies',
                                     ', '.join(pp_list))
            self._testenv.grant_perm('user', 'WIKI_ADMIN')
            self._tester.go_to_wiki(page_name)
            tc.submit(formname='modifypage')
            tc.notfind(readonly_checkbox)
        finally:
            self._testenv.set_config('trac', 'permission_policies',
                                     permission_policies)
            self._testenv.revoke_perm('user', 'WIKI_ADMIN')
            self._tester.logout()
            self._tester.login('admin')
Esempio n. 40
0
    def runTest(self):
        """Set default handler from the Basic Settings page."""

        # Confirm default value.
        self._tester.go_to_admin("Basic Settings")
        tc.find(r'<option selected="selected" value="WikiModule">'
                r'WikiModule</option>')
        tc.go(self._tester.url)
        tc.find("Welcome to Trac")

        # Set to another valid default handler.
        self._tester.go_to_admin("Basic Settings")
        tc.formvalue('modbasic', 'default_handler', 'TimelineModule')
        tc.submit()
        tc.find("Your changes have been saved.")
        tc.find(r'<option selected="selected" value="TimelineModule">'
                r'TimelineModule</option>')
        tc.go(self._tester.url)
        tc.find(r'<h1>Timeline</h1>')

        # Set to valid disabled default handler.
        try:
            self._testenv.set_config('components',
                                     'trac.timeline.web_ui.TimelineModule',
                                     'disabled')
            self._tester.go_to_admin("Basic Settings")
            tc.find(r'<option value="TimelineModule">TimelineModule</option>')
            tc.find(r'<span class="hint">TimelineModule is not a valid '
                    r'IRequestHandler or is not enabled.</span>')
            tc.go(self._tester.url)
            tc.find(r'<h1>Configuration Error</h1>')
            tc.find(r'Cannot find an implementation of the '
                    r'<code>IRequestHandler</code> interface named '
                    r'<code>TimelineModule</code>')
        finally:
            self._testenv.remove_config('components',
                                        'trac.timeline.web_ui.timelinemodule')

        # Set to invalid default handler.
        try:
            self._testenv.set_config('trac', 'default_handler',
                                     'BatchModifyModule')
            self._tester.go_to_admin("Basic Settings")
            tc.find(r'<option value="BatchModifyModule">BatchModifyModule'
                    r'</option>')
            tc.find(r'<span class="hint">BatchModifyModule is not a valid '
                    r'IRequestHandler or is not enabled.</span>')
            tc.formvalue('modbasic', 'default_handler', 'BatchModifyModule')
            tc.submit()  # Invalid value should not be replaced on submit
            tc.find(r'<option value="BatchModifyModule">BatchModifyModule'
                    r'</option>')
            tc.find(r'<span class="hint">BatchModifyModule is not a valid '
                    r'IRequestHandler or is not enabled.</span>')
            tc.go(self._tester.url)
            tc.find(r'<h1>Configuration Error</h1>')
            tc.find(r'<code>BatchModifyModule</code> is not a valid default '
                    r'handler.')
        finally:
            self._testenv.set_config('trac', 'default_handler', 'WikiModule')
Esempio n. 41
0
    def runTest(self):
        """Admin version details"""
        name = "DetailVersion"
        self._tester.create_version(name)
        version_admin = self._tester.url + "/admin/ticket/versions"
        tc.go(version_admin)
        tc.url(version_admin)
        tc.follow(name)

        desc = 'Some other version description.'
        tc.formvalue('edit', 'description', desc)
        tc.submit('cancel')
        tc.url(version_admin)
        tc.follow(name)
        tc.notfind(desc)
Esempio n. 42
0
 def runTest(self):
     self._tester.login_as(Usernames.admin)
     self._tester.create_new_team('privilege_team')
     
     self._tester.login_as(Usernames.product_owner)
     teampage_url = self._tester.url + TEAM_URL
     tc.go(teampage_url)
     tc.code(200)
     
     self._tester.logout()
     tc.go(teampage_url)
     tc.code(403)
     
     self._tester.go_to_front()
     tc.notfind('href="%s"' % TEAM_URL)
Esempio n. 43
0
 def test_default(self, enum, name):
     url = self._tester.url + '/admin/ticket/%s' % enum
     tc.go(url)
     tc.url(url + '$')
     tc.find(name)
     tc.formvalue('enumtable', 'default', name)
     tc.submit('apply')
     tc.url(url + '$')
     tc.find('radio.*checked="checked" value="%s"' % name)
     # Test the "Clear default" button
     tc.go(url)
     tc.submit('clear', formname='enumtable')
     tc.url(url + '$')
     tc.notfind(internal_error)
     tc.find('<input type="radio" name="default" value="[^>]+"/>')
     tc.notfind('type="radio" name="default" checked="checked" value=".+"')
Esempio n. 44
0
    def runTest(self):
        # First login as team member, there should be no Requirement but the task
        self._tester.login_as(Usernames.team_member)
        tc.go('/newticket?type=task')
        tc.url(r'(.+)(/newticket\?type=task)')
        error_msg = 'Requirement should not be allowed for team members!'
        self.assertNotFindItem('field-type', 'Requirement', error_msg)
        tc.fv('propertyform', 'field-type', 'Task')

        # Now login as PO and the Requirement should be there, but the task not
        self._tester.login_as(Usernames.product_owner)
        tc.go('/newticket?type=requirement')
        tc.url(r'(.+)(/newticket\?type=requirement)')
        error_msg = 'Task should not be allowed for product owner!'
        self.assertNotFindItem('field-type', 'Task', error_msg)
        tc.fv('propertyform', 'field-type', 'Requirement')
Esempio n. 45
0
 def clear_defaults():
     # Test the "Clear default" button
     tc.go(milestone_url)
     tc.submit('clear', formname='milestone_table')
     tc.notfind('type="radio" name="ticket_default" '
                'checked="checked" value=".+"')
     tc.notfind('type="radio" name="retarget_default" '
                'checked="checked value=".+""')
     self._tester.go_to_ticket(tid)
     tc.find('<th class="missing" id="h_milestone">[ \t\n]+'
             'Milestone:[ \t\n]+</th>[ \t\n]+'
             '(?!<td headers="h_milestone">)')
     self._tester.go_to_milestone(mid2)
     tc.submit(formname='deletemilestone')
     tc.notfind('<option selected="selected" value="%s">%s</option>' %
                (mid1, mid1))
Esempio n. 46
0
 def runTest(self):
     """Admin remove multiple milestones"""
     name = "MultiRemoveMilestone"
     count = 3
     for i in xrange(count):
         self._tester.create_milestone("%s%s" % (name, i))
     milestone_url = self._tester.url + '/admin/ticket/milestones'
     tc.go(milestone_url)
     tc.url(milestone_url + '$')
     for i in xrange(count):
         tc.find("%s%s" % (name, i))
     for i in xrange(count):
         tc.formvalue('milestone_table', 'sel', "%s%s" % (name, i))
     tc.submit('remove')
     tc.url(milestone_url + '$')
     for i in xrange(count):
         tc.notfind("%s%s" % (name, i))
Esempio n. 47
0
 def _delete_sprint(name, retarget=None, tickets=0):
     page_url = '%s/%s' % (SPRINT_URL, name)
     confirm_url = '%s/%s/confirm' % (SPRINT_URL, name)
     tc.go(page_url)
     tc.fv('confirmform', 'delete', 'click')
     tc.submit()
     # show confirmation form
     tc.url(confirm_url)
     if retarget is not None:
         # should show that some tickets can be re-targeted
         tc.find('Retarget the %s remaining tickets to sprint' % tickets)
         tc.fv('confirmform', 'retarget', retarget)
     tc.fv('confirmform', 'sure', 'click')
     tc.submit('sure')
     # we're back at the roadmap
     tc.code(200)
     tc.url('/roadmap')
Esempio n. 48
0
 def runTest(self):
     """Admin remove multiple priorities"""
     name = "MultiRemovePriority"
     count = 3
     for i in xrange(count):
         self._tester.create_priority("%s%s" % (name, i))
     priority_url = self._tester.url + '/admin/ticket/priority'
     tc.go(priority_url)
     tc.url(priority_url + '$')
     for i in xrange(count):
         tc.find("%s%s" % (name, i))
     for i in xrange(count):
         tc.formvalue('enumtable', 'sel', "%s%s" % (name, i))
     tc.submit('remove')
     tc.url(priority_url + '$')
     for i in xrange(count):
         tc.notfind("%s%s" % (name, i))
Esempio n. 49
0
 def runTest(self):
     """Admin remove multiple versions"""
     name = "MultiRemoveVersion"
     count = 3
     for i in xrange(count):
         self._tester.create_version("%s%s" % (name, i))
     version_url = self._tester.url + '/admin/ticket/versions'
     tc.go(version_url)
     tc.url(version_url + '$')
     for i in xrange(count):
         tc.find("%s%s" % (name, i))
     for i in xrange(count):
         tc.formvalue('version_table', 'sel', "%s%s" % (name, i))
     tc.submit('remove')
     tc.url(version_url + '$')
     for i in xrange(count):
         tc.notfind("%s%s" % (name, i))
Esempio n. 50
0
 def _close_sprint(name, retarget=None):
     page_url = '%s/%s' % (SPRINT_URL, name)
     confirm_url = '%s/%s/confirm' % (SPRINT_URL, name)
     tc.go(page_url)
     tc.fv('confirmform', 'close', 'click')
     tc.submit()
     # show confirmation form
     tc.url(confirm_url)
     if retarget is not None:
         # should show that one ticket can be retargeted
         tc.find('Retarget the \d+ remaining tickets to sprint')
         tc.fv('confirmform', 'retarget', retarget)
     tc.fv('confirmform', 'sure', 'click')
     tc.submit('sure')
     
     # we're back at the roadmap
     tc.url('/roadmap')
Esempio n. 51
0
    def runTest(self):
        """Admin milestone listing."""
        name1 = self._tester.create_milestone()
        self._tester.create_ticket(info={'milestone': name1})
        name2 = self._tester.create_milestone()

        milestone_url = self._tester.url + '/admin/ticket/milestones'
        tc.go(milestone_url)
        tc.url(milestone_url)
        tc.find(r'<a href="/admin/ticket/milestones/%(name)s">%(name)s</a>' %
                {'name': name1})
        tc.find(r'<a href="/query\?group=status&amp;milestone=%(name)s">'
                r'1</a>' % {'name': name1})
        tc.find(r'<a href="/admin/ticket/milestones/%(name)s">%(name)s</a>' %
                {'name': name2})
        tc.notfind(r'<a href="/query\?group=status&amp;milestone=%(name)s">'
                   r'0</a>' % {'name': name2})
Esempio n. 52
0
 def runTest(self):
     """Admin milestone completed in the future"""
     name = "CompletedFutureMilestone"
     self._tester.create_milestone(name)
     milestone_url = self._tester.url + "/admin/ticket/milestones"
     tc.go(milestone_url)
     tc.url(milestone_url)
     tc.follow(name)
     tc.url(milestone_url + '/' + name)
     tc.formvalue('edit', 'completed', True)
     cdate = datetime_now(tz=utc) + timedelta(days=2)
     cdate_string = format_date(cdate, tzinfo=localtz, locale=locale_en)
     tc.formvalue('edit', 'completeddate', cdate_string)
     tc.submit('save')
     tc.find('Completion date may not be in the future')
     # And make sure it wasn't marked as completed.
     self._tester.go_to_roadmap()
     tc.find(name)
Esempio n. 53
0
    def runTest(self):
        """Admin modify milestone duedate on detail page"""
        name = "DetailDueMilestone"
        # Create a milestone
        self._tester.create_milestone(name)

        # Modify the details of the milestone
        milestone_url = self._tester.url + "/admin/ticket/milestones"
        tc.go(milestone_url)
        tc.url(milestone_url)
        tc.follow(name)
        tc.url(milestone_url + '/' + name)
        duedate = datetime_now(tz=utc)
        duedate_string = format_datetime(duedate, tzinfo=utc, locale=locale_en)
        tc.formvalue('edit', 'due', True)
        tc.formvalue('edit', 'duedate', duedate_string)
        tc.submit('save')
        tc.url(milestone_url + '$')
        tc.find(name + '(<[^>]*>|\\s)*' + duedate_string, 's')
Esempio n. 54
0
    def runTest(self):
        env = self._testenv.get_trac_environment()
        env.config.set('components', 'RaiseExceptionPlugin.*', 'enabled')
        env.config.save()
        create_file(
            os.path.join(env.path, 'plugins', 'RaiseExceptionPlugin.py'), """\
from trac.core import Component, implements
from trac.web.api import IRequestHandler

url = None

class RaiseExceptionPlugin(Component):
    implements(IRequestHandler)

    def match_request(self, req):
        if req.path_info.startswith('/raise-exception'):
            return True

    def process_request(self, req):
        print('maybe?')
        if req.args.get('report') == 'tho':
            global url
            url = 'http://trac-hacks.org/wiki/HelloWorldMacro'
        raise Exception

""")
        self._testenv.restart()

        try:
            tc.go(self._tester.url + '/raise-exception')
            tc.find(internal_error)
            tc.find('<form class="newticket" method="get" '
                    'action="http://trac.edgewall.org/newticket">')

            tc.go(self._tester.url + '/raise-exception?report=tho')
            tc.find(internal_error)
            tc.find('<form class="newticket" method="get" '
                    'action="http://trac-hacks.org/newticket">')
            tc.find('<input type="hidden" name="component" '
                    'value="HelloWorldMacro" />')
        finally:
            env.config.set('components', 'RaiseExceptionPlugin.*', 'disabled')
Esempio n. 55
0
    def runTest(self):
        """Test for regression of http://trac.edgewall.org/ticket/11584
        don't raise NoSuchChangeset for empty repository if no "rev" parameter
        """
        repo_path = self._testenv.svnadmin_create('repo-t11584')

        self._tester.go_to_admin()
        tc.follow("\\bRepositories\\b")
        tc.url(self._tester.url + '/admin/versioncontrol/repository')

        tc.formvalue('trac-addrepos', 'name', 't11584')
        tc.formvalue('trac-addrepos', 'dir', repo_path)
        tc.submit()
        tc.notfind(internal_error)
        self._testenv._tracadmin('repository', 'sync', 't11584')

        browser_url = self._tester.url + '/browser/t11584'
        tc.go(browser_url)
        tc.url(browser_url)
        tc.notfind('Error: No such changeset')
Esempio n. 56
0
 def runTest(self):
     """Test for regression of https://trac.edgewall.org/ticket/11618
     fix for malformed `readonly="True"` attribute in milestone admin page
     """
     name = "11618Milestone"
     self._tester.create_milestone(name)
     try:
         self._testenv.grant_perm('user', 'TICKET_ADMIN')
         self._tester.go_to_front()
         self._tester.logout()
         self._tester.login('user')
         tc.go(self._tester.url + "/admin/ticket/milestones/" + name)
         tc.notfind('No administration panels available')
         tc.find(' readonly="readonly"')
         tc.notfind(' readonly="True"')
     finally:
         self._testenv.revoke_perm('user', 'TICKET_ADMIN')
         self._tester.go_to_front()
         self._tester.logout()
         self._tester.login('admin')
Esempio n. 57
0
 def _create_sprint(self, name, start_date=None, duration=20, team=None):
     """Creates a sprint"""
     page_url = self._tester.url + '/roadmap'
     tc.go(page_url)
     # click "Add new sprint"
     tc.fv('addnew', 'add', 'click')
     tc.submit()
     tc.url(SPRINT_URL)
     tc.fv('editform', 'name', name)
     if not start_date:
         start_date = now() # This is with localtz
     start_date = normalize_date(start_date)
     tc.fv('editform', 'start', format_datetime(start_date))
     tc.fv('editform', 'duration', str(duration))
     if team:
         tc.fv('editform', 'team', team)
     tc.submit('save')
     tc.url('%s/%s' % (SPRINT_URL, name))
     tc.find('"%s"' % name)
     tc.find(r'(%s)' % format_datetime(start_date))
Esempio n. 58
0
    def runTest(self):
        """Admin remove milestone"""
        name = "MilestoneRemove"
        self._tester.create_milestone(name)
        tid = self._tester.create_ticket(info={'milestone': name})
        milestone_url = self._tester.url + '/admin/ticket/milestones'

        tc.go(milestone_url)
        tc.formvalue('milestone_table', 'sel', name)
        tc.submit('remove')

        tc.url(milestone_url + '$')
        tc.notfind(name)
        self._tester.go_to_ticket(tid)
        tc.find('<th class="missing" id="h_milestone">'
                '[ \t\n]*Milestone:[ \t\n]*</th>')
        tc.find('<th class="trac-field-milestone">Milestone:</th>[ \t\n]+'
                '<td>[ \t\n]+'
                '<span class="trac-field-deleted">%s</span>'
                '[ \t\n]+</td>' % name)
        tc.find("Milestone deleted")
Esempio n. 59
0
    def runTest(self):
        """Admin version detail set time"""
        name = "DetailTimeVersion"
        self._tester.create_version(name)
        version_admin = self._tester.url + "/admin/ticket/versions"
        tc.go(version_admin)
        tc.url(version_admin)
        tc.follow(name)

        tc.formvalue('edit', 'time', '')
        tc.submit('save')
        tc.url(version_admin + '$')
        tc.find(name + '(<[^>]*>|\\s)*<[^>]* name="default" value="%s"' % name,
                's')

        # Empty time value is not automatically populated.
        tc.follow(name)
        tc.find('<input type="text" id="releaseddate"[^>]*value=""')
        tc.submit('save', formname="edit")
        tc.url(version_admin + '$')
        tc.find(name + '(<[^>]*>|\\s)*<[^>]* name="default" value="%s"' % name,
                's')
Esempio n. 60
0
    def runTest(self):
        """Admin renumber priorities"""
        valuesRE = re.compile('<select name="value_([0-9]+)">', re.M)
        html = b.get_html()
        max_priority = max([int(x) for x in valuesRE.findall(html)])

        name = "RenumberPriority"
        self._tester.create_priority(name + '1')
        self._tester.create_priority(name + '2')
        priority_url = self._tester.url + '/admin/ticket/priority'
        tc.go(priority_url)
        tc.url(priority_url + '$')
        tc.find(name + '1')
        tc.find(name + '2')
        tc.formvalue('enumtable', 'value_%s' % (max_priority + 1),
                     str(max_priority + 2))
        tc.formvalue('enumtable', 'value_%s' % (max_priority + 2),
                     str(max_priority + 1))
        tc.submit('apply')
        tc.url(priority_url + '$')
        # Verify that their order has changed.
        tc.find(name + '2.*' + name + '1', 's')