def assert_checklist_for_tags(self, tags, requestid=None): num_checks = 0 checks = [] # Gather reference checklists from the code for tag in tags: # While the tag name is 'search-backend', the checklist type # is truncated to 'search'. if tag == 'search-backend': tag = 'search' if tag not in checklist_reminders: continue plain_list = checklist_reminders[tag] num_checks += len(plain_list) checks += [(tag, check) for check in plain_list] cleanup_tag = '%s-cleanup' % tag cleanup_list = checklist_reminders[cleanup_tag] num_checks += len(cleanup_list) checks += [(cleanup_tag, check) for check in cleanup_list] reqid = self.make_request_with_tags(tags, requestid) checklists = self.get_checklists(reqid) T.assert_equal(num_checks, len(checklists)) for check in checks: T.assert_in((reqid, check[0], check[1]), checklists) return reqid
def test_process_queue_duplicate(self): with nested( mock.patch("%s.pushmanager.core.git.GitQueue.update_request_failure" % __name__), mock.patch("%s.pushmanager.core.git.GitQueue.update_request_successful" % __name__), # This will fail, stop logging errors mock.patch("%s.pushmanager.core.git.logging.error" % __name__), mock.patch( "%s.pushmanager.core.git.GitQueue._get_request_with_sha" % __name__, return_value={"id": 10, "state": "requested"}, ), self.mocked_update_request(self.fake_request, self.fake_request), ): # GitQueue._get_request_with_sha returning a value means # we have a duplicated request. This should trigger a # failure T.assert_equal(pushmanager.core.git.GitQueue.update_request_failure.call_count, 1) T.assert_equal(pushmanager.core.git.GitQueue.update_request_successful.call_count, 0) # Match the error message for duplicate revision. error_msg # should be the last item of the first call object's *args list # (from mock library). T.assert_in( "another request with the same revision sha", pushmanager.core.git.GitQueue.update_request_failure.call_args_list[0][0][-1], )
def test_checklist_single_search_tag(self): with fake_checklist_request(): # insert fake data from FakeDataMixin fake_pushid = 2 self.insert_pushes() self.insert_requests() test1_request = self.get_requests_by_user('testuser1')[0] self.insert_pushcontent(test1_request['id'], fake_pushid) # insert fake checklist data checklist_queries = [ db.push_checklist.insert({ 'request': test1_request['id'], 'type': 'search', 'target': 'prod' }), db.push_checklist.insert({ 'request': test1_request['id'], 'type': 'search-cleanup', 'target': 'post-verify-prod' }), ] db.execute_transaction_cb(checklist_queries, on_db_return) uri = "/checklist?id=%d" % fake_pushid response = self.fetch(uri) T.assert_equal(response.error, None) T.assert_not_in("No checklist items for this push", response.body) T.assert_not_in("multiple requests", response.body) T.assert_in("for testuser1", response.body) T.assert_in("After Certifying - Do In Prod", response.body)
def test_checklist_duplicate(self): with fake_checklist_request(): # insert fake data from FakeDataMixin fake_pushid = 2 self.insert_pushes() self.insert_requests() test1_request = self.get_requests_by_user('testuser1')[0] test2_request = self.get_requests_by_user('testuser2')[0] self.insert_pushcontent(test1_request['id'], fake_pushid) self.insert_pushcontent(test2_request['id'], fake_pushid) # insert fake checklist data checklist_queries = [] for req in (test1_request, test2_request): checklist_queries.append( db.push_checklist.insert({ 'request': req['id'], 'type': 'search', 'target': 'prod' })) checklist_queries.append( db.push_checklist.insert({ 'request': req['id'], 'type': 'search-cleanup', 'target': 'post-verify-prod' })) db.execute_transaction_cb(checklist_queries, on_db_return) uri = "/checklist?id=%d" % fake_pushid response = self.fetch(uri) T.assert_equal(response.error, None) T.assert_not_in("No checklist items for this push", response.body) T.assert_not_equal( re.search("for testuser\d,testuser\d", response.body), None) T.assert_in("After Certifying - Do In Prod", response.body)
def assert_request_buttons(self, tree, button_classes, button_text): found_buttons = [] for button in tree.iter('button'): T.assert_in(button.attrib['class'], button_classes) T.assert_in(button.text, button_text) found_buttons.append(button) T.assert_equal(len(button_classes), len(found_buttons))
def test_branch_name_with_slash(self): fake_request = """{ "id": 10, "user": "******", "repo": "testuser", "state": "requested", "branch": "testuser/testbranch", "revision": "00000", "description": "description for 'testuser/testbranch'", "title": "funny title", "reviewid": 102 }""" with nested( mock.patch.object(SummaryForBranchServlet, "get_current_user", return_value="testuser"), mock.patch.object(SummaryForBranchServlet, "async_api_call", side_effect=self.mocked_api_call), mock.patch.object(self, "api_response", return_value="[%s]" % fake_request), ): self.fetch( "/summaryforbranch?userbranch=testuser/testuser/testbranch") response = self.wait() T.assert_equal(response.error, None) T.assert_in("'testuser/testbranch'", response.body) T.assert_in("102", response.body)
def test_process_queue_duplicate(self): with nested( mock.patch( "%s.pushmanager.core.git.GitQueue.update_request_failure" % __name__), mock.patch( "%s.pushmanager.core.git.GitQueue.update_request_successful" % __name__), # This will fail, stop logging errors mock.patch("%s.pushmanager.core.git.logging.error" % __name__), mock.patch( "%s.pushmanager.core.git.GitQueue._get_request_with_sha" % __name__, return_value={ 'id': 10, 'state': 'requested' }), self.mocked_update_request(self.fake_request, self.fake_request)): # GitQueue._get_request_with_sha returning a value means # we have a duplicated request. This should trigger a # failure T.assert_equal( pushmanager.core.git.GitQueue.update_request_failure. call_count, 1) T.assert_equal( pushmanager.core.git.GitQueue.update_request_successful. call_count, 0) # Match the error message for duplicate revision. error_msg # should be the last item of the first call object's *args list # (from mock library). T.assert_in( "another request with the same revision sha", pushmanager.core. git.GitQueue.update_request_failure.call_args_list[0][0][-1])
def test_checklist_duplicate(self): with fake_checklist_request(): # insert fake data from FakeDataMixin fake_pushid = 2 self.insert_pushes() self.insert_requests() test1_request = self.get_requests_by_user('testuser1')[0] test2_request = self.get_requests_by_user('testuser2')[0] self.insert_pushcontent(test1_request['id'], fake_pushid) self.insert_pushcontent(test2_request['id'], fake_pushid) # insert fake checklist data checklist_queries = [] for req in (test1_request, test2_request): checklist_queries.append(db.push_checklist.insert({ 'request': req['id'], 'type': 'search', 'target': 'prod' })) checklist_queries.append(db.push_checklist.insert({ 'request': req['id'], 'type': 'search-cleanup', 'target': 'post-verify-prod' })) db.execute_transaction_cb(checklist_queries, on_db_return) uri = "/checklist?id=%d" % fake_pushid response = self.fetch(uri) T.assert_equal(response.error, None) T.assert_not_in("No checklist items for this push", response.body) T.assert_not_equal(re.search("for testuser\d,testuser\d", response.body), None) T.assert_in("After Certifying - Do In Prod", response.body)
def test_create_request_bookmarklet(self): with self.page(CreateRequestBookmarkletHandler) as response: # We'll get a javascript as the body, just check some # variable names/strings that we know is there in the # script. T.assert_equal(response.error, None) T.assert_in("ticketNumberToURL", response.body) T.assert_in("codeReview", response.body)
def test_login_post(self): request = {"username": "******", "password": "******"} with mock.patch.object(logging, "exception"): response = self.fetch("/login", method="POST", body=urllib.urlencode(request)) T.assert_in("Invalid username or password specified.", response.body)
def test_escape(self): T.assert_equal( [k for k in self.d if self.ed[k] != self.escaped[k]], [], "EscapedDict values doesn't match with pre-computed valued" ) T.assert_in("&", self.ed['amp']) T.assert_not_in(">", self.ed['gt'])
def verify_tag_rename(self, oldtag, newtag, success, db_results): self.check_db_results(success, db_results) #id, user, state, repo, branch, revision, *tags*, created, etc... tags = [result[6] for result in db_results.fetchall()] T.assert_not_in(oldtag, tags) T.assert_in(newtag, tags)
def test_pushitems(self): with contextlib.nested( mock.patch.object(PushItemsServlet, "get_current_user", return_value=self.fake_request_data["user"]), mock.patch.object(PushItemsServlet, "async_api_call", side_effect=self.mocked_api_call), mock.patch.object(self, "api_response", return_value=self.fake_requests_response) ): self.fetch("/pushitems?push=%d" % self.fake_request_data["id"]) response = self.wait() T.assert_in(self.fake_request_data["title"], response.body)
def verify_type_rename(self, oldtype, newtype, success, db_results): self.check_db_results(success, db_results) # id, push, *type*, status, target types = [result[2] for result in db_results.fetchall()] T.assert_not_in(oldtype, types) T.assert_not_in('%s-cleanup' % oldtype, types) T.assert_in('%s' % newtype, types) T.assert_in('%s-cleanup' % newtype, types)
def test_xmppqueue_on_db_complete(self, xmppq, _): self.call_on_db_complete() no_watcher_call_args = xmppq.call_args_list[0][0] T.assert_equal(['testuser'], no_watcher_call_args[0]) T.assert_in('for testuser', no_watcher_call_args[1]) watched_call_args = xmppq.call_args_list[1][0] T.assert_equal(['testuser', 'testuser1', 'testuser2'], watched_call_args[0]) T.assert_in('for testuser (testuser1,testuser2)', watched_call_args[1])
def test_dialogs_divs(self): tree = self.render_etree(self.push_dialogs_page, push_info=self.basic_push, **self.basic_kwargs) found_divs = [] for div in tree.iter('div'): T.assert_in(div.attrib['id'], self.dialog_ids) found_divs.append(div) T.assert_equal(len(found_divs), len(self.dialog_ids))
def test_dialogs_divs(self): tree = self.render_etree( self.push_dialogs_page, push_info=self.basic_push, **self.basic_kwargs) found_divs = [] for div in tree.iter('div'): T.assert_in(div.attrib['id'], self.dialog_ids) found_divs.append(div) T.assert_equal(len(found_divs),len(self.dialog_ids))
def test_include_push_status_when_accepting(self): tree = self.render_etree(self.push_page, push_info=self.basic_push, **self.basic_kwargs) found_h3 = [] for h3 in tree.iter('h3'): T.assert_equal('status-header', h3.attrib['class']) T.assert_in(h3.attrib['section'], self.accepting_push_sections) found_h3.append(h3) T.assert_equal(len(self.accepting_push_sections), len(found_h3))
def test_push_buttons_random_user(self): with self.no_ui_modules(): tree = self.render_etree(self.push_button_bar_page, push_info=self.basic_push, **self.basic_kwargs) found_buttons = [] for button in tree.iter('button'): T.assert_in(button.attrib['id'], self.push_button_ids_base) found_buttons.append(button) T.assert_equal(len(found_buttons), len(self.push_button_ids_base))
def test_include_push_status_when_accepting(self): tree = self.render_etree( self.push_page, push_info=self.basic_push, **self.basic_kwargs) found_h3 = [] for h3 in tree.iter('h3'): T.assert_equal('status-header', h3.attrib['class']) T.assert_in(h3.attrib['section'], self.accepting_push_sections) found_h3.append(h3) T.assert_equal(len(self.accepting_push_sections), len(found_h3))
def test_push_buttons_random_user(self): with self.no_ui_modules(): tree = self.render_etree( self.push_button_bar_page, push_info=self.basic_push, **self.basic_kwargs) found_buttons = [] for button in tree.iter('button'): T.assert_in(button.attrib['id'], self.push_button_ids_base) found_buttons.append(button) T.assert_equal(len(found_buttons), len(self.push_button_ids_base))
def test_pushitems(self): with contextlib.nested( mock.patch.object(PushItemsServlet, "get_current_user", return_value=self.fake_request_data["user"]), mock.patch.object(PushItemsServlet, "async_api_call", side_effect=self.mocked_api_call), mock.patch.object(self, "api_response", return_value=self.fake_requests_response)): self.fetch("/pushitems?push=%d" % self.fake_request_data["id"]) response = self.wait() T.assert_in(self.fake_request_data["title"], response.body)
def assert_push_info_listitems(self, list_items, push_info_items): for li in list_items: T.assert_in(li[0].text, push_info_items.keys()) if li[0].text == 'Buildbot Runs': T.assert_equal(li[1][0].text, 'url') T.assert_equal(li[1][0].attrib['href'], push_info_items['Buildbot Runs']) elif li[0].text == 'State': T.assert_equal(li[1][0].attrib['class'], 'tags') # Inner ul T.assert_equal(li[1][0][0].attrib['class'], 'tag-%s' % push_info_items['State']) # Inner li T.assert_equal(li[1][0][0].text, push_info_items['State']) elif li[0].text == 'Push Type': T.assert_equal(li[1][0].attrib['class'], 'tags') # Inner ul T.assert_equal(li[1][0][0].attrib['class'], 'tag-%s' % push_info_items['Push Type']) # Inner li T.assert_equal(li[1][0][0].text, push_info_items['Push Type']) else: T.assert_equal(li[1].text, push_info_items[li[0].text]) T.assert_equal(len(list_items), len(push_info_items))
def test_push_buttons_pushmaster(self): kwargs = dict(self.basic_kwargs) kwargs['current_user'] = self.basic_push['user'] with self.no_ui_modules(): tree = self.render_etree(self.push_button_bar_page, push_info=self.basic_push, **kwargs) found_buttons = [] for button in tree.iter('button'): T.assert_in( button.attrib['id'], self.push_button_ids_base + self.push_button_ids_pushmaster) found_buttons.append(button) T.assert_equal( len(found_buttons), len(self.push_button_ids_base + self.push_button_ids_pushmaster))
def test_push_buttons_pushmaster(self): kwargs = dict(self.basic_kwargs) kwargs['current_user'] = self.basic_push['user'] with self.no_ui_modules(): tree = self.render_etree( self.push_button_bar_page, push_info=self.basic_push, **kwargs) found_buttons = [] for button in tree.iter('button'): T.assert_in( button.attrib['id'], self.push_button_ids_base + self.push_button_ids_pushmaster) found_buttons.append(button) T.assert_equal( len(found_buttons), len(self.push_button_ids_base + self.push_button_ids_pushmaster))
def test_hoods_checklists(self): with fake_checklist_request(): # insert fake data from FakeDataMixin fake_pushid = 2 self.insert_pushes() self.insert_requests() req = self.get_requests_by_user('testuser1')[0] self.insert_pushcontent(req['id'], fake_pushid) # insert fake checklist data checklist_queries = [] checklist_items = ( {'request': req['id'], 'type': 'hoods', 'target': 'stage'}, {'request': req['id'], 'type': 'hoods', 'target': 'post-stage'}, {'request': req['id'], 'type': 'hoods', 'target': 'prod'}, {'request': req['id'], 'type': 'hoods-cleanup', 'target': 'post-verify-stage'}, ) for checklist_item in checklist_items: checklist_queries.append(db.push_checklist.insert(checklist_item)) db.execute_transaction_cb(checklist_queries, on_db_return) uri = "/checklist?id=%d" % fake_pushid response = self.fetch(uri) T.assert_equal(response.error, None) T.assert_not_in("No checklist items for this push", response.body) T.assert_in("Notify testuser1 to deploy Geoservices to stage", response.body) T.assert_in("Notify testuser1 to deploy Geoservices to prod", response.body) T.assert_in("Ask Search to force index distribution on stage for testuser1", response.body)
def test_summaryforbranch(self): fake_request = """{ "id": 10, "user": "******", "repo": "testuser", "state": "requested", "branch": "testuser_fixes", "revision": "00000", "description": "long desc", "title": "funny title", "reviewid": 101 }""" with nested( mock.patch.object(SummaryForBranchServlet, "get_current_user", return_value="testuser"), mock.patch.object(SummaryForBranchServlet, "async_api_call", side_effect=self.mocked_api_call), mock.patch.object(self, "api_response", return_value="[%s]" % fake_request), ): self.fetch("/summaryforbranch?userbranch=testuser/testuser_fixes") response = self.wait() T.assert_equal(response.error, None) T.assert_in("long desc", response.body)
def test_hoods_checklists(self): with fake_checklist_request(): # insert fake data from FakeDataMixin fake_pushid = 2 self.insert_pushes() self.insert_requests() req = self.get_requests_by_user('testuser1')[0] self.insert_pushcontent(req['id'], fake_pushid) # insert fake checklist data checklist_queries = [] checklist_items = ( { 'request': req['id'], 'type': 'hoods', 'target': 'stage' }, { 'request': req['id'], 'type': 'hoods', 'target': 'post-stage' }, { 'request': req['id'], 'type': 'hoods', 'target': 'prod' }, { 'request': req['id'], 'type': 'hoods-cleanup', 'target': 'post-verify-stage' }, ) for checklist_item in checklist_items: checklist_queries.append( db.push_checklist.insert(checklist_item)) db.execute_transaction_cb(checklist_queries, on_db_return) uri = "/checklist?id=%d" % fake_pushid response = self.fetch(uri) T.assert_equal(response.error, None) T.assert_not_in("No checklist items for this push", response.body) T.assert_in("Notify testuser1 to deploy Geoservices to stage", response.body) T.assert_in("Notify testuser1 to deploy Geoservices to prod", response.body) T.assert_in( "Ask Search to force index distribution on stage for testuser1", response.body)
def test_watched_mailqueue_on_db_complete(self, mailq): req = { 'user': '******', 'watchers': 'testuser1,testuser2', 'repo': 'repo', 'branch': 'branch', 'title': 'title', 'state': 'discarded', } self.call_on_db_complete(req) watched_call_args = mailq.call_args_list[0][0] T.assert_equal(['testuser', 'testuser1', 'testuser2'], watched_call_args[0]) T.assert_in('Request for testuser (testuser1,testuser2)', watched_call_args[1]) T.assert_in('testuser (testuser1,testuser2) - title', watched_call_args[1]) T.assert_in('[push] testuser (testuser1,testuser2) - title', watched_call_args[2])
def test_no_watched_mailqueue_on_db_complete(self, mailq): req = { 'user': '******', 'watchers': None, 'repo': 'repo', 'branch': 'branch', 'title': 'title', 'state': 'discarded', } self.call_on_db_complete(req) no_watcher_call_args = mailq.call_args_list[0][0] T.assert_equal(['testuser'], no_watcher_call_args[0]) T.assert_in('Request for testuser', no_watcher_call_args[1]) T.assert_in('testuser - title', no_watcher_call_args[1]) T.assert_in('[push] testuser - title', no_watcher_call_args[2])
def test_no_watched_mailqueue_on_db_complete(self, mailq): req = { 'user': '******', 'watchers': None, 'repo': 'repo', 'branch': 'branch', 'title': 'title', 'state': 'delayed', } self.call_on_db_complete(req) no_watcher_call_args = mailq.call_args_list[0][0] T.assert_equal(['testuser'], no_watcher_call_args[0]) T.assert_in('Request for testuser', no_watcher_call_args[1]) T.assert_in('testuser - title', no_watcher_call_args[1]) T.assert_in('[push] testuser - title', no_watcher_call_args[2])
def test_watched_mailqueue_on_db_complete(self, mailq): req = { 'user': '******', 'watchers': 'testuser1,testuser2', 'repo': 'repo', 'branch': 'branch', 'title': 'title', 'state': 'delayed', } self.call_on_db_complete(req) watched_call_args = mailq.call_args_list[0][0] T.assert_equal(['testuser', 'testuser1', 'testuser2'], watched_call_args[0]) T.assert_in('Request for testuser (testuser1,testuser2)', watched_call_args[1]) T.assert_in('testuser (testuser1,testuser2) - title', watched_call_args[1]) T.assert_in('[push] testuser (testuser1,testuser2) - title', watched_call_args[2])
def test_mailqueue_on_db_complete(self, mailq, _): self.call_on_db_complete() no_watcher_call_args = mailq.call_args_list[0][0] T.assert_equal(['testuser'], no_watcher_call_args[0]) T.assert_in('request for testuser', no_watcher_call_args[1]) T.assert_in('testuser - title', no_watcher_call_args[1]) T.assert_in('[push] testuser - title', no_watcher_call_args[2]) watched_call_args = mailq.call_args_list[1][0] T.assert_equal(['testuser', 'testuser1', 'testuser2'], watched_call_args[0]) T.assert_in('request for testuser (testuser1,testuser2)', watched_call_args[1]) T.assert_in('testuser (testuser1,testuser2) - title', watched_call_args[1]) T.assert_in('[push] testuser (testuser1,testuser2) - title', watched_call_args[2])
def test_localizables_push_website_command_is_correct_in_push_js(self): with self.request_fake_pushdata(): response = self.fetch("/static/js/push.js") T.assert_in("localizables_push_website.py", response.body) # Old (bash) version of the script shouldn't be there T.assert_not_in("localizables-push-website", response.body)
def test_check_sites_bookmarklet(self): with self.page(CheckSitesBookmarkletHandler) as response: # See comment above in test_create_request_bookmarklet T.assert_equal(response.error, None) T.assert_in("window.open", response.body)
def test_push_page_is_using_push_js(self): with self.request_fake_pushdata() as fakepush: pushdata, response = fakepush T.assert_in("js/push.js", response.body)
def test_mailqueue_on_db_complete(self, mailq, _): self.call_on_db_complete() no_watcher_call_args = mailq.call_args_list[0][0] T.assert_equal(['testuser'], no_watcher_call_args[0]) T.assert_in('for testuser', no_watcher_call_args[1]) T.assert_in('testuser - title', no_watcher_call_args[1]) T.assert_in('[push] testuser - title', no_watcher_call_args[2]) watched_call_args = mailq.call_args_list[1][0] T.assert_equal(['testuser', 'testuser1', 'testuser2'], watched_call_args[0]) T.assert_in('for testuser (testuser1,testuser2)', watched_call_args[1]) T.assert_in('testuser (testuser1,testuser2) - title', watched_call_args[1]) T.assert_in('[push] testuser (testuser1,testuser2) - title', watched_call_args[2])
def test_mailqueue_on_db_complete(self, mailq): self.call_on_db_complete() no_watcher_call_args = mailq.call_args_list[0][0] T.assert_equal(["testuser"], no_watcher_call_args[0]) T.assert_in("request for testuser", no_watcher_call_args[1]) T.assert_in("testuser - title", no_watcher_call_args[1]) T.assert_in("[push] testuser - title", no_watcher_call_args[2]) watched_call_args = mailq.call_args_list[1][0] T.assert_equal(["testuser", "testuser1", "testuser2"], watched_call_args[0]) T.assert_in("request for testuser (testuser1,testuser2)", watched_call_args[1]) T.assert_in("testuser (testuser1,testuser2) - title", watched_call_args[1]) T.assert_in("[push] testuser (testuser1,testuser2) - title", watched_call_args[2])
def test_no_checklist(self): with fake_checklist_request(): uri = "/checklist?id=1" response = self.fetch(uri) T.assert_equal(response.error, None) T.assert_in("No checklist items for this push", response.body)