def test_too_quick_close(self): # https://github.com/ansible/ansible/issues/37518 datafile = u'tests/fixtures/needs_info/2_noclose.yml' with get_issue(datafile, self.statusfile) as iw: facts = needs_info.needs_info_timeout_facts(iw, self.meta) self.assertEquals(facts[u'needs_info_action'], None)
def test_too_quick_close2(self): # https://github.com/ansible/ansible/issues/20977 datafile = 'tests/fixtures/needs_info/3_noclose.yml' with get_issue(datafile, self.statusfile) as iw: facts = needs_info.needs_info_timeout_facts(iw, self.meta) self.assertEqual(facts['needs_info_action'], 'warn')
def test_submitter_is_core_team_and_maintainer(self): """ Submitter is a namespace maintainer *and* a core team member: approval must be automatically added https://github.com/ansible/ansible/pull/21620 """ datafile = u'tests/fixtures/shipit/1_issue.yml' statusfile = u'tests/fixtures/shipit/1_prstatus.json' with get_issue(datafile, statusfile) as iw: namespace_maintainers = [u'LinusU'] _meta = self.meta.copy() _meta[u'component_maintainers'] = [] _meta[ u'component_namespace_maintainers'] = namespace_maintainers[:] facts = get_shipit_facts(iw, _meta, ModuleIndexerMock(namespace_maintainers), core_team=[u'bcoca', u'mscherer'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertEqual([u'LinusU'], facts[u'community_usernames']) self.assertEqual([u'LinusU', u'mscherer'], facts[u'shipit_actors']) self.assertEqual(facts[u'shipit_count_ansible'], 1) # bcoca, mscherer self.assertEqual(facts[u'shipit_count_maintainer'], 0) # abulimov self.assertEqual(facts[u'shipit_count_community'], 1) # LinusU self.assertTrue(facts[u'shipit'])
def test_shipit_overrides_changes_requested_github_review(self): """ Ansibot should ignore CHANGES_REQUESTED Github review when the author of the CHANGES_REQUESTED review used the shipit command. """ datafile = u'tests/fixtures/needs_revision/0_issue.yml' statusfile = u'tests/fixtures/needs_revision/0_prstatus.json' with mock.patch.multiple(IssueWrapper, mergeable_state=mock.PropertyMock(return_value='clean'), pullrequest_filepath_exists=mock.Mock(return_value=True)): with get_issue(datafile, statusfile) as iw: iw._merge_commits = [] iw._committer_emails = [u'*****@*****.**'] pullrequest = mock.Mock(spec_set=github.PullRequest.PullRequest) pullrequest.head.repo.__return_value__ = True iw._pr = pullrequest with open(u'tests/fixtures/needs_revision/0_reviews.json') as reviews: iw._pr_reviews = json.load(reviews) iw._history.merge_reviews(iw.reviews) self.meta[u'component_maintainers'] = [u'robinro'] facts = get_needs_revision_facts(AnsibleTriageMock(), iw, self.meta, ShippableRunsMock()) self.assertFalse(facts[u'is_needs_revision']) self.assertFalse(facts[u'stale_reviews'])
def test_too_quick_close2(self): # https://github.com/ansible/ansible/issues/20977 datafile = u'tests/fixtures/needs_info/3_noclose.yml' with get_issue(datafile, self.statusfile) as iw: facts = needs_info.needs_info_timeout_facts(iw, self.meta) self.assertEquals(facts[u'needs_info_action'], u'warn')
def test_owner_pr_module_utils_and_modules_updated_submitter_maintainer_2(self): """ PR updates 2 files (one below modules, the other below module_utils), submitter is a maintainer from both, check that owner_pr is set. Submitter is maintainer from module_utils file. """ BOTMETA = u""" --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $modules/foo/bar.py: maintainers: ElsA ZaZa $module_utils/baz/bar.py: maintainers: TiTi mscherer """ modules = {u'lib/ansible/modules/foo/bar.py': None} module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 2) # ensure only fake data are loaded self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/modules/foo/bar.py'][u'maintainers']), [u'ElsA', u'ZaZa']) self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/module_utils/baz/bar.py'][u'maintainers']), [u'TiTi', u'mscherer']) CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/module_utils/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'mscherer'], u'notify': [u'ElsA', u'mscherer'], u'ignore': [], }, { u'repo_filename': u'lib/ansible/modules/baz/bar.py', u'labels': [], u'support': None, u'maintainers': [u'TiTi', u'ZaZa'], u'notify': [u'TiTi', u'ZaZa'], u'ignore': [], } ] meta = self.meta.copy() datafile = u'tests/fixtures/shipit/0_issue.yml' statusfile = u'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [ MockFile(u'lib/ansible/modules/foo/bar.py'), MockFile(u'lib/ansible/module_utils/baz/bar.py') ] iw.file_indexer = FileIndexerMock() meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertFalse(facts[u'owner_pr'])
def test_shipit_removes_needs_revision(self): """ Ansibot should remove needs_revision if the same user that set it gave shipit afterwards. https://github.com/ansible/ansibullbot/issues/994 """ datafile = u'tests/fixtures/needs_revision/1_issue.yml' statusfile = u'tests/fixtures/needs_revision/0_prstatus.json' with mock.patch.multiple(IssueWrapper, mergeable_state=mock.PropertyMock(return_value='clean'), pullrequest_filepath_exists=mock.Mock(return_value=True)): with get_issue(datafile, statusfile) as iw: iw._merge_commits = [] iw._committer_emails = [u'*****@*****.**'] pullrequest = mock.Mock(spec_set=github.PullRequest.PullRequest) pullrequest.head.repo.__return_value__ = True iw._pr = pullrequest with open(u'tests/fixtures/needs_revision/1_reviews.json') as reviews: iw._pr_reviews = json.load(reviews) iw._history.merge_reviews(iw.reviews) self.meta[u'component_maintainers'] = [u'mkrizek'] facts = get_needs_revision_facts(AnsibleTriageMock(), iw, self.meta) self.assertFalse(facts[u'is_needs_revision'])
def test_submitter_is_maintainer(self): """ Submitter is a namespace maintainer: approval must be automatically added """ datafile = 'tests/fixtures/shipit/0_issue.yml' statusfile = 'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: namespace_maintainers = ['LinusU', 'mscherer'] _meta = self.meta.copy() _meta['component_maintainers'] = [] _meta['component_namespace_maintainers'] = namespace_maintainers[:] facts = get_shipit_facts(iw, _meta, ModuleIndexerMock(namespace_maintainers), core_team=['bcoca'], botnames=['ansibot']) self.assertEqual(iw.submitter, 'mscherer') self.assertEqual(['LinusU', 'mscherer'], facts['community_usernames']) self.assertEqual(['mscherer'], facts['shipit_actors']) self.assertEqual(facts['shipit_count_ansible'], 0) # bcoca self.assertEqual(facts['shipit_count_maintainer'], 0) # abulimov self.assertEqual(facts['shipit_count_community'], 1) # LinusU, mscherer self.assertFalse(facts['shipit'])
def test_shipit_removes_needs_revision(self): """ Ansibot should remove needs_revision if the same user that set it gave shipit afterwards. https://github.com/ansible/ansibullbot/issues/994 """ datafile = u'tests/fixtures/needs_revision/1_issue.yml' statusfile = u'tests/fixtures/needs_revision/0_prstatus.json' with mock.patch.multiple(IssueWrapper, mergeable_state=mock.PropertyMock(return_value='clean'), pullrequest_filepath_exists=mock.Mock(return_value=True)): with get_issue(datafile, statusfile) as iw: iw._merge_commits = [] iw._committer_emails = [u'*****@*****.**'] pullrequest = mock.Mock(spec_set=github.PullRequest.PullRequest) pullrequest.head.repo.__return_value__ = True iw._pr = pullrequest with open(u'tests/fixtures/needs_revision/1_reviews.json') as reviews: iw._pr_reviews = json.load(reviews) iw._history.merge_reviews(iw.reviews) self.meta[u'component_maintainers'] = [u'mkrizek'] facts = get_needs_revision_facts(AnsibleTriageMock(), iw, self.meta, ShippableRunsMock()) self.assertFalse(facts[u'is_needs_revision'])
def test_owner_pr_submitter_is_maintainer_new_module(self): """ Submitter is a maintainer: pull request adds a new module: ensure owner_pr is False """ botmeta_files = {u'lib/ansible/modules/foo/bar.py': {u'maintainers': [u'ElsA', u'mscherer']}} CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/modules/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'mscherer'], u'notify': [u'ElsA', u'mscherer'], u'ignore': [], } ] meta = self.meta.copy() datafile = u'tests/fixtures/shipit/0_issue.yml' statusfile = u'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile(u'lib/ansible/modules/foo/bar.py')] iw.gitrepo = GitRepoWrapperMock() meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, botmeta_files, core_team=[u'bcoca'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertFalse(facts[u'owner_pr'])
def test_owner_pr_submitter_is_maintainer_one_module_utils_file_updated(self): """ Submitter is a maintainer: ensure owner_pr is set (only one file below module_utils updated) """ botmeta_files = {'lib/ansible/module_utils/foo/bar.py': {'maintainers': ['ElsA', 'Oliver']}} datafile = u'tests/fixtures/shipit/2_issue.yml' statusfile = u'tests/fixtures/shipit/2_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile(u'lib/ansible/module_utils/foo/bar.py')] # need to give the wrapper a list of known files to compare against iw.gitrepo = GitRepoWrapperMock() iw.gitrepo.files.append(u'lib/ansible/modules/foo/bar.py') # predefine what the matcher is going to return CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/module_utils/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'Oliver'], u'notify': [u'ElsA', u'Oliver'], u'ignore': [], } ] meta = self.meta.copy() iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, botmeta_files, core_team=[u'bcoca', u'mscherer'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'ElsA') self.assertTrue(facts[u'owner_pr'])
def test_shipit_overrides_changes_requested_github_review(self): """ Ansibot should ignore CHANGES_REQUESTED Github review when the author of the CHANGES_REQUESTED review used the shipit command. """ datafile = u'tests/fixtures/needs_revision/0_issue.yml' statusfile = u'tests/fixtures/needs_revision/0_prstatus.json' with mock.patch.multiple(IssueWrapper, mergeable_state=mock.PropertyMock(return_value='clean'), pullrequest_filepath_exists=mock.Mock(return_value=True)): with get_issue(datafile, statusfile) as iw: iw._merge_commits = [] iw._committer_emails = [u'*****@*****.**'] pullrequest = mock.Mock(spec_set=github.PullRequest.PullRequest) pullrequest.head.repo.__return_value__ = True iw._pr = pullrequest with open(u'tests/fixtures/needs_revision/0_reviews.json') as reviews: iw._pr_reviews = json.load(reviews) iw._history.merge_reviews(iw.reviews) self.meta[u'component_maintainers'] = [u'robinro'] facts = get_needs_revision_facts(AnsibleTriageMock(), iw, self.meta) self.assertFalse(facts[u'is_needs_revision']) self.assertFalse(facts[u'stale_reviews'])
def test_needs_contributor_command(self): datafile = 'tests/fixtures/needs_contributor/0_issue.yml' with get_issue(datafile, self.statusfile) as iw: #import epdb; epdb.st() facts = get_needs_contributor_facts(AnsibleTriageMock(), iw, self.meta) self.assertTrue(facts['is_needs_contributor'])
def iw(meta, statusfile): datafile = 'tests/fixtures/needs_contributor/0_issue.yml' with get_issue(datafile, statusfile) as iw: iw._assignees = [] iw._merge_commits = [] iw.repo = RepoMock(meta['component_maintainers'] + meta['component_notifiers']) return iw
def test_owner_pr_module_utils_and_modules_updated_submitter_maintainer_1( self): """ PR updates 2 files (one below modules, the other below module_utils), submitter is a maintainer from both, check that owner_pr is set. Submitter is maintainer from module file. """ botmeta_files = { 'lib/ansible/modules/foo/bar.py': { 'maintainers': ['ElsA', 'mscherer'] }, 'lib/ansible/module_utils/baz/bar.py': { 'maintainers': ['TiTi', 'ZaZa'] }, } CM = ComponentMatcherMock() CM.expected_results = [{ 'repo_filename': 'lib/ansible/module_utils/foo/bar.py', 'labels': [], 'support': None, 'maintainers': ['ElsA', 'mscherer'], 'notify': ['ElsA', 'mscherer'], 'ignore': [], }, { 'repo_filename': 'lib/ansible/modules/baz/bar.py', 'labels': [], 'support': None, 'maintainers': ['TiTi', 'ZaZa'], 'notify': ['TiTi', 'ZaZa'], 'ignore': [], }] meta = self.meta.copy() datafile = 'tests/fixtures/shipit/0_issue.yml' statusfile = 'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [ MockFile('lib/ansible/modules/foo/bar.py'), MockFile('lib/ansible/module_utils/baz/bar.py') ] iw.gitrepo = GitRepoWrapperMock() iw.gitrepo.files = [ 'lib/ansible/modules/foo/bar.py', 'lib/ansible/module_utils/baz/bar.py' ] iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, botmeta_files, core_team=['bcoca', 'mscherer'], botnames=['ansibot']) self.assertEqual(iw.submitter, 'mscherer') self.assertFalse(facts['owner_pr'])
def test_owner_pr_submitter_is_maintainer_one_module_file_updated_changelog( self): """ Submitter is a maintainer: ensure owner_pr is set even if changelog fragment is present """ BOTMETA = u""" --- macros: modules: lib/ansible/modules files: $modules/foo/bar.py: maintainers: ElsA Oliver """ modules = {u'lib/ansible/modules/foo/bar.py': None} module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 2) # ensure only fake data are loaded self.assertEqual( sorted(module_indexer.botmeta[u'files'] [u'lib/ansible/modules/foo/bar.py'][u'maintainers']), [u'ElsA', u'Oliver']) datafile = u'tests/fixtures/shipit/2_issue.yml' statusfile = u'tests/fixtures/shipit/2_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [ MockFile(u'lib/ansible/modules/foo/bar.py'), MockFile(u'changelogs/fragments/00000-fragment.yaml') ] # need to give the wrapper a list of known files to compare against iw.file_indexer = FileIndexerMock() iw.file_indexer.files.append(u'lib/ansible/modules/foo/bar.py') # predefine what the matcher is going to return CM = ComponentMatcherMock() CM.expected_results = [{ u'repo_filename': u'lib/ansible/modules/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'Oliver'], u'notify': [u'ElsA', u'Oliver'], u'ignore': [], }] meta = self.meta.copy() iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca', u'mscherer'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'ElsA') self.assertTrue(facts[u'owner_pr'])
def test_owner_pr_submitter_is_maintainer_new_module(self): """ Submitter is a maintainer: pull request adds a new module: ensure owner_pr is False """ BOTMETA = """ --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $modules/foo/bar.py: maintainers: ElsA mscherer """ modules = {} # new module module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 1) # ensure only fake data are loaded # Ensure that BOTMETA.yml updates doesn't interfere self.assertEqual( sorted(module_indexer.botmeta['files'] ['lib/ansible/modules/foo/bar.py']['maintainers']), ['ElsA', 'mscherer']) CM = ComponentMatcherMock() CM.expected_results = [{ 'repo_filename': 'lib/ansible/modules/foo/bar.py', 'labels': [], 'support': None, 'maintainers': ['ElsA', 'mscherer'], 'notify': ['ElsA', 'mscherer'], 'ignore': [], }] meta = self.meta.copy() datafile = 'tests/fixtures/shipit/0_issue.yml' statusfile = 'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile('lib/ansible/modules/foo/bar.py')] iw.file_indexer = FileIndexerMock() #iw.file_indexer.files.append('lib/ansible/modules/foo/bar.py') meta.update( get_component_match_facts(iw, {}, CM, iw.file_indexer, module_indexer, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=['bcoca'], botnames=['ansibot']) self.assertEqual(iw.submitter, 'mscherer') self.assertFalse(facts['owner_pr'])
def test_owner_pr_module_utils_and_modules_updated_submitter_maintainer_2( self): """ PR updates 2 files (one below modules, the other below module_utils), submitter is a maintainer from both, check that owner_pr is set. Submitter is maintainer from module_utils file. """ BOTMETA = """ --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $modules/foo/bar.py: maintainers: ElsA ZaZa $module_utils/baz/bar.py: maintainers: TiTi mscherer """ modules = {'lib/ansible/modules/foo/bar.py': None} module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 2) # ensure only fake data are loaded self.assertEqual( sorted(module_indexer.botmeta['files'] ['lib/ansible/modules/foo/bar.py']['maintainers']), ['ElsA', 'ZaZa']) self.assertEqual( sorted(module_indexer.botmeta['files'] ['lib/ansible/module_utils/baz/bar.py']['maintainers']), ['TiTi', 'mscherer']) meta = self.meta.copy() datafile = 'tests/fixtures/shipit/0_issue.yml' statusfile = 'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [ MockFile('lib/ansible/modules/foo/bar.py'), MockFile('lib/ansible/module_utils/baz/bar.py') ] meta.update( get_component_match_facts(iw, {}, FileIndexerMock(), module_indexer, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=['bcoca'], botnames=['ansibot']) self.assertEqual(iw.submitter, 'mscherer') self.assertFalse(facts['owner_pr'])
def test_review_facts_are_defined_module_utils(self): BOTMETA = u""" --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $module_utils: support: community $modules/foo/bar.py: maintainers: ElsA ZaZa $module_utils/baz/bar.py: maintainers: TiTi mscherer """ modules = {u'lib/ansible/modules/foo/bar.py': None} module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 2) # ensure only fake data are loaded self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/modules/foo/bar.py'][u'maintainers']),[u'ElsA', u'ZaZa']) self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/module_utils/baz/bar.py'][u'maintainers']),[u'TiTi', u'mscherer']) datafile = u'tests/fixtures/shipit/2_issue.yml' statusfile = u'tests/fixtures/shipit/2_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile(u'lib/ansible/module_utils/foo/bar.py')] # need to give the wrapper a list of known files to compare against iw.file_indexer = FileIndexerMock() iw.file_indexer.files.append(u'lib/ansible/modules/foo/bar.py') # predefine what the matcher is going to return CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/module_utils/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'Oliver'], u'notify': [u'ElsA', u'Oliver'], u'ignore': [], } ] meta = self.meta.copy() iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) meta.update(get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca'], botnames=[u'ansibot'])) facts = get_review_facts(iw, meta) self.assertTrue(facts[u'community_review']) self.assertFalse(facts[u'core_review']) self.assertFalse(facts[u'committer_review'])
def needs_rebase_or_revision_prevent_shipit(self, meta): datafile = u'tests/fixtures/shipit/1_issue.yml' statusfile = u'tests/fixtures/shipit/1_prstatus.json' with get_issue(datafile, statusfile) as iw: facts = get_shipit_facts(iw, meta, {}, core_team=[u'bcoca', u'mscherer'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertFalse(facts[u'community_usernames']) self.assertFalse(facts[u'shipit_actors']) self.assertEqual(facts[u'shipit_count_ansible'], 0) self.assertEqual(facts[u'shipit_count_maintainer'], 0) self.assertEqual(facts[u'shipit_count_community'], 0) self.assertFalse(facts[u'shipit'])
def test2(self): # command given, time to rebuild but not merge datafile = 'tests/fixtures/rebuild_merge/2_issue.yml' statusfile = 'tests/fixtures/rebuild_merge/2_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { 'is_pullrequest': True, 'is_needs_revision': False, 'is_needs_rebase': False, 'needs_rebuild': False, 'rebuild_run_number': 0 } rbfacts = get_rebuild_merge_facts(iw, meta, ['superman'], None) assert rbfacts['needs_rebuild'] == True assert rbfacts['admin_merge'] == False
def test0(self): # command issued, test ran, time to merge datafile = u'tests/fixtures/rebuild_merge/0_issue.yml' statusfile = u'tests/fixtures/rebuild_merge/0_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { u'is_pullrequest': True, u'is_needs_revision': False, u'is_needs_rebase': False, u'needs_rebuild': False, u'ci_run_number': 0, } rbfacts = get_rebuild_merge_facts(iw, meta, [u'superman']) assert rbfacts[u'needs_rebuild'] == False assert rbfacts[u'admin_merge'] == True
def test1(self): # new test is in progress, do not rebuild and do not merge datafile = u'tests/fixtures/rebuild_merge/1_issue.yml' statusfile = u'tests/fixtures/rebuild_merge/1_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { u'is_pullrequest': True, u'is_needs_revision': False, u'is_needs_rebase': False, u'needs_rebuild': False, u'ci_run_number': 0 } rbfacts = get_rebuild_merge_facts(iw, meta, [u'superman']) assert rbfacts[u'needs_rebuild'] == False assert rbfacts[u'admin_merge'] == False
def needs_rebase_or_revision_prevent_shipit(self, meta): datafile = u'tests/fixtures/shipit/1_issue.yml' statusfile = u'tests/fixtures/shipit/1_prstatus.json' with get_issue(datafile, statusfile) as iw: namespace_maintainers = [u'LinusU'] facts = get_shipit_facts(iw, meta, ModuleIndexerMock(namespace_maintainers), core_team=[u'bcoca', u'mscherer'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertFalse(facts[u'community_usernames']) self.assertFalse(facts[u'shipit_actors']) self.assertEqual(facts[u'shipit_count_ansible'], 0) self.assertEqual(facts[u'shipit_count_maintainer'], 0) self.assertEqual(facts[u'shipit_count_community'], 0) self.assertFalse(facts[u'shipit'])
def test3(self): # command given, new commit created, do not rebuild or merge datafile = u'tests/fixtures/rebuild_merge/3_issue.yml' statusfile = u'tests/fixtures/rebuild_merge/3_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { u'is_pullrequest': True, u'is_needs_revision': False, u'is_needs_rebase': False, u'needs_rebuild': False, u'ci_run_number': 0 } rbfacts = get_rebuild_merge_facts(iw, meta, [u'superman']) assert rbfacts[u'needs_rebuild'] == False assert rbfacts[u'admin_merge'] == False
def test3(self): # command given, new commit created, do not rebuild or merge datafile = u'tests/fixtures/rebuild_merge/3_issue.yml' statusfile = u'tests/fixtures/rebuild_merge/3_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { u'is_pullrequest': True, u'is_needs_revision': False, u'is_needs_rebase': False, u'needs_rebuild': False, u'ci_run_number': 0 } rbfacts = get_rebuild_merge_facts(iw, meta, [u'superman']) assert rbfacts[u'needs_rebuild'] == False assert rbfacts[u'admin_merge'] == False
def test0(self): # command issued, test ran, time to merge datafile = u'tests/fixtures/rebuild_merge/0_issue.yml' statusfile = u'tests/fixtures/rebuild_merge/0_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { u'is_pullrequest': True, u'is_needs_revision': False, u'is_needs_rebase': False, u'needs_rebuild': False, u'ci_run_number': 0, } rbfacts = get_rebuild_merge_facts(iw, meta, [u'superman']) assert rbfacts[u'needs_rebuild'] == False assert rbfacts[u'admin_merge'] == True
def test1(self): # new test is in progress, do not rebuild and do not merge datafile = u'tests/fixtures/rebuild_merge/1_issue.yml' statusfile = u'tests/fixtures/rebuild_merge/1_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { u'is_pullrequest': True, u'is_needs_revision': False, u'is_needs_rebase': False, u'needs_rebuild': False, u'ci_run_number': 0 } rbfacts = get_rebuild_merge_facts(iw, meta, [u'superman']) assert rbfacts[u'needs_rebuild'] == False assert rbfacts[u'admin_merge'] == False
def test3(): """command given, new commit created, do not rebuild or merge""" datafile = 'tests/fixtures/rebuild_merge/3_issue.yml' statusfile = 'tests/fixtures/rebuild_merge/3_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { 'is_pullrequest': True, 'is_needs_revision': False, 'is_needs_rebase': False, 'needs_rebuild': False, 'ci_run_number': 0 } rbfacts = get_rebuild_merge_facts(iw, meta, ['superman'], None) assert not rbfacts['needs_rebuild'] assert not rbfacts['needs_rebuild_all'] assert not rbfacts['admin_merge']
def test_rebuild_command(): """Test ran and failed. /rebuild command issued.""" datafile = 'tests/fixtures/rebuild/0_issue.yml' statusfile = 'tests/fixtures/rebuild/0_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { 'is_pullrequest': True, 'is_needs_revision': False, 'is_needs_rebase': False, 'needs_rebuild': False, 'ci_run_number': 0, } rbfacts = get_rebuild_command_facts(iw, meta, None) assert rbfacts['needs_rebuild'] assert rbfacts['needs_rebuild_all'] assert not rbfacts['needs_rebuild_failed']
def test2(): """command given, time to rebuild but not merge""" datafile = u'tests/fixtures/rebuild_merge/2_issue.yml' statusfile = u'tests/fixtures/rebuild_merge/2_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { u'is_pullrequest': True, u'is_needs_revision': False, u'is_needs_rebase': False, u'needs_rebuild': False, u'ci_run_number': 0 } rbfacts = get_rebuild_merge_facts(iw, meta, [u'superman'], ShippableCI) assert rbfacts[u'needs_rebuild'] assert rbfacts[u'needs_rebuild_all'] assert not rbfacts[u'admin_merge']
def test_rebuild_failed_and_rebuild_commands(): """Test ran and failed. /rebuild_failed and /rebuild commands issued, in that order.""" datafile = u'tests/fixtures/rebuild/3_issue.yml' statusfile = u'tests/fixtures/rebuild/3_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { u'is_pullrequest': True, u'is_needs_revision': False, u'is_needs_rebase': False, u'needs_rebuild': False, u'ci_run_number': 0, } rbfacts = get_rebuild_command_facts(iw, meta, ShippableCI) assert rbfacts[u'needs_rebuild'] assert rbfacts[u'needs_rebuild_all'] assert not rbfacts[u'needs_rebuild_failed']
def test0(): """command issued, test ran, time to merge""" datafile = 'tests/fixtures/rebuild_merge/0_issue.yml' statusfile = 'tests/fixtures/rebuild_merge/0_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { 'is_pullrequest': True, 'is_needs_revision': False, 'is_needs_rebase': False, 'needs_rebuild': False, 'ci_run_number': 0, } rbfacts = get_rebuild_merge_facts(iw, meta, ['superman'], None) assert not rbfacts['needs_rebuild'] assert not rbfacts['needs_rebuild_all'] assert rbfacts['admin_merge']
def test1(): """new test is in progress, do not rebuild and do not merge""" datafile = 'tests/fixtures/rebuild_merge/1_issue.yml' statusfile = 'tests/fixtures/rebuild_merge/1_prstatus.json' with get_issue(datafile, statusfile) as iw: meta = { 'is_pullrequest': True, 'is_needs_revision': False, 'is_needs_rebase': False, 'needs_rebuild': False, 'ci_run_number': 0 } rbfacts = get_rebuild_merge_facts(iw, meta, ['superman'], None) assert not rbfacts['needs_rebuild'] assert not rbfacts['needs_rebuild_all'] assert not rbfacts['admin_merge']
def test_owner_pr_submitter_is_maintainer_new_module(self): """ Submitter is a maintainer: pull request adds a new module: ensure owner_pr is False """ BOTMETA = u""" --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $modules/foo/bar.py: maintainers: ElsA mscherer """ modules = {} # new module module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 1) # ensure only fake data are loaded # Ensure that BOTMETA.yml updates doesn't interfere self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/modules/foo/bar.py'][u'maintainers']), [u'ElsA', u'mscherer']) CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/modules/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'mscherer'], u'notify': [u'ElsA', u'mscherer'], u'ignore': [], } ] meta = self.meta.copy() datafile = u'tests/fixtures/shipit/0_issue.yml' statusfile = u'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile(u'lib/ansible/modules/foo/bar.py')] iw.file_indexer = FileIndexerMock() meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertFalse(facts[u'owner_pr'])
def test_review_facts_are_defined_module_utils(self): botmeta_files = { 'lib/ansible/module_utils': { 'support': 'community' }, 'lib/ansible/modules/foo/bar.py': { 'maintainers': ['ElsA', 'ZaZa'] }, 'lib/ansible/module_utils/baz/bar.py': { 'maintainers': ['TiTi', 'mscherer'] }, } datafile = 'tests/fixtures/shipit/2_issue.yml' statusfile = 'tests/fixtures/shipit/2_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile('lib/ansible/module_utils/foo/bar.py')] # need to give the wrapper a list of known files to compare against iw.gitrepo = GitRepoWrapperMock() iw.gitrepo.files.append('lib/ansible/modules/foo/bar.py') # predefine what the matcher is going to return CM = ComponentMatcherMock() CM.expected_results = [{ 'repo_filename': 'lib/ansible/module_utils/foo/bar.py', 'labels': [], 'support': None, 'maintainers': ['ElsA', 'Oliver'], 'notify': ['ElsA', 'Oliver'], 'ignore': [], }] meta = self.meta.copy() iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) meta.update( get_shipit_facts(iw, meta, botmeta_files, core_team=['bcoca'], botnames=['ansibot'])) facts = get_review_facts(iw, meta) self.assertTrue(facts['community_review']) self.assertFalse(facts['core_review']) self.assertFalse(facts['committer_review'])
def test_owner_pr_submitter_is_maintainer_one_module_file_updated_changelog( self): """ Submitter is a maintainer: ensure owner_pr is set even if changelog fragment is present """ botmeta_files = { 'lib/ansible/modules/foo/bar.py': { 'maintainers': ['ElsA', 'Oliver'] } } datafile = 'tests/fixtures/shipit/2_issue.yml' statusfile = 'tests/fixtures/shipit/2_prstatus.json' with get_issue(datafile, statusfile) as iw: iw._pr_files = [ MockFile('lib/ansible/modules/foo/bar.py'), MockFile('changelogs/fragments/00000-fragment.yaml') ] # need to give the wrapper a list of known files to compare against iw.gitrepo = GitRepoWrapperMock() iw.gitrepo.files.append('lib/ansible/modules/foo/bar.py') # predefine what the matcher is going to return CM = ComponentMatcherMock() CM.expected_results = [{ 'repo_filename': 'lib/ansible/modules/foo/bar.py', 'labels': [], 'support': None, 'maintainers': ['ElsA', 'Oliver'], 'notify': ['ElsA', 'Oliver'], 'ignore': [], }] meta = self.meta.copy() iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, botmeta_files, core_team=['bcoca', 'mscherer'], botnames=['ansibot']) self.assertEqual(iw.submitter, 'ElsA') self.assertTrue(facts['owner_pr'])
def needs_rebase_or_revision_prevent_shipit(self, meta): datafile = 'tests/fixtures/shipit/1_issue.yml' statusfile = 'tests/fixtures/shipit/1_prstatus.json' with get_issue(datafile, statusfile) as iw: namespace_maintainers = ['LinusU'] facts = get_shipit_facts(iw, meta, ModuleIndexerMock(namespace_maintainers), core_team=['bcoca', 'mscherer'], botnames=['ansibot']) self.assertEqual(iw.submitter, 'mscherer') self.assertFalse(facts['community_usernames']) self.assertFalse(facts['shipit_actors']) self.assertEqual(facts['shipit_count_ansible'], 0) self.assertEqual(facts['shipit_count_maintainer'], 0) self.assertEqual(facts['shipit_count_community'], 0) self.assertFalse(facts['shipit'])
def test_submitter_is_maintainer(self): """ Submitter is a namespace maintainer: approval must be automatically added """ datafile = u'tests/fixtures/shipit/0_issue.yml' statusfile = u'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: namespace_maintainers = [u'LinusU', u'mscherer'] _meta = self.meta.copy() _meta[u'component_maintainers'] = [] _meta[u'component_namespace_maintainers'] = namespace_maintainers[:] facts = get_shipit_facts(iw, _meta, ModuleIndexerMock(namespace_maintainers), core_team=[u'bcoca'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertEqual([u'LinusU', u'mscherer'], facts[u'community_usernames']) self.assertEqual([u'mscherer'], facts[u'shipit_actors']) self.assertEqual(facts[u'shipit_count_ansible'], 0) # bcoca self.assertEqual(facts[u'shipit_count_maintainer'], 0) # abulimov self.assertEqual(facts[u'shipit_count_community'], 1) # LinusU, mscherer self.assertFalse(facts[u'shipit'])
def iw(meta, statusfile): datafile = u'tests/fixtures/needs_contributor/0_issue.yml' with get_issue(datafile, statusfile) as iw: iw.get_assignees = lambda: [] iw.repo = RepoMock(meta[u'component_maintainers'] + meta[u'component_notifiers']) return iw
def test_close_1(self): datafile = u'tests/fixtures/needs_info/1_close.yml' with get_issue(datafile, self.statusfile) as iw: facts = needs_info.needs_info_timeout_facts(iw, self.meta) self.assertEquals(facts[u'needs_info_action'], u'close')
def test_waiting_on_contributor_label(self): datafile = u'tests/fixtures/needs_contributor/2_issue.yml' with get_issue(datafile, self.statusfile) as iw: facts = get_needs_contributor_facts(AnsibleTriageMock(), iw, self.meta) self.assertTrue(facts[u'is_needs_contributor'])
def test_not_needs_contributor_command(self): datafile = u'tests/fixtures/needs_contributor/1_issue.yml' with get_issue(datafile, self.statusfile) as iw: facts = get_needs_contributor_facts(AnsibleTriageMock(), iw, self.meta) self.assertFalse(facts[u'is_needs_contributor'])