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
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')
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')
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()
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)
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)
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)
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)
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)
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
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')
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')
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)
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')
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)
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>')
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)
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)
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')
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)
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")
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)
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)
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')
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')
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)
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 + "$")
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")
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)
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')
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)
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))
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')
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')
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')
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)
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')
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')
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)
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)
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=".+"')
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')
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))
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))
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')
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))
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))
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')
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&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&milestone=%(name)s">' r'0</a>' % {'name': name2})
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)
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')
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')
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')
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')
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))
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")
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')
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')