From f6b9f68d6f696fa047d23e29cbf7511ace90e312 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 1/19] Fix running the tests with the perfplugin but without messing coverage With the way we were importing the perfplugin before running the tests we were messing with the coverage info. By just doing this tweak, we are increasing our coverage from 63% to 86%. Signed-off-by: Pierre-Yves Chibon --- diff --git a/utils/perfplugin.py b/utils/perfplugin.py index 2b270a9..5ddb058 100644 --- a/utils/perfplugin.py +++ b/utils/perfplugin.py @@ -13,7 +13,7 @@ import os from nose.plugins import Plugin -import pagure.perfrepo as perfrepo +import perfrepo log = logging.getLogger('nose.plugins.perfplugin') diff --git a/utils/perfrepo.py b/utils/perfrepo.py new file mode 120000 index 0000000..bb0e407 --- /dev/null +++ b/utils/perfrepo.py @@ -0,0 +1 @@ +pagure/perfrepo.py \ No newline at end of file From 223c886e71761ddebeed1c37b7b0de1e393e53a9 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 2/19] In one test run we can't cover both postgresql and other, so ignore all Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 011a6e3..f718a4c 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -67,9 +67,9 @@ def create_tables(db_url, alembic_ini=None, acls=None, debug=False): :return a session that can be used to query the database. """ - if db_url.startswith('postgres'): + if db_url.startswith('postgres'): # pragma: no cover engine = create_engine(db_url, echo=debug, client_encoding='utf8') - else: + else: # pragma: no cover engine = create_engine(db_url, echo=debug) from pagure.lib.plugins import get_plugin_tables From 393f311dea5c702b8000ea13bedcd923a67594cd Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 3/19] Simpler is better Signed-off-by: Pierre-Yves Chibon --- diff --git a/tests/test_pagure_flask_api.py b/tests/test_pagure_flask_api.py index 0b198cd..56153a0 100644 --- a/tests/test_pagure_flask_api.py +++ b/tests/test_pagure_flask_api.py @@ -111,5 +111,4 @@ class PagureFlaskApitests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskApitests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_api_auth.py b/tests/test_pagure_flask_api_auth.py index 64bed25..d21c20f 100644 --- a/tests/test_pagure_flask_api_auth.py +++ b/tests/test_pagure_flask_api_auth.py @@ -138,6 +138,4 @@ class PagureFlaskApiAuthtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskApiAuthtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_api_fork.py b/tests/test_pagure_flask_api_fork.py index ead44c9..f088c38 100644 --- a/tests/test_pagure_flask_api_fork.py +++ b/tests/test_pagure_flask_api_fork.py @@ -1228,6 +1228,4 @@ class PagureFlaskApiForktests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskApiForktests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_api_group.py b/tests/test_pagure_flask_api_group.py index b0fbd45..f92f73f 100644 --- a/tests/test_pagure_flask_api_group.py +++ b/tests/test_pagure_flask_api_group.py @@ -201,6 +201,4 @@ class PagureFlaskApiGroupTests(tests.Modeltests): self.assertEqual(data['error_code'], 'ENOGROUP') if __name__ == "__main__": - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskApiGroupTests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index bea5fbc..e029bb3 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -2869,6 +2869,4 @@ class PagureFlaskApiIssuetests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskApiIssuetests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_api_project.py b/tests/test_pagure_flask_api_project.py index baa179d..d7b4883 100644 --- a/tests/test_pagure_flask_api_project.py +++ b/tests/test_pagure_flask_api_project.py @@ -1270,6 +1270,4 @@ class PagureFlaskApiProjecttests(tests.Modeltests): ) if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskApiProjecttests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 16e02ab..e952475 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -2902,5 +2902,4 @@ class PagurePrivateRepotest(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagurePrivateRepotest) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_api_user.py b/tests/test_pagure_flask_api_user.py index f668e4f..36b2e3b 100644 --- a/tests/test_pagure_flask_api_user.py +++ b/tests/test_pagure_flask_api_user.py @@ -460,6 +460,4 @@ class PagureFlaskApiUSertests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskApiUSertests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_docs.py b/tests/test_pagure_flask_docs.py index 52cdbd4..37bd6c3 100644 --- a/tests/test_pagure_flask_docs.py +++ b/tests/test_pagure_flask_docs.py @@ -261,5 +261,4 @@ class PagureFlaskDocstests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskDocstests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_dump_load_ticket.py b/tests/test_pagure_flask_dump_load_ticket.py index ac84724..48ff558 100644 --- a/tests/test_pagure_flask_dump_load_ticket.py +++ b/tests/test_pagure_flask_dump_load_ticket.py @@ -223,6 +223,4 @@ class PagureFlaskDumpLoadTicketTests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskDumpLoadTicketTests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_form.py b/tests/test_pagure_flask_form.py index 06c4928..fa23756 100644 --- a/tests/test_pagure_flask_form.py +++ b/tests/test_pagure_flask_form.py @@ -143,9 +143,6 @@ class PagureFlaskFormTests(tests.Modeltests): self.assertTrue(form.validate_on_submit()) - if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskFormTests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_internal.py b/tests/test_pagure_flask_internal.py index 8848cfd..b83cf2e 100644 --- a/tests/test_pagure_flask_internal.py +++ b/tests/test_pagure_flask_internal.py @@ -1150,6 +1150,4 @@ class PagureFlaskInternaltests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskInternaltests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index ca77241..c1dff6e 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -2239,5 +2239,4 @@ index 0000000..2a552bb shutil.rmtree(newpath) if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskForktests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_groups.py b/tests/test_pagure_flask_ui_groups.py index d9c1901..2d9fb76 100644 --- a/tests/test_pagure_flask_ui_groups.py +++ b/tests/test_pagure_flask_ui_groups.py @@ -504,6 +504,4 @@ class PagureFlaskGroupstests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskGroupstests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index 3859364..5131e1f 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -2629,5 +2629,4 @@ class PagureFlaskIssuestests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskIssuestests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_issues_acl_checks.py b/tests/test_pagure_flask_ui_issues_acl_checks.py index 92ecf45..7732164 100644 --- a/tests/test_pagure_flask_ui_issues_acl_checks.py +++ b/tests/test_pagure_flask_ui_issues_acl_checks.py @@ -1097,6 +1097,4 @@ class PagureFlaskIssuesACLtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskIssuesACLtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_login.py b/tests/test_pagure_flask_ui_login.py index c59d50c..037745e 100644 --- a/tests/test_pagure_flask_ui_login.py +++ b/tests/test_pagure_flask_ui_login.py @@ -606,5 +606,4 @@ class PagureFlaskLogintests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskLogintests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_no_master_branch.py b/tests/test_pagure_flask_ui_no_master_branch.py index a0c8d2c..5a7a66b 100644 --- a/tests/test_pagure_flask_ui_no_master_branch.py +++ b/tests/test_pagure_flask_ui_no_master_branch.py @@ -340,6 +340,4 @@ class PagureFlaskNoMasterBranchtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskNoMasterBranchtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_old_commit.py b/tests/test_pagure_flask_ui_old_commit.py index a1c0968..d8bce31 100644 --- a/tests/test_pagure_flask_ui_old_commit.py +++ b/tests/test_pagure_flask_ui_old_commit.py @@ -216,5 +216,4 @@ class PagureFlaskRepoOldUrltests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskRepoOldUrltests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins.py b/tests/test_pagure_flask_ui_plugins.py index d41c253..d572f1c 100644 --- a/tests/test_pagure_flask_ui_plugins.py +++ b/tests/test_pagure_flask_ui_plugins.py @@ -156,5 +156,4 @@ class PagureFlaskPluginstests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskPluginstests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_default_hook.py b/tests/test_pagure_flask_ui_plugins_default_hook.py index 017c472..4fae359 100644 --- a/tests/test_pagure_flask_ui_plugins_default_hook.py +++ b/tests/test_pagure_flask_ui_plugins_default_hook.py @@ -95,6 +95,4 @@ class PagureFlaskPluginDefaultHooktests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginDefaultHooktests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_fedmsg.py b/tests/test_pagure_flask_ui_plugins_fedmsg.py index e7e134f..db7a8f6 100644 --- a/tests/test_pagure_flask_ui_plugins_fedmsg.py +++ b/tests/test_pagure_flask_ui_plugins_fedmsg.py @@ -163,6 +163,4 @@ class PagureFlaskPluginFedmsgtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginFedmsgtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_irc.py b/tests/test_pagure_flask_ui_plugins_irc.py index b612407..862bc3e 100644 --- a/tests/test_pagure_flask_ui_plugins_irc.py +++ b/tests/test_pagure_flask_ui_plugins_irc.py @@ -167,6 +167,4 @@ class PagureFlaskPluginIRCtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginIRCtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_mail.py b/tests/test_pagure_flask_ui_plugins_mail.py index 2f771cd..0f29008 100644 --- a/tests/test_pagure_flask_ui_plugins_mail.py +++ b/tests/test_pagure_flask_ui_plugins_mail.py @@ -198,6 +198,4 @@ class PagureFlaskPluginMailtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginMailtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_noff.py b/tests/test_pagure_flask_ui_plugins_noff.py index 9be9d03..bdbb40c 100644 --- a/tests/test_pagure_flask_ui_plugins_noff.py +++ b/tests/test_pagure_flask_ui_plugins_noff.py @@ -225,6 +225,4 @@ class PagureFlaskPluginNoFFtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginNoFFtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_pagure_ci.py b/tests/test_pagure_flask_ui_plugins_pagure_ci.py index e063420..f35a60e 100644 --- a/tests/test_pagure_flask_ui_plugins_pagure_ci.py +++ b/tests/test_pagure_flask_ui_plugins_pagure_ci.py @@ -249,6 +249,4 @@ class PagureFlaskPluginPagureCItests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginPagureCItests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_pagure_hook.py b/tests/test_pagure_flask_ui_plugins_pagure_hook.py index b768920..e702dab 100644 --- a/tests/test_pagure_flask_ui_plugins_pagure_hook.py +++ b/tests/test_pagure_flask_ui_plugins_pagure_hook.py @@ -169,6 +169,4 @@ class PagureFlaskPluginPagureHooktests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginPagureHooktests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_pagure_request_hook.py b/tests/test_pagure_flask_ui_plugins_pagure_request_hook.py index d425a74..980dc87 100644 --- a/tests/test_pagure_flask_ui_plugins_pagure_request_hook.py +++ b/tests/test_pagure_flask_ui_plugins_pagure_request_hook.py @@ -182,6 +182,4 @@ class PagureFlaskPluginPagureRequestHooktests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginPagureRequestHooktests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_pagure_ticket_hook.py b/tests/test_pagure_flask_ui_plugins_pagure_ticket_hook.py index ef46821..cb2a1b0 100644 --- a/tests/test_pagure_flask_ui_plugins_pagure_ticket_hook.py +++ b/tests/test_pagure_flask_ui_plugins_pagure_ticket_hook.py @@ -182,6 +182,4 @@ class PagureFlaskPluginPagureTicketHooktests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginPagureTicketHooktests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_rtd_hook.py b/tests/test_pagure_flask_ui_plugins_rtd_hook.py index 344a84e..8408d21 100644 --- a/tests/test_pagure_flask_ui_plugins_rtd_hook.py +++ b/tests/test_pagure_flask_ui_plugins_rtd_hook.py @@ -184,6 +184,4 @@ class PagureFlaskPluginRtdHooktests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginRtdHooktests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_plugins_unsigned.py b/tests/test_pagure_flask_ui_plugins_unsigned.py index 6ff0197..cca5bd3 100644 --- a/tests/test_pagure_flask_ui_plugins_unsigned.py +++ b/tests/test_pagure_flask_ui_plugins_unsigned.py @@ -171,6 +171,4 @@ class PagureFlaskPluginUnsignedtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPluginUnsignedtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_priorities.py b/tests/test_pagure_flask_ui_priorities.py index b52c056..356b744 100644 --- a/tests/test_pagure_flask_ui_priorities.py +++ b/tests/test_pagure_flask_ui_priorities.py @@ -454,6 +454,4 @@ class PagureFlaskPrioritiestests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskPrioritiestests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_quick_reply.py b/tests/test_pagure_flask_ui_quick_reply.py index 8dec2be..6e9a377 100644 --- a/tests/test_pagure_flask_ui_quick_reply.py +++ b/tests/test_pagure_flask_ui_quick_reply.py @@ -251,6 +251,4 @@ class PagureFlaskQuickReplytest(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskQuickReplytest) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_repo_slash_name.py b/tests/test_pagure_flask_ui_repo_slash_name.py index 0d88587..a79aa59 100644 --- a/tests/test_pagure_flask_ui_repo_slash_name.py +++ b/tests/test_pagure_flask_ui_repo_slash_name.py @@ -263,6 +263,4 @@ class PagureFlaskSlashInNametests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskSlashInNametests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_roadmap.py b/tests/test_pagure_flask_ui_roadmap.py index 60dcc99..da89414 100644 --- a/tests/test_pagure_flask_ui_roadmap.py +++ b/tests/test_pagure_flask_ui_roadmap.py @@ -541,6 +541,4 @@ class PagureFlaskRoadmaptests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskRoadmaptests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_flask_ui_slash_branch_name.py b/tests/test_pagure_flask_ui_slash_branch_name.py index 4106461..9be7dfb 100644 --- a/tests/test_pagure_flask_ui_slash_branch_name.py +++ b/tests/test_pagure_flask_ui_slash_branch_name.py @@ -377,6 +377,4 @@ class PagureFlaskSlashInBranchtests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureFlaskSlashInBranchtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 3d93f52..fabd817 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -4434,5 +4434,4 @@ foo bar if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_git_get_tags_objects.py b/tests/test_pagure_lib_git_get_tags_objects.py index 27932db..429121f 100644 --- a/tests/test_pagure_lib_git_get_tags_objects.py +++ b/tests/test_pagure_lib_git_get_tags_objects.py @@ -104,6 +104,4 @@ class PagureLibGitGetTagstests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase( - PagureLibGitGetTagstests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_link.py b/tests/test_pagure_lib_link.py index 119775d..3cb0d37 100644 --- a/tests/test_pagure_lib_link.py +++ b/tests/test_pagure_lib_link.py @@ -285,5 +285,4 @@ class PagureLibLinktests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibLinktests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_login.py b/tests/test_pagure_lib_login.py index 935b0e5..3517415 100644 --- a/tests/test_pagure_lib_login.py +++ b/tests/test_pagure_lib_login.py @@ -103,5 +103,4 @@ class PagureLibLogintests(tests.Modeltests): ) if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibLogintests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_model.py b/tests/test_pagure_lib_model.py index f3223e9..dbe228e 100644 --- a/tests/test_pagure_lib_model.py +++ b/tests/test_pagure_lib_model.py @@ -247,5 +247,4 @@ class PagureLibModeltests(tests.Modeltests): if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibModeltests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_notify.py b/tests/test_pagure_lib_notify.py index 9463f84..ab3f7cb 100644 --- a/tests/test_pagure_lib_notify.py +++ b/tests/test_pagure_lib_notify.py @@ -377,5 +377,4 @@ RW1haWwgY29udGVudA== if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibNotifytests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_notify_email.py b/tests/test_pagure_lib_notify_email.py index ef40744..fb5bcf1 100644 --- a/tests/test_pagure_lib_notify_email.py +++ b/tests/test_pagure_lib_notify_email.py @@ -204,5 +204,4 @@ https://pagure.org/fork/foo/test/issue/1 # Add more tests to verify that correct mails are sent to correct people here if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibNotifyEmailtests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_watch_list.py b/tests/test_pagure_lib_watch_list.py index 0cf88df..12366c6 100644 --- a/tests/test_pagure_lib_watch_list.py +++ b/tests/test_pagure_lib_watch_list.py @@ -521,4 +521,4 @@ class PagureLibGetWatchListtests(tests.Modeltests): if __name__ == '__main__': - unittest.main() + unittest.main(verbosity=2) diff --git a/tests/test_pfmarkdown.py b/tests/test_pfmarkdown.py index de9329d..90d56da 100644 --- a/tests/test_pfmarkdown.py +++ b/tests/test_pfmarkdown.py @@ -52,4 +52,4 @@ class TestObjAnchorTag(unittest.TestCase): if __name__ == '__main__': - unittest.main() + unittest.main(verbosity=2) diff --git a/tests/test_stream_server.py b/tests/test_stream_server.py index 0db4ccb..3541cc1 100644 --- a/tests/test_stream_server.py +++ b/tests/test_stream_server.py @@ -232,6 +232,6 @@ class StreamingServerTests(tests.Modeltests): # NOTE: we cannot test the 'Invalid object provided' exception # as it's a backup (current code will never hit it) + if __name__ == '__main__': - SUITE = unittest.TestLoader().loadTestsFromTestCase(StreamingServerTests) - unittest.TextTestRunner(verbosity=2).run(SUITE) + unittest.main(verbosity=2) diff --git a/tests/test_style.py b/tests/test_style.py index 3d8cd87..6b81337 100644 --- a/tests/test_style.py +++ b/tests/test_style.py @@ -1,3 +1,16 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" + (c) 2017 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +Tests for flake8 compliance of the code + +""" + import os import subprocess import sys From 4fa20c85357963f515a7b10b2244494a56246ca9 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 4/19] Add ordering to some of the relations so it returns stable output Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/model.py b/pagure/lib/model.py index f718a4c..2c13357 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -418,6 +418,7 @@ class Project(BASE): order_by="func.lower(projects.c.namespace).desc(), \ func.lower(projects.c.name)" ), + order_by="PagureGroup.group_name.asc()", viewonly=True ) @@ -428,6 +429,7 @@ class Project(BASE): secondaryjoin="and_(pagure_group.c.id==projects_groups.c.group_id,\ projects_groups.c.access=='admin')", backref="projects_admin_groups", + order_by="PagureGroup.group_name.asc()", viewonly=True ) @@ -439,6 +441,7 @@ class Project(BASE): or_(projects_groups.c.access=='admin',\ projects_groups.c.access=='commit'))", backref="projects_committer_groups", + order_by="PagureGroup.group_name.asc()", viewonly=True ) From 3196879521ff4e3c34a28c112a2d0022bc55776a Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 5/19] Ignore some lines we can't really test Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 5f52795..a35165c 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -18,7 +18,7 @@ try: import simplejson as json -except ImportError: +except ImportError: # pragma: no cover import json import datetime @@ -100,11 +100,11 @@ def create_session(db_url, debug=False, pool_recycle=3600): :return a Session that can be used to query the database. ''' - if db_url.startswith('postgres'): + if db_url.startswith('postgres'): # pragma: no cover engine = sqlalchemy.create_engine( db_url, echo=debug, pool_recycle=pool_recycle, client_encoding='utf8') - else: + else: # pragma: no cover engine = sqlalchemy.create_engine( db_url, echo=debug, pool_recycle=pool_recycle) scopedsession = scoped_session(sessionmaker(bind=engine)) @@ -3455,10 +3455,10 @@ def clean_input(text, ignore=None): for idx, val in enumerate(bleach_v): try: val = int(val) - except ValueError: + except ValueError: # pragma: no cover pass bleach_v[idx] = val - if tuple(bleach_v) >= (1, 5, 0): + if tuple(bleach_v) >= (1, 5, 0): # pragma: no cover protocols = bleach.ALLOWED_PROTOCOLS + ['irc', 'ircs'] kwargs['protocols'] = protocols From 192593850f307ff9ba7aecc54e0aae2ab8c53155 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 6/19] If the user has no public ssh key and we're trying to install one: bail Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index a35165c..c1ae89d 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -280,6 +280,9 @@ def create_user_ssh_keys_on_disk(user, gitolite_keydir): 'keys_%i' % i, '%s.pub' % user.user) + if not user.public_ssh_key: + return + # Now let's create new keyfiles for the user keys = user.public_ssh_key.split('\n') for i in range(len(keys)): From 472522fbd6f1e3934f707da7d984ff3980cc1138 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 7/19] Fix creating the group when adding it to a project Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index c1ae89d..81600d5 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -999,6 +999,7 @@ def add_group_to_project( if create: group_obj = pagure.lib.model.PagureGroup( group_name=new_group, + display_name=new_group, group_type='user', user_id=user_obj.id, ) From c03660a0a8b4652c68b31887114fa370bf7fb834 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 8/19] Simplify checking if the priority is in the list of allowed priorities when creating issue Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 81600d5..f9dc342 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1445,12 +1445,12 @@ def new_issue(session, repo, title, content, user, ticketfolder, issue_id=None, user_obj = get_user(session, user) # Only store the priority if there is one in the project - priorities = repo.priorities + priorities = repo.priorities or [] try: priority = int(priority) except (ValueError, TypeError): priority = None - if priorities and priority and str(priority) not in priorities: + if priority is not None and str(priority) not in priorities: raise pagure.exceptions.PagureException( 'You are trying to create an issue with a priority that does ' 'not exist in the project.') From 178255803a41bc984ce86ba848013aaed9ad347c Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 9/19] Only announce user's settings change if there was an error Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index f9dc342..7218373 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1795,8 +1795,9 @@ def update_user_settings(session, settings, user): update.append(key) new_settings[key] = settings[key] else: - update.append(key) - new_settings[key] = False + if new_settings[key] != False: + update.append(key) + new_settings[key] = False if not update: return 'No settings to change' @@ -2012,6 +2013,7 @@ def search_projects( projects = projects.filter( model.Project.is_fork == False # noqa: E712 ) + if tags: if not isinstance(tags, (list, tuple)): tags = [tags] From 23ff2ef78ee151001e7aa0a6478bdc503c10451b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 10/19] Fix filtering issues with tags This fixes filtering issues having some of the tags while excluding issues having the some other tags Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 7218373..0d2b291 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2250,7 +2250,11 @@ def search_issues( elif not ytags and notags: query = query.filter(~model.Issue.uid.in_(sub_q3)) elif ytags and notags: - final_set = set(sub_q2.all()) - set(sub_q3.all()) + final_set = set( + [i[0] for i in sub_q2.all()] + ) - set( + [i[0] for i in sub_q3.all()] + ) if final_set: query = query.filter(model.Issue.uid.in_(list(final_set))) From 65aa5f5012b4a015bfbdc4453034a02813950d4f Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 11/19] Fix searching issues with an offset of 0 Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 0d2b291..f081a67 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2390,7 +2390,7 @@ def search_issues( elif count: output = query.count() else: - if offset: + if offset is not None: query = query.offset(offset) if limit: query = query.limit(limit) From f960e3544a7071152605de005726fbcd28162c00 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 12/19] Move the markdown processor convert call to its own function for easier testing Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index f081a67..9ac83f8 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3366,6 +3366,15 @@ def add_token_to_user(session, project, acls, username, description=None): return 'Token created' +def _convert_markdown(md_processor, text): + """ Small function converting the text to html using the given markdown + processor. + + This was done in order to + """ + return md_processor.convert(text) + + def text2markdown(text, extended=True, readme=False): """ Simple text to html converter using the markdown library. """ @@ -3407,7 +3416,7 @@ def text2markdown(text, extended=True, readme=False): if text: try: - text = md_processor.convert(text) + text = _convert_markdown(md_processor, text) except Exception: _log.debug( 'A markdown error occured while processing: ``%s``', From f70e3e8e96bf23dd2b3980967885f3edb09f9979 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 13/19] Catch all unicode related exceptions in could_be_text() Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 9ac83f8..92bd1a7 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3490,7 +3490,7 @@ def could_be_text(text): try: text.decode('utf-8') return True - except UnicodeDecodeError: + except (UnicodeDecodeError, UnicodeEncodeError): return False From bb0666aaf7407017ecdca38e2383b90b0d7c3e5c Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 14/19] Drop un-needed check for user_obj This check is already performed in get_user() just above Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 92bd1a7..702fd57 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3580,10 +3580,6 @@ def update_watch_status(session, project, user, watch): user_obj = get_user(session, user) - if not user_obj: - raise pagure.exceptions.PagureException( - 'No user with username: %s' % user) - watcher = session.query( model.Watcher ).filter( From ca6685ca5e718449569b4d11c3c60b157b5dd9d3 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 15/19] Adjust the behavior of search_token when not ACLs are specified Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 702fd57..6f7ae2f 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -4249,14 +4249,15 @@ def search_token( model.TokenAcl.acl_id == model.ACL.id ) - if isinstance(acls, list): - query = query.filter( - model.ACL.name.in_(acls) - ) - else: - query = query.filter( - model.ACL.name == acls - ) + if acls: + if isinstance(acls, list): + query = query.filter( + model.ACL.name.in_(acls) + ) + else: + query = query.filter( + model.ACL.name == acls + ) if user: query = query.filter( From a3901ba4f0526270ba35c9f067fc1da47fe5d033 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 16/19] Bring the pagure.lib coverage to 100% Signed-off-by: Pierre-Yves Chibon --- diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index fabd817..0c9af85 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -11,6 +11,7 @@ __requires__ = ['SQLAlchemy >= 0.8'] import pkg_resources +import datetime import unittest import shutil import sys @@ -144,6 +145,10 @@ class PagureLibtests(tests.Modeltests): tests.create_projects(self.session) repo = pagure.lib._get_project(self.session, 'test') + # Set some priorities to the project + repo.priorities = {'1': 'High', '2': 'Normal'} + self.session.add(repo) + self.session.commit() # Before issues = pagure.lib.search_issues(self.session, repo) @@ -163,6 +168,19 @@ class PagureLibtests(tests.Modeltests): ticketfolder=None ) + # Fails since we're trying to give a non-existant priority + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.new_issue, + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None, + priority=0, + ) + # Add an extra user to project `foo` repo = pagure.lib._get_project(self.session, 'test') msg = pagure.lib.add_user_to_project( @@ -275,11 +293,31 @@ class PagureLibtests(tests.Modeltests): ] ) + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + title='Foo issue #2', + content='Fixed!', + status='Closed', + close_status='Fixed', + private=False, + ) + self.session.commit() + self.assertEqual( + msg, + [ + 'Issue close_status updated to: Fixed (was: Invalid)', + 'Issue private status set to: False (was: True)' + ] + ) + repo = pagure.lib._get_project(self.session, 'test') self.assertEqual(repo.open_tickets, 1) self.assertEqual(repo.open_tickets_public, 1) self.assertEqual(repo.issues[1].status, 'Closed') - self.assertEqual(repo.issues[1].close_status, 'Invalid') + self.assertEqual(repo.issues[1].close_status, 'Fixed') # Edit the status: re-open the ticket msg = pagure.lib.edit_issue( @@ -292,7 +330,12 @@ class PagureLibtests(tests.Modeltests): ) self.session.commit() self.assertEqual( - msg, ['Issue status updated to: Open (was: Closed)']) + msg, + [ + 'Issue status updated to: Open (was: Closed)', + 'Issue private status set to: True' + ] + ) repo = pagure.lib._get_project(self.session, 'test') for issue in repo.issues: @@ -502,12 +545,11 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(repo.open_tickets, 2) self.assertEqual(repo.open_tickets_public, 2) - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_add_issue_dependency(self, p_send_email, p_ugt): + @patch('pagure.lib.REDIS', MagicMock(return_value=True)) + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_issue_dependency(self): """ Test the add_issue_dependency of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True self.test_new_issue() repo = pagure.lib._get_project(self.session, 'test') @@ -554,12 +596,84 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(issue_blocked.depending_text, [1]) self.assertEqual(issue_blocked.blocking_text, []) - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_add_tag_obj(self, p_send_email, p_ugt): + @patch('pagure.lib.REDIS') + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_edit_comment(self, mock_redis): + """ Test the edit_issue of pagure.lib. """ + mock_redis.return_value = True + + self.test_add_issue_comment() + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 2) + + self.assertEqual(mock_redis.publish.call_count, 0) + + # Before + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 1) + self.assertEqual(issue.comments[0].comment, 'Hey look a comment!') + + # Edit one of the + msg = pagure.lib.edit_comment( + session=self.session, + parent=issue, + comment=issue.comments[0], + user='pingou', + updated_comment='Edited comment', + folder=None) + self.session.commit() + self.assertEqual(msg, 'Comment updated') + self.assertEqual(mock_redis.publish.call_count, 2) + + # After + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 1) + self.assertEqual(issue.comments[0].comment, 'Edited comment') + + @patch('pagure.lib.REDIS') + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_edit_comment_private(self, mock_redis): + """ Test the edit_issue of pagure.lib. """ + + self.test_add_issue_comment_private() + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(repo.open_tickets, 1) + self.assertEqual(repo.open_tickets_public, 0) + + self.assertEqual(mock_redis.publish.call_count, 0) + + # Before + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 1) + self.assertEqual(issue.comments[0].comment, 'Hey look a comment!') + + # Edit one of the + msg = pagure.lib.edit_comment( + session=self.session, + parent=issue, + comment=issue.comments[0], + user='pingou', + updated_comment='Edited comment', + folder=None) + self.session.commit() + self.assertEqual(msg, 'Comment updated') + self.assertEqual(mock_redis.publish.call_count, 1) + + # After + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 1) + self.assertEqual(issue.comments[0].comment, 'Edited comment') + + @patch('pagure.lib.REDIS', MagicMock(return_value=True)) + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_tag_obj(self): """ Test the add_tag_obj of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True self.test_edit_issue() repo = pagure.lib._get_project(self.session, 'test') @@ -620,12 +734,11 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msgs, ['Issue **un**tagged with: tag1']) - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_remove_tags_obj(self, p_send_email, p_ugt): + @patch('pagure.lib.REDIS', MagicMock(return_value=True)) + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_remove_tags_obj(self): """ Test the remove_tags_obj of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True self.test_add_tag_obj() repo = pagure.lib._get_project(self.session, 'test') @@ -729,6 +842,20 @@ class PagureLibtests(tests.Modeltests): ['Edited tag: tag1()[DeepSkyBlue] to tag2(lorem ipsum)[black]'] ) + # Try editing the tag without changing anything + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.edit_issue_tags, + session=self.session, + project=repo, + old_tag='tag2', + new_tag='tag2', + new_tag_description='lorem ipsum', + new_tag_color='black', + user='pingou', + ticketfolder=None, + ) + # Add a new tag msg = pagure.lib.add_tag_obj( session=self.session, @@ -841,12 +968,11 @@ class PagureLibtests(tests.Modeltests): issues = pagure.lib.search_issues(self.session, repo, private='foo') self.assertEqual(len(issues), 2) - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_add_issue_assignee(self, p_send_email, p_ugt): + @patch('pagure.lib.REDIS', MagicMock(return_value=True)) + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_issue_assignee(self): """ Test the add_issue_assignee of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True self.test_new_issue() repo = pagure.lib._get_project(self.session, 'test') @@ -945,12 +1071,11 @@ class PagureLibtests(tests.Modeltests): self.session, repo, assignee=True) self.assertEqual(len(issues), 0) - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_add_issue_comment(self, p_send_email, p_ugt): + @patch('pagure.lib.REDIS', MagicMock(return_value=True)) + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_issue_comment(self): """ Test the add_issue_comment of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True self.test_new_issue() repo = pagure.lib._get_project(self.session, 'test') @@ -986,6 +1111,50 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(issue.comments[0].comment, 'Hey look a comment!') self.assertEqual(issue.comments[0].user.user, 'foo') + @patch('pagure.lib.REDIS', MagicMock(return_value=True)) + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_issue_comment_private(self): + """ Test the add_issue_comment of pagure.lib. """ + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + + msg = pagure.lib.new_issue( + session=self.session, + repo=project, + title='Test issue #1', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None, + private=True, + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #1') + self.assertEqual(project.open_tickets, 1) + self.assertEqual(project.open_tickets_public, 0) + + # Before + issue = pagure.lib.search_issues(self.session, project, issueid=1) + self.assertEqual(len(issue.comments), 0) + + # Add a comment to that issue + msg = pagure.lib.add_issue_comment( + session=self.session, + issue=issue, + comment='Hey look a comment!', + user='foo', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg, 'Comment added') + + # After + issue = pagure.lib.search_issues(self.session, project, issueid=1) + self.assertEqual(len(issue.comments), 1) + self.assertEqual(issue.comments[0].comment, 'Hey look a comment!') + self.assertEqual(issue.comments[0].user.user, 'foo') + @patch('pagure.lib.notify.send_email') def test_add_user_to_project(self, p_send_email): """ Test the add_user_to_project of pagure.lib. """ @@ -1125,6 +1294,7 @@ class PagureLibtests(tests.Modeltests): parent_id=None, ) + # Now test that creation fails if ignore_existing_repo is False repo = pagure.get_authorized_project(self.session, 'testproject') self.assertEqual(repo.path, 'testproject.git') @@ -1161,7 +1331,7 @@ class PagureLibtests(tests.Modeltests): self.assertTrue(os.path.exists(ticketrepo)) self.assertTrue(os.path.exists(requestrepo)) - # Try re-creating it ignoring the existing repos - but repo in the DB + # Try re-creating it ignoring the existing repos- but repo in the DB self.assertRaises( pagure.exceptions.PagureException, pagure.lib.new_project, @@ -1201,6 +1371,11 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'Project "testproject" created') + # Delete the repo from the DB so we can try again + repo = pagure.lib._get_project(self.session, 'testproject') + self.session.delete(repo) + self.session.commit() + self.assertTrue(os.path.exists(gitrepo)) self.assertTrue(os.path.exists(docrepo)) self.assertTrue(os.path.exists(ticketrepo)) @@ -1400,6 +1575,27 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'No settings to change') mock_log.assert_not_called() + # Invalid `Minimum_score_to_merge_pull-request` + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.update_project_settings, + session=self.session, + repo=repo, + settings={ + 'issue_tracker': False, + 'project_documentation': True, + 'pull_requests': False, + 'Only_assignee_can_merge_pull-request': None, + 'Minimum_score_to_merge_pull-request': 'foo', + 'Web-hooks': 'https://pagure.io/foobar', + 'Enforce_signed-off_commits_in_pull-request': False, + 'issues_default_to_private': False, + 'fedmsg_notifications': True, + 'pull_request_access_only': False, + }, + user='pingou', + ) + msg = pagure.lib.update_project_settings( session=self.session, repo=repo, @@ -1527,66 +1723,249 @@ class PagureLibtests(tests.Modeltests): projects = pagure.lib.search_projects(self.session, fork=False) self.assertEqual(len(projects), 3) - def test_get_tags_of_project(self): - """ Test the get_tags_of_project of pagure.lib. """ + def test_search_projects_private(self): + """ Test the search_projects of pagure.lib. """ + tests.create_projects(self.session) + item = pagure.lib.model.Project( + user_id=1, # pingou + name='private_test', + description='Private test project #1', + hook_token='aaabbbcccpp', + ) + self.session.add(item) + self.session.commit() - self.test_add_tag_obj() - repo = pagure.lib._get_project(self.session, 'test') + projects = pagure.lib.search_projects(self.session) + self.assertEqual(len(projects), 4) + self.assertEqual( + [p.path for p in projects], + ['private_test.git', 'test.git', 'test2.git', + 'somenamespace/test3.git'] + ) - tags = pagure.lib.get_tags_of_project(self.session, repo) - self.assertEqual([tag.tag for tag in tags], ['tag1']) + projects = pagure.lib.search_projects( + self.session, username='pingou') + self.assertEqual(len(projects), 4) + self.assertEqual( + [p.path for p in projects], + ['private_test.git', 'test.git', 'test2.git', + 'somenamespace/test3.git'] + ) - tags = pagure.lib.get_tags_of_project( - self.session, repo, pattern='T*') - self.assertEqual([tag.tag for tag in tags], ['tag1']) + projects = pagure.lib.search_projects( + self.session, username='pingou', private='pingou') + self.assertEqual(len(projects), 4) + self.assertEqual( + [p.path for p in projects], + ['private_test.git', 'test.git', 'test2.git', + 'somenamespace/test3.git'] + ) - repo = pagure.lib._get_project(self.session, 'test2') + projects = pagure.lib.search_projects( + self.session, username='pingou', private='foo') + self.assertEqual(len(projects), 0) - tags = pagure.lib.get_tags_of_project(self.session, repo) - self.assertEqual([tag.tag for tag in tags], []) + def test_search_projects_tags(self): + """ Test the search_projects of pagure.lib. """ + tests.create_projects(self.session) - def test_get_issue_statuses(self): - """ Test the get_issue_statuses of pagure.lib. """ - statuses = pagure.lib.get_issue_statuses(self.session) - self.assertEqual(sorted(statuses), ['Closed', 'Open']) + # Add tags to the project + project = pagure.lib._get_project(self.session, 'test') + tp = pagure.lib.model.TagProject( + project_id=project.id, + tag='fedora' + ) + self.session.add(tp) + self.session.commit() - def test_set_up_user(self): - """ Test the set_up_user of pagure.lib. """ + projects = pagure.lib.search_projects( + self.session, tags='fedora') + self.assertEqual(len(projects), 1) + self.assertEqual(projects[0].path, 'test.git') - items = pagure.lib.search_user(self.session) - self.assertEqual(2, len(items)) - self.assertEqual(2, items[0].id) - self.assertEqual('foo', items[0].user) - self.assertEqual(1, items[1].id) - self.assertEqual('pingou', items[1].user) + def test_search_projects_pattern(self): + """ Test the search_projects of pagure.lib. """ + tests.create_projects(self.session) + projects = pagure.lib.search_projects( + self.session, pattern='test*') + self.assertEqual(len(projects), 3) + self.assertEqual( + [p.path for p in projects], + ['test.git', 'test2.git', 'somenamespace/test3.git'] + ) - pagure.lib.set_up_user( - session=self.session, - username='skvidal', - fullname='Seth', - default_email='skvidal@fp.o', - keydir=pagure.APP.config.get('GITOLITE_KEYDIR', None), + def test_search_projects_sort(self): + """ Test the search_projects of pagure.lib. """ + tests.create_projects(self.session) + projects = pagure.lib.search_projects( + self.session, pattern='*', sort='latest') + self.assertEqual(len(projects), 3) + self.assertEqual( + [p.path for p in projects], + ['somenamespace/test3.git', 'test2.git', 'test.git'] ) - self.session.commit() - items = pagure.lib.search_user(self.session) - self.assertEqual(3, len(items)) - self.assertEqual(2, items[0].id) - self.assertEqual('foo', items[0].user) - self.assertEqual(1, items[1].id) - self.assertEqual('pingou', items[1].user) - self.assertEqual(3, items[2].id) - self.assertEqual('skvidal', items[2].user) - self.assertEqual('Seth', items[2].fullname) + projects = pagure.lib.search_projects( + self.session, pattern='*', sort='oldest') + self.assertEqual(len(projects), 3) self.assertEqual( - ['skvidal@fp.o'], [email.email for email in items[2].emails]) + [p.path for p in projects], + ['test.git', 'test2.git', 'somenamespace/test3.git'] + ) - # Add the user a second time - pagure.lib.set_up_user( - session=self.session, - username='skvidal', - fullname='Seth V', - default_email='skvidal@fp.o', + def test_search_issues_milestones_invalid(self): + """ Test the search_issues of pagure.lib. """ + + self.test_edit_issue() + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.issues), 2) + + issues = pagure.lib.search_issues( + self.session, repo, milestones='foo') + self.assertEqual(len(issues), 0) + + issues = pagure.lib.search_issues( + self.session, repo, milestones='foo', no_milestones=True) + self.assertEqual(len(issues), 2) + + def test_search_issues_custom_search(self): + """ Test the search_issues of pagure.lib. """ + + self.test_edit_issue() + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.issues), 2) + + issues = pagure.lib.search_issues( + self.session, repo, custom_search={'foo': '*'}) + self.assertEqual(len(issues), 0) + + def test_search_issues_offset(self): + """ Test the search_issues of pagure.lib. """ + + self.test_edit_issue() + repo = pagure.lib._get_project(self.session, 'test') + + issues = pagure.lib.search_issues(self.session, repo) + self.assertEqual(len(issues), 2) + self.assertEqual([i.id for i in issues], [2, 1]) + + issues = pagure.lib.search_issues(self.session, repo, offset=1) + self.assertEqual(len(issues), 1) + self.assertEqual([i.id for i in issues], [1]) + + def test_search_issues_tags(self): + """ Test the search_issues of pagure.lib. """ + + self.test_edit_issue() + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.issues), 2) + + # Add `tag1` to one issues and `tag2` only to the other one + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + msg = pagure.lib.add_tag_obj( + session=self.session, + obj=issue, + tags='tag1', + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Issue tagged with: tag1') + + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + msg = pagure.lib.add_tag_obj( + session=self.session, + obj=issue, + tags='tag2', + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Issue tagged with: tag2') + + # Search all issues tagged with `tag1` + issues = pagure.lib.search_issues(self.session, repo, tags='tag1') + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 1) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual([tag.tag for tag in issues[0].tags], ['tag1']) + + # Search all issues *not* tagged with `tag1` + issues = pagure.lib.search_issues(self.session, repo, tags='!tag1') + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual( + [tag.tag for tag in issues[0].tags], ['tag2']) + + # Search all issues *not* tagged with `tag1` but tagged with `tag2` + issues = pagure.lib.search_issues( + self.session, repo, tags=['!tag1', 'tag2']) + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual( + [tag.tag for tag in issues[0].tags], ['tag2']) + + def test_get_tags_of_project(self): + """ Test the get_tags_of_project of pagure.lib. """ + + self.test_add_tag_obj() + repo = pagure.lib._get_project(self.session, 'test') + + tags = pagure.lib.get_tags_of_project(self.session, repo) + self.assertEqual([tag.tag for tag in tags], ['tag1']) + + tags = pagure.lib.get_tags_of_project( + self.session, repo, pattern='T*') + self.assertEqual([tag.tag for tag in tags], ['tag1']) + + repo = pagure.lib._get_project(self.session, 'test2') + + tags = pagure.lib.get_tags_of_project(self.session, repo) + self.assertEqual([tag.tag for tag in tags], []) + + def test_get_issue_statuses(self): + """ Test the get_issue_statuses of pagure.lib. """ + statuses = pagure.lib.get_issue_statuses(self.session) + self.assertEqual(sorted(statuses), ['Closed', 'Open']) + + def test_set_up_user(self): + """ Test the set_up_user of pagure.lib. """ + + items = pagure.lib.search_user(self.session) + self.assertEqual(2, len(items)) + self.assertEqual(2, items[0].id) + self.assertEqual('foo', items[0].user) + self.assertEqual(1, items[1].id) + self.assertEqual('pingou', items[1].user) + + pagure.lib.set_up_user( + session=self.session, + username='skvidal', + fullname='Seth', + default_email='skvidal@fp.o', + keydir=pagure.APP.config.get('GITOLITE_KEYDIR', None), + ssh_key='foo key', + ) + self.session.commit() + + items = pagure.lib.search_user(self.session) + self.assertEqual(3, len(items)) + self.assertEqual(2, items[0].id) + self.assertEqual('foo', items[0].user) + self.assertEqual(1, items[1].id) + self.assertEqual('pingou', items[1].user) + self.assertEqual(3, items[2].id) + self.assertEqual('skvidal', items[2].user) + self.assertEqual('Seth', items[2].fullname) + self.assertEqual( + ['skvidal@fp.o'], [email.email for email in items[2].emails]) + + # Add the user a second time + pagure.lib.set_up_user( + session=self.session, + username='skvidal', + fullname='Seth V', + default_email='skvidal@fp.o', keydir=pagure.APP.config.get('GITOLITE_KEYDIR', None), ) self.session.commit() @@ -1650,7 +2029,7 @@ class PagureLibtests(tests.Modeltests): '8fa6110d1f6a7a013969f012e1149ff89bf1252d4f15d25edee31d4662878656' '?s=64&d=retro') - def test_fork_project(self): + def test_fork_project_with_branch(self): """ Test the fork_project of pagure.lib. """ gitfolder = os.path.join(self.path, 'repos') docfolder = os.path.join(self.path, 'docs') @@ -1681,98 +2060,29 @@ class PagureLibtests(tests.Modeltests): projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 1) - repo = pagure.lib._get_project(self.session, 'testproject') - gitrepo = os.path.join(gitfolder, repo.path) - docrepo = os.path.join(docfolder, repo.path) - ticketrepo = os.path.join(ticketfolder, repo.path) - requestrepo = os.path.join(requestfolder, repo.path) - - self.assertTrue(os.path.exists(gitrepo)) - self.assertTrue(os.path.exists(docrepo)) - self.assertTrue(os.path.exists(ticketrepo)) - self.assertTrue(os.path.exists(requestrepo)) - - # Git repo exists - grepo = '%s.git' % os.path.join( - gitfolder, 'forks', 'foo', 'testproject') - os.makedirs(grepo) - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.fork_project, - session=self.session, - user='foo', - repo=repo, - gitfolder=gitfolder, - docfolder=docfolder, - ticketfolder=ticketfolder, - requestfolder=requestfolder, - ) - self.session.rollback() - shutil.rmtree(grepo) - - # Doc repo exists - grepo = '%s.git' % os.path.join( - docfolder, 'forks', 'foo', 'testproject') - os.makedirs(grepo) - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.fork_project, - session=self.session, - user='foo', - repo=repo, - gitfolder=gitfolder, - docfolder=docfolder, - ticketfolder=ticketfolder, - requestfolder=requestfolder, - ) - self.session.rollback() - shutil.rmtree(grepo) + project = pagure.lib._get_project(self.session, 'testproject') + gitrepo = os.path.join(gitfolder, project.path) + docrepo = os.path.join(docfolder, project.path) + ticketrepo = os.path.join(ticketfolder, project.path) + requestrepo = os.path.join(requestfolder, project.path) - # Ticket repo exists - grepo = '%s.git' % os.path.join( - ticketfolder, 'forks', 'foo', 'testproject') - os.makedirs(grepo) - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.fork_project, - session=self.session, - user='foo', - repo=repo, - gitfolder=gitfolder, - docfolder=docfolder, - ticketfolder=ticketfolder, - requestfolder=requestfolder, - ) - self.session.rollback() - shutil.rmtree(grepo) + # Add content to the main repo into three branches + tests.add_content_git_repo(gitrepo, 'master') + tests.add_content_git_repo(gitrepo, 'feature1') + tests.add_content_git_repo(gitrepo, 'feature2') - # Request repo exists - grepo = '%s.git' % os.path.join( - requestfolder, 'forks', 'foo', 'testproject') - os.makedirs(grepo) - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.fork_project, - session=self.session, - user='foo', - repo=repo, - gitfolder=gitfolder, - docfolder=docfolder, - ticketfolder=ticketfolder, - requestfolder=requestfolder, + # Check the branches of the main repo + self.assertEqual( + sorted(pagure.lib.git.get_git_branches(project)), + ['feature1', 'feature2', 'master'] ) - self.session.rollback() - shutil.rmtree(grepo) - - projects = pagure.lib.search_projects(self.session) - self.assertEqual(len(projects), 1) - # Fork worked + # Fork msg = pagure.lib.fork_project( session=self.session, user='foo', - repo=repo, + repo=project, gitfolder=gitfolder, docfolder=docfolder, ticketfolder=ticketfolder, @@ -1785,26 +2095,14 @@ class PagureLibtests(tests.Modeltests): projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 2) - # Fork a fork - - repo = pagure.lib._get_project( + project = pagure.lib._get_project( self.session, 'testproject', user='foo') - - msg = pagure.lib.fork_project( - session=self.session, - user='pingou', - repo=repo, - gitfolder=gitfolder, - docfolder=docfolder, - ticketfolder=ticketfolder, - requestfolder=requestfolder, - ) - self.session.commit() + # Check the branches of the fork self.assertEqual( - msg, 'Repo "testproject" cloned to "pingou/testproject"') + sorted(pagure.lib.git.get_git_branches(project)), + ['feature1', 'feature2', 'master'] + ) - projects = pagure.lib.search_projects(self.session) - self.assertEqual(len(projects), 3) def test_fork_project_namespaced(self): """ Test the fork_project of pagure.lib on a namespaced project. """ @@ -2002,6 +2300,30 @@ class PagureLibtests(tests.Modeltests): forked_repo = pagure.lib._get_project( self.session, 'test', user='pingou') + # Fails for the lack of repo_from and remote_git + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.new_pull_request, + session=self.session, + repo_from=None, + branch_from='master', + repo_to=repo, + branch_to='master', + title='test pull-request', + user='pingou', + requestfolder=None, + ) + + # Let's pretend we turned on the CI hook for the project + project = pagure.lib._get_project(self.session, 'test') + obj = pagure.hooks.pagure_ci.PagureCITable( + project_id=project.id, + active=True + ) + self.session.add(obj) + self.session.commit() + + # Create the new PR req = pagure.lib.new_pull_request( session=self.session, repo_from=forked_repo, @@ -2017,10 +2339,11 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(req.title, 'test pull-request') self.assertEqual(repo.open_requests, 1) - @patch('pagure.lib.notify.send_email') - def test_add_pull_request_comment(self, mockemail): + @patch('pagure.lib.REDIS') + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_pull_request_comment(self, mock_redis): """ Test add_pull_request_comment of pagure.lib. """ - mockemail.return_value = True + mock_redis.return_value = True self.test_new_pull_request() @@ -2036,6 +2359,7 @@ class PagureLibtests(tests.Modeltests): comment='This is awesome, I got to remember it!', user='foo', requestfolder=None, + notification=True, ) self.assertEqual(msg, 'Comment added') self.session.commit() @@ -2043,14 +2367,57 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(len(request.discussion), 0) self.assertEqual(len(request.comments), 1) self.assertEqual(request.score, 0) + self.assertEqual(mock_redis.publish.call_count, 0) - @patch('pagure.lib.notify.send_email') - def test_add_pull_request_flag(self, mockemail): - """ Test add_pull_request_flag of pagure.lib. """ - mockemail.return_value = True + @patch('pagure.lib.REDIS') + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + @patch('pagure.lib.PAGURE_CI', MagicMock(return_value=True)) + def test_add_pull_request_comment(self, mock_redis): + """ Test add_pull_request_comment of pagure.lib. """ + mock_redis.return_value = True self.test_new_pull_request() - tests.create_tokens(self.session) + self.assertEqual(mock_redis.publish.call_count, 3) + + # Let's pretend we turned on the CI hook for the project + project = pagure.lib._get_project(self.session, 'test') + if not project.ci_hook or not project.ci_hook.active: + obj = pagure.hooks.pagure_ci.PagureCITable( + project_id=project.id, + active=True + ) + self.session.add(obj) + self.session.commit() + + request = pagure.lib.search_pull_requests(self.session, requestid=1) + msg = pagure.lib.add_pull_request_comment( + session=self.session, + request=request, + commit='commithash', + tree_id=None, + filename='file', + row=None, + comment='Pretty please pagure-ci rebuild', + user='foo', + requestfolder=None, + notification=True, + trigger_ci=['pretty please pagure-ci rebuild'], + ) + self.assertEqual(msg, 'Comment added') + self.session.commit() + + self.assertEqual(len(request.discussion), 0) + self.assertEqual(len(request.comments), 1) + self.assertEqual(request.score, 0) + self.assertEqual(mock_redis.publish.call_count, 7) + + @patch('pagure.lib.notify.send_email') + def test_add_pull_request_flag(self, mockemail): + """ Test add_pull_request_flag of pagure.lib. """ + mockemail.return_value = True + + self.test_new_pull_request() + tests.create_tokens(self.session) request = pagure.lib.search_pull_requests(self.session, requestid=1) self.assertEqual(len(request.flags), 0) @@ -2102,6 +2469,7 @@ class PagureLibtests(tests.Modeltests): request = pagure.lib.search_pull_requests(self.session, requestid=1) self.assertEqual(len(request.flags), 0) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def test_search_pull_requests(self): """ Test search_pull_requests of pagure.lib. """ @@ -2177,6 +2545,58 @@ class PagureLibtests(tests.Modeltests): ) self.assertEqual(prs, 1) + dt = datetime.datetime.utcnow() + + # Create the second PR + repo = pagure.lib._get_project(self.session, 'test') + req = pagure.lib.new_pull_request( + session=self.session, + repo_from=repo, + branch_from='feature', + repo_to=repo, + branch_to='master', + title='test pull-request #2', + user='pingou', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 2) + self.assertEqual(req.title, 'test pull-request #2') + self.assertEqual(repo.open_requests, 2) + + # Ensure we have 2 PRs + prs = pagure.lib.search_pull_requests( + session=self.session, + author='pingou', + ) + self.assertEqual(len(prs), 2) + + # Test the offset + prs = pagure.lib.search_pull_requests( + session=self.session, + author='pingou', + offset=1, + ) + self.assertEqual(len(prs), 1) + + # Test the updated_after + + # Test updated after before the second PR was created + prs = pagure.lib.search_pull_requests( + session=self.session, + author='pingou', + updated_after=dt, + ) + self.assertEqual(len(prs), 1) + + # Test updated after, 1h ago + prs = pagure.lib.search_pull_requests( + session=self.session, + author='pingou', + updated_after=dt - datetime.timedelta(hours=1), + ) + self.assertEqual(len(prs), 2) + @patch('pagure.lib.notify.send_email') def test_close_pull_request(self, send_email): """ Test close_pull_request of pagure.lib. """ @@ -2222,12 +2642,11 @@ class PagureLibtests(tests.Modeltests): ) self.assertEqual(len(prs), 1) - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_remove_issue_dependency(self, p_send_email, p_ugt): + @patch('pagure.lib.REDIS', MagicMock(return_value=True)) + @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_remove_issue_dependency(self): """ Test remove_issue_dependency of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True self.test_add_issue_dependency() repo = pagure.lib._get_project(self.session, 'test') @@ -2662,6 +3081,23 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(len(groups), 0) self.assertEqual(groups, []) + # Invalid group name + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_group, + self.session, + group_name='foo group', + display_name='foo group', + description=None, + group_type='user', + user='test', + is_admin=False, + blacklist=[], + ) + groups = pagure.lib.search_groups(self.session) + self.assertEqual(len(groups), 0) + self.assertEqual(groups, []) + msg = pagure.lib.add_group( self.session, group_name='foo', @@ -3063,6 +3499,20 @@ class PagureLibtests(tests.Modeltests): user='foo', ) + # Group does not exist, but allow creating it + msg = pagure.lib.add_group_to_project( + session=self.session, + project=project, + new_group='bar', + user='pingou', + create=True, + ) + self.session.commit() + self.assertEqual(msg, 'Group added') + self.assertEqual(project.groups[0].group_name, 'bar') + self.assertEqual(len(project.admin_groups), 1) + self.assertEqual(project.admin_groups[0].group_name, 'bar') + # User does not exist self.assertRaises( pagure.exceptions.PagureException, @@ -3092,8 +3542,12 @@ class PagureLibtests(tests.Modeltests): ) self.session.commit() self.assertEqual(msg, 'Group added') - self.assertEqual(project.groups[0].group_name, 'foo') - self.assertEqual(project.admin_groups[0].group_name, 'foo') + self.assertEqual(project.groups[0].group_name, 'bar') + self.assertEqual(project.groups[1].group_name, 'foo') + self.assertEqual(len(project.admin_groups), 2) + self.assertEqual(project.admin_groups[0].group_name, 'bar') + self.assertEqual(project.admin_groups[1].group_name, 'foo') + self.assertEqual(len(project.committer_groups), 2) # Group already associated with the project self.assertRaises( @@ -3115,8 +3569,11 @@ class PagureLibtests(tests.Modeltests): ) self.session.commit() self.assertEqual(msg, 'Group access updated') - self.assertEqual(project.groups[0].group_name, 'foo') - self.assertEqual(project.committer_groups[0].group_name, 'foo') + self.assertEqual(project.groups[0].group_name, 'bar') + self.assertEqual(project.groups[1].group_name, 'foo') + self.assertEqual(len(project.admin_groups), 1) + self.assertEqual(project.admin_groups[0].group_name, 'bar') + self.assertEqual(len(project.committer_groups), 2) # Update the access of group in the project msg = pagure.lib.add_group_to_project( @@ -3128,7 +3585,12 @@ class PagureLibtests(tests.Modeltests): ) self.session.commit() self.assertEqual(msg, 'Group access updated') - self.assertEqual(project.groups[0].group_name, 'foo') + self.assertEqual(project.groups[0].group_name, 'bar') + self.assertEqual(project.groups[1].group_name, 'foo') + self.assertEqual(len(project.admin_groups), 1) + self.assertEqual(project.admin_groups[0].group_name, 'bar') + self.assertEqual(len(project.committer_groups), 1) + self.assertEqual(project.committer_groups[0].group_name, 'bar') def test_update_watch_status(self): """ Test the update_watch_status method of pagure.lib. """ @@ -3197,6 +3659,19 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'Watch status reset') + def test_get_watch_level_on_repo_invalid(self): + """ test the get_watch_level_on_repo method of pagure.lib. """ + + self.assertRaises( + RuntimeError, + pagure.lib.get_watch_level_on_repo, + session=self.session, + user='pingou', + repo=None, + repouser=None, + namespace=None, + ) + def test_get_watch_level_on_repo(self): """ Test the get_watch_level_on_repo method of pagure.lib. """ tests.create_projects(self.session) @@ -3222,6 +3697,14 @@ class PagureLibtests(tests.Modeltests): ) self.assertEqual(watch_level, []) + # Invalid project + watch = pagure.lib.get_watch_level_on_repo( + session=self.session, + user=user, + repo='invalid', + ) + self.assertFalse(watch) + pagure.lib.add_group_to_project( session=self.session, project=project, @@ -3365,6 +3848,16 @@ class PagureLibtests(tests.Modeltests): ) self.assertEqual(watch_level, ['issues']) + # wrong project + user.username = 'bar' + watch_level = pagure.lib.get_watch_level_on_repo( + session=self.session, + user=user, + repo='test', + namespace='somenamespace', + ) + self.assertEqual(watch_level, []) + def test_user_watch_list(self): ''' test user watch list method of pagure.lib ''' @@ -3380,6 +3873,26 @@ class PagureLibtests(tests.Modeltests): watch_list = [obj.name for obj in watch_list_objs] self.assertEqual(watch_list, ['test', 'test2', 'test3']) + # Make pingou unwatch the test3 project + project =pagure.lib._get_project( + self.session, 'test3', namespace='somenamespace') + msg = pagure.lib.update_watch_status( + session=self.session, + project=project, + user='pingou', + watch='0' + ) + self.session.commit() + self.assertEqual(msg, 'You are no longer watching this project') + + # Re-check the watch list + watch_list_objs = pagure.lib.user_watch_list( + session=self.session, + user='pingou', + ) + watch_list = [obj.name for obj in watch_list_objs] + self.assertEqual(watch_list, ['test', 'test2']) + # He isn't in the db, thus not watching anything user.username = 'vivek' watch_list_objs = pagure.lib.user_watch_list( @@ -3606,6 +4119,24 @@ class PagureLibtests(tests.Modeltests): html = pagure.lib.text2markdown(text) self.assertEqual(html, expected[idx]) + def test_text2markdown_exception(self): + ''' Test the test2markdown method in pagure.lib. ''' + + text = 'test#1 bazinga!' + expected_html = 'test#1 bazinga!' + + html = pagure.lib.text2markdown(text) + self.assertEqual(html, expected_html) + + def test_text2markdown_empty_string(self): + ''' Test the test2markdown method in pagure.lib. ''' + + text = '' + expected_html = '' + + html = pagure.lib.text2markdown(text) + self.assertEqual(html, expected_html) + def test_get_access_levels(self): ''' Test the get_access_levels method in pagure.lib ''' @@ -4432,6 +4963,736 @@ foo bar html = pagure.lib.text2markdown(text) self.assertEqual(html, expected) + def test_set_redis(self): + """ Test the set_redis function of pagure.lib. """ + self.assertIsNone(pagure.lib.REDIS) + pagure.lib.set_redis('0.0.0.0', 6379, 0) + self.assertIsNotNone(pagure.lib.REDIS) + + def test_set_pagure_ci(self): + """ Test the set_pagure_ci function of pagure.lib. """ + self.assertIn(pagure.lib.PAGURE_CI, [None, ['jenkins']]) + pagure.lib.set_pagure_ci(True) + self.assertIsNotNone(pagure.lib.PAGURE_CI) + self.assertTrue(pagure.lib.PAGURE_CI) + + def test_get_user_invalid_user(self): + """ Test the get_user function of pagure.lib. """ + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.get_user, + self.session, + 'unknown' + ) + + def test_get_user_username(self): + """ Test the get_user function of pagure.lib. """ + user = pagure.lib.get_user(self.session, 'foo') + self.assertEqual(user.username, 'foo') + + def test_get_user_email(self): + """ Test the get_user function of pagure.lib. """ + user = pagure.lib.get_user(self.session, 'bar@pingou.com') + self.assertEqual(user.username, 'pingou') + + def test_is_valid_ssh_key_empty(self): + """ Test the is_valid_ssh_key function of pagure.lib. """ + self.assertIsNone(pagure.lib.is_valid_ssh_key('')) + + def test_create_deploykeys_ssh_keys_on_disk_empty(self): + """ Test the create_deploykeys_ssh_keys_on_disk function of + pagure.lib. """ + self.assertIsNone( + pagure.lib.create_deploykeys_ssh_keys_on_disk(None, None)) + self.assertFalse( + os.path.exists(os.path.join(self.path, 'deploykeys', 'test'))) + + def test_create_deploykeys_ssh_keys_on_disk_nokey(self): + """ Test the create_deploykeys_ssh_keys_on_disk function of + pagure.lib. """ + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + + self.assertIsNone( + pagure.lib.create_deploykeys_ssh_keys_on_disk( + project, self.path)) + self.assertTrue( + os.path.exists(os.path.join(self.path, 'deploykeys', 'test'))) + self.assertEqual( + os.listdir(os.path.join(self.path, 'deploykeys', 'test')), []) + + @patch('pagure.lib.is_valid_ssh_key', MagicMock(return_value='foo bar')) + def test_create_deploykeys_ssh_keys_on_disk(self): + """ Test the create_deploykeys_ssh_keys_on_disk function of + pagure.lib. """ + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + + # Add a deploy key to the project + msg = pagure.lib.add_deploykey_to_project( + self.session, + project=project, + ssh_key='foo bar', + pushaccess=False, + user='pingou' + ) + self.assertEqual(msg, 'Deploy key added') + + self.assertIsNone( + pagure.lib.create_deploykeys_ssh_keys_on_disk( + project, self.path)) + self.assertTrue( + os.path.exists(os.path.join(self.path, 'deploykeys', 'test'))) + self.assertEqual( + os.listdir(os.path.join(self.path, 'deploykeys', 'test')), + ['deploykey_test_1.pub']) + + # Remove the deploykey + project = pagure.lib._get_project(self.session, 'test') + self.session.delete(project.deploykeys[0]) + self.session.commit() + + # Remove the file on disk + self.assertIsNone( + pagure.lib.create_deploykeys_ssh_keys_on_disk( + project, self.path)) + self.assertTrue( + os.path.exists(os.path.join(self.path, 'deploykeys', 'test'))) + self.assertEqual( + os.listdir(os.path.join(self.path, 'deploykeys', 'test')), []) + + @patch('pagure.lib.is_valid_ssh_key', MagicMock(return_value='\nfoo bar')) + def test_create_deploykeys_ssh_keys_on_disk_empty_first_key(self): + """ Test the create_deploykeys_ssh_keys_on_disk function of + pagure.lib. """ + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + + # Add a deploy key to the project + new_key_obj = pagure.lib.model.DeployKey( + project_id=project.id, + pushaccess=False, + public_ssh_key='\n foo bar', + ssh_short_key='\n foo bar', + ssh_search_key='\n foo bar', + creator_user_id=1 # pingou + ) + + self.session.add(new_key_obj) + self.session.commit() + + self.assertIsNone( + pagure.lib.create_deploykeys_ssh_keys_on_disk( + project, self.path)) + self.assertTrue( + os.path.exists(os.path.join(self.path, 'deploykeys', 'test'))) + self.assertEqual( + os.listdir(os.path.join(self.path, 'deploykeys', 'test')), + []) + + def test_create_deploykeys_ssh_keys_on_disk_invalid(self): + """ Test the create_deploykeys_ssh_keys_on_disk function of + pagure.lib. """ + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + + # Add a deploy key to the project + new_key_obj = pagure.lib.model.DeployKey( + project_id=project.id, + pushaccess=False, + public_ssh_key='foo bar', + ssh_short_key='foo bar', + ssh_search_key='foo bar', + creator_user_id=1 # pingou + ) + + self.session.add(new_key_obj) + self.session.commit() + + self.assertIsNone( + pagure.lib.create_deploykeys_ssh_keys_on_disk( + project, self.path)) + self.assertTrue( + os.path.exists(os.path.join(self.path, 'deploykeys', 'test'))) + self.assertEqual( + os.listdir(os.path.join(self.path, 'deploykeys', 'test')), + []) + + def test_create_user_ssh_keys_on_disk_none(self): + """ Test the create_user_ssh_keys_on_disk function of pagure.lib. """ + self.assertIsNone( + pagure.lib.create_user_ssh_keys_on_disk(None, None)) + + def test_create_user_ssh_keys_on_disk_no_key(self): + """ Test the create_user_ssh_keys_on_disk function of pagure.lib. """ + user = pagure.lib.get_user(self.session, 'foo') + + self.assertIsNone( + pagure.lib.create_user_ssh_keys_on_disk(user, self.path)) + + def test_create_user_ssh_keys_on_disk_invalid_key(self): + """ Test the create_user_ssh_keys_on_disk function of pagure.lib. """ + user = pagure.lib.get_user(self.session, 'foo') + user.public_ssh_key = 'foo\n bar' + self.session.add(user) + self.session.commit() + + self.assertIsNone( + pagure.lib.create_user_ssh_keys_on_disk(user, self.path)) + + def test_create_user_ssh_keys_on_disk_empty_first_key(self): + """ Test the create_user_ssh_keys_on_disk function of pagure.lib. """ + user = pagure.lib.get_user(self.session, 'foo') + user.public_ssh_key = '\nbar' + self.session.add(user) + self.session.commit() + + self.assertIsNone( + pagure.lib.create_user_ssh_keys_on_disk(user, self.path)) + + @patch('pagure.lib.is_valid_ssh_key', MagicMock(return_value='foo bar')) + def test_create_user_ssh_keys_on_disk(self): + """ Test the create_user_ssh_keys_on_disk function of pagure.lib. """ + user = pagure.lib.get_user(self.session, 'foo') + user.public_ssh_key = 'foo bar' + self.session.add(user) + self.session.commit() + + self.assertIsNone( + pagure.lib.create_user_ssh_keys_on_disk(user, self.path)) + + # Re-generate the ssh keys on disk: + self.assertIsNone( + pagure.lib.create_user_ssh_keys_on_disk(user, self.path)) + + def test_update_user_settings_invalid_user(self): + """ Test the update_user_settings function of pagure.lib. """ + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.update_user_settings, + session=self.session, + settings={}, + user='invalid' + ) + + def test_update_user_settings_no_change(self): + """ Test the update_user_settings function of pagure.lib. """ + + # First update the setting + msg = pagure.lib.update_user_settings( + session=self.session, + settings={'cc_me_to_my_actions': True}, + user='pingou' + ) + self.assertEqual(msg, 'Successfully edited your settings') + + # Then change it back to its default + msg = pagure.lib.update_user_settings( + session=self.session, + settings={}, + user='pingou' + ) + self.assertEqual(msg, 'Successfully edited your settings') + + def test_update_user_settings_no_data(self): + """ Test the update_user_settings function of pagure.lib. """ + + msg = pagure.lib.update_user_settings( + session=self.session, + settings={'cc_me_to_my_actions': False}, + user='pingou' + ) + self.assertEqual(msg, 'No settings to change') + + def test_update_user_settings(self): + """ Test the update_user_settings function of pagure.lib. """ + + msg = pagure.lib.update_user_settings( + session=self.session, + settings={'cc_me_to_my_actions': True}, + user='pingou' + ) + self.assertEqual(msg, 'Successfully edited your settings') + + def test_add_email_to_user_with_logs(self): + """ Test the add_email_to_user function of pagure.lib when there + are log entries associated to the email added. + """ + user = pagure.lib.search_user(self.session, username='pingou') + + # Add a couple of log entries associated with the new email + for i in range(3): + log = pagure.lib.model.PagureLog( + user_email='new_email@pingoured.fr', + log_type='commit', + ref_id=i + ) + self.session.add(log) + self.session.commit() + + # Check emails before + self.assertEqual(len(user.emails), 2) + + # Add the new_email to the user + pagure.lib.add_email_to_user( + self.session, user, 'new_email@pingoured.fr' + ) + self.session.commit() + + # Check emails after + self.assertEqual(len(user.emails), 3) + + @patch('pagure.lib.is_valid_ssh_key', MagicMock(return_value='foo bar')) + def test_update_user_ssh(self): + """ Test the update_user_ssh function of pagure.lib. """ + + pagure.lib.update_user_ssh( + self.session, + user='pingou', + ssh_key='foo key', + keydir=self.path, + ) + + self.assertTrue( + os.path.exists(os.path.join(self.path, 'keys_0')) + ) + self.assertEqual( + os.listdir(os.path.join(self.path, 'keys_0')), + ['pingou.pub'] + ) + + def test_add_user_pending_email_existing_email(self): + """ Test the add_user_pending_email function of pagure.lib. """ + user = pagure.lib.search_user(self.session, username='pingou') + + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_user_pending_email, + session=self.session, + userobj=user, + email='foo@bar.com' + ) + + @patch('pagure.lib.notify.notify_new_email', MagicMock(return_value=True)) + def test_add_user_pending_email(self): + """ Test the add_user_pending_email function of pagure.lib. """ + user = pagure.lib.search_user(self.session, username='pingou') + + self.assertEqual(len(user.emails), 2) + self.assertEqual(len(user.emails_pending), 0) + + pagure.lib.add_user_pending_email( + session=self.session, + userobj=user, + email='new_mail@pingoured.fr' + ) + self.session.commit() + + self.assertEqual(len(user.emails), 2) + self.assertEqual(len(user.emails_pending), 1) + + def test_resend_pending_email_someone_else_email(self): + """ Test the resend_pending_email function of pagure.lib. """ + user = pagure.lib.search_user(self.session, username='pingou') + + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.resend_pending_email, + session=self.session, + userobj=user, + email='foo@bar.com' + ) + + def test_resend_pending_email_email_validated(self): + """ Test the resend_pending_email function of pagure.lib. """ + user = pagure.lib.search_user(self.session, username='pingou') + + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.resend_pending_email, + session=self.session, + userobj=user, + email='foo@pingou.com' + ) + + def test_get_acls(self): + """ Test the get_acls function of pagure.lib. """ + acls = pagure.lib.get_acls(self.session) + self.assertEqual( + [a.name for a in acls], + [ + 'create_project', + 'fork_project', + 'issue_assign', + 'issue_change_status', + 'issue_comment', + 'issue_create', + 'issue_subscribe', + 'issue_update', + 'issue_update_custom_fields', + 'issue_update_milestone', + 'pull_request_close', + 'pull_request_comment', + 'pull_request_flag', + 'pull_request_merge' + ] + ) + + def test_get_acls_restrict_one(self): + """ Test the get_acls function of pagure.lib. """ + acls = pagure.lib.get_acls(self.session, restrict='create_project') + self.assertEqual([a.name for a in acls], ['create_project']) + + def test_get_acls_restrict_two(self): + """ Test the get_acls function of pagure.lib. """ + acls = pagure.lib.get_acls( + self.session, restrict=['create_project', 'issue_create']) + self.assertEqual( + [a.name for a in acls], + ['create_project', 'issue_create']) + + def test_filter_img_src(self): + """ Test the filter_img_src function of pagure.lib. """ + for name in ('alt', 'height', 'width', 'class'): + self.assertTrue(pagure.lib.filter_img_src(name, 'caption')) + + self.assertTrue(pagure.lib.filter_img_src( + 'src', '/path/to/image')) + self.assertTrue(pagure.lib.filter_img_src( + 'src', 'http://pagure.org/path/to/image')) + self.assertFalse(pagure.lib.filter_img_src( + 'src', 'http://foo.org/path/to/image')) + + self.assertFalse(pagure.lib.filter_img_src( + 'anything', 'http://foo.org/path/to/image')) + + def test_clean_input(self): + """ Test the clean_input function of pagure.lib. """ + text = 'Click here' + output = pagure.lib.clean_input(text) + self.assertEqual(output, text) + + def test_could_be_text(self): + """ Test the could_be_text function of pagure.lib. """ + self.assertTrue(pagure.lib.could_be_text('foo')) + self.assertTrue(pagure.lib.could_be_text('fâö')) + self.assertFalse(pagure.lib.could_be_text(u'fâö')) + + def test_set_custom_key_fields_empty(self): + """ Test the set_custom_key_fields function of pagure.lib. """ + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + self.assertIsNotNone(project) + + msg = pagure.lib.set_custom_key_fields( + session=self.session, + project=project, + fields=[], + types=[], + data=[], + notify=False + ) + self.session.commit() + self.assertEqual(msg, 'List of custom fields updated') + + def test_set_custom_key_fields(self): + """ Test the set_custom_key_fields function of pagure.lib. """ + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + self.assertIsNotNone(project) + + # Set a custom key + msg = pagure.lib.set_custom_key_fields( + session=self.session, + project=project, + fields=['upstream'], + types=['url'], + data=[None], + notify=False + ) + self.session.commit() + self.assertEqual(msg, 'List of custom fields updated') + + # Set another one, with notifications on + msg = pagure.lib.set_custom_key_fields( + session=self.session, + project=project, + fields=['bugzilla_url'], + types=['url'], + data=[None], + notify=['on'] + ) + self.session.commit() + self.assertEqual(msg, 'List of custom fields updated') + + # Re-set the second one but with notifications off + msg = pagure.lib.set_custom_key_fields( + session=self.session, + project=project, + fields=['bugzilla_url'], + types=['url'], + data=[None], + notify=['off'] + ) + self.session.commit() + self.assertEqual(msg, 'List of custom fields updated') + + @patch('pagure.lib.REDIS') + def test_set_custom_key_value_boolean(self, mock_redis): + """ Test the set_custom_key_value function of pagure.lib. """ + mock_redis.return_value = True + + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + self.assertIsNotNone(project) + + # Set a custom key + msg = pagure.lib.set_custom_key_fields( + session=self.session, + project=project, + fields=['tested'], + types=['boolean'], + data=[None], + notify=False + ) + self.session.commit() + self.assertEqual(msg, 'List of custom fields updated') + + # Create issues + msg = pagure.lib.new_issue( + session=self.session, + repo=project, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + issue = pagure.lib.search_issues(self.session, project, issueid=1) + + self.assertEqual(len(project.issue_keys), 1) + self.assertEqual(project.issue_keys[0].key_type, 'boolean') + msg = pagure.lib.set_custom_key_value( + session=self.session, + issue=issue, + key=project.issue_keys[0], + value=True + ) + self.session.commit() + self.assertEqual(msg, 'Custom field tested adjusted to True') + + # Update it a second time to trigger edit + msg = pagure.lib.set_custom_key_value( + session=self.session, + issue=issue, + key=project.issue_keys[0], + value=False + ) + self.assertEqual( + msg, 'Custom field tested reset (from 1)') + + self.assertEqual(mock_redis.publish.call_count, 3) + + @patch('pagure.lib.REDIS') + def test_set_custom_key_value_boolean_private_issue(self, mock_redis): + """ Test the set_custom_key_value function of pagure.lib. """ + mock_redis.return_value = True + + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + self.assertIsNotNone(project) + + # Set a custom key + msg = pagure.lib.set_custom_key_fields( + session=self.session, + project=project, + fields=['tested'], + types=['boolean'], + data=[None], + notify=False + ) + self.session.commit() + self.assertEqual(msg, 'List of custom fields updated') + + # Create issues + msg = pagure.lib.new_issue( + session=self.session, + repo=project, + title='Test issue', + content='We should work on this', + user='pingou', + private=True, + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + issue = pagure.lib.search_issues(self.session, project, issueid=1) + + self.assertEqual(len(project.issue_keys), 1) + self.assertEqual(project.issue_keys[0].key_type, 'boolean') + msg = pagure.lib.set_custom_key_value( + session=self.session, + issue=issue, + key=project.issue_keys[0], + value=True + ) + self.session.commit() + self.assertEqual(msg, 'Custom field tested adjusted to True') + + # Update it a second time to trigger edit + msg = pagure.lib.set_custom_key_value( + session=self.session, + issue=issue, + key=project.issue_keys[0], + value=False + ) + self.session.commit() + self.assertEqual( + msg, 'Custom field tested reset (from 1)') + + self.assertEqual(mock_redis.publish.call_count, 2) + + @patch('pagure.lib.REDIS') + def test_set_custom_key_value_text(self, mock_redis): + """ Test the set_custom_key_value function of pagure.lib. """ + mock_redis.return_value = True + + tests.create_projects(self.session) + project = pagure.lib._get_project(self.session, 'test') + self.assertIsNotNone(project) + + # Set a custom key + msg = pagure.lib.set_custom_key_fields( + session=self.session, + project=project, + fields=['tested'], + types=['text'], + data=[None], + notify=False + ) + self.session.commit() + self.assertEqual(msg, 'List of custom fields updated') + + # Create issues + msg = pagure.lib.new_issue( + session=self.session, + repo=project, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + issue = pagure.lib.search_issues(self.session, project, issueid=1) + + self.assertEqual(len(project.issue_keys), 1) + self.assertEqual(project.issue_keys[0].key_type, 'text') + msg = pagure.lib.set_custom_key_value( + session=self.session, + issue=issue, + key=project.issue_keys[0], + value='In progress' + ) + self.session.commit() + self.assertEqual(msg, 'Custom field tested adjusted to In progress') + + # Update it a second time to trigger edit + msg = pagure.lib.set_custom_key_value( + session=self.session, + issue=issue, + key=project.issue_keys[0], + value='Done' + ) + self.assertEqual( + msg, 'Custom field tested adjusted to Done (was: In progress)') + + self.assertEqual(mock_redis.publish.call_count, 3) + + def test_log_action_invalid(self): + """ Test the log_action function of pagure.lib. """ + obj = MagicMock + obj.isa = "invalid" + self.assertRaises( + pagure.exceptions.InvalidObjectException, + pagure.lib.log_action, + session=self.session, + action="foo", + obj=obj, + user_obj=None, + ) + + def test_search_token_no_acls(self): + """ Test the search_token function of pagure.lib. """ + tests.create_projects(self.session) + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + out = pagure.lib.search_token( + self.session, + [] + ) + self.assertEqual(len(out), 1) + self.assertEqual(out[0].id, 'aaabbbcccddd') + + def test_search_token_single_acls(self): + """ Test the search_token function of pagure.lib. """ + tests.create_projects(self.session) + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + out = pagure.lib.search_token( + self.session, + 'issue_create', + ) + self.assertEqual(len(out), 1) + self.assertEqual(out[0].id, 'aaabbbcccddd') + + def test_search_token_single_acls_user(self): + """ Test the search_token function of pagure.lib. """ + tests.create_projects(self.session) + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + out = pagure.lib.search_token( + self.session, + 'issue_create', + user='pingou', + ) + self.assertEqual(len(out), 1) + self.assertEqual(out[0].id, 'aaabbbcccddd') + + out = pagure.lib.search_token( + self.session, + 'issue_create', + user='foo', + ) + self.assertEqual(len(out), 0) + + def test_search_token_single_acls_active(self): + """ Test the search_token function of pagure.lib. """ + tests.create_projects(self.session) + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + out = pagure.lib.search_token( + self.session, + 'issue_create', + active=True + ) + self.assertEqual(len(out), 1) + self.assertEqual(out[0].id, 'aaabbbcccddd') + + out = pagure.lib.search_token( + self.session, + 'issue_create', + expired=True + ) + self.assertEqual(len(out), 0) if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index b05e95d..8a05b25 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -562,28 +562,28 @@ repo requests/forks/pingou/test3 with open(outputconf) as stream: data = stream.read() - exp = """@sysadmin = pingou -@devs = pingou + exp = """@devs = pingou +@sysadmin = pingou repo test R = @all - RW+ = @sysadmin @devs + RW+ = @devs @sysadmin RW+ = pingou RW+ = foo repo docs/test R = @all - RW+ = @sysadmin @devs + RW+ = @devs @sysadmin RW+ = pingou RW+ = foo repo tickets/test - RW+ = @sysadmin @devs + RW+ = @devs @sysadmin RW+ = pingou RW+ = foo repo requests/test - RW+ = @sysadmin @devs + RW+ = @devs @sysadmin RW+ = pingou RW+ = foo @@ -874,28 +874,28 @@ repo requests/forks/pingou/test2 with open(outputconf) as stream: data = stream.read() - exp = """@sysadmin = pingou -@devs = pingou + exp = """@devs = pingou +@sysadmin = pingou repo test R = @all - RW+ = @sysadmin @devs + RW+ = @devs @sysadmin RW+ = pingou RW+ = foo repo docs/test R = @all - RW+ = @sysadmin @devs + RW+ = @devs @sysadmin RW+ = pingou RW+ = foo repo tickets/test - RW+ = @sysadmin @devs + RW+ = @devs @sysadmin RW+ = pingou RW+ = foo repo requests/test - RW+ = @sysadmin @devs + RW+ = @devs @sysadmin RW+ = pingou RW+ = foo @@ -1796,6 +1796,7 @@ index 0000000..60f7480 "priority": 1, } + # Invalid project self.assertRaises( pagure.exceptions.PagureException, pagure.lib.git.update_ticket_from_git, @@ -1807,7 +1808,6 @@ index 0000000..60f7480 json_data=data ) - # Create the issue data = { "status": "Open", "title": "foo", "comments": [], @@ -1815,7 +1815,6 @@ index 0000000..60f7480 "user": { "name": "pingou", "emails": ["pingou@fedoraproject.org"]}, "milestone": "Next Release", - "priority": 1, } pagure.lib.git.update_ticket_from_git( From 857f6a17b7300a3db9af17f9642c1cd3136ad546 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 17/19] fixup: Simplify checking if the priority is in the list of allowed priorities when creating issue --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 6f7ae2f..7e96b36 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1450,7 +1450,9 @@ def new_issue(session, repo, title, content, user, ticketfolder, issue_id=None, priority = int(priority) except (ValueError, TypeError): priority = None - if priority is not None and str(priority) not in priorities: + if priorities \ + and priority is not None \ + and str(priority) not in priorities: raise pagure.exceptions.PagureException( 'You are trying to create an issue with a priority that does ' 'not exist in the project.') From b5f5b0c08ecf79814f9c15d47128bec435cc254e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 15 2017 15:18:43 +0000 Subject: [PATCH 18/19] Fix the docstring --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 7e96b36..65fbd4d 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3372,7 +3372,7 @@ def _convert_markdown(md_processor, text): """ Small function converting the text to html using the given markdown processor. - This was done in order to + This was done in order to make testing it easier. """ return md_processor.convert(text) From 88a1286cce73280113feeea2b9382ad2bd128f70 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 16 2017 09:58:14 +0000 Subject: [PATCH 19/19] Make the tests pass on postgresql --- diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 0c9af85..d7ec772 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -1771,6 +1771,11 @@ class PagureLibtests(tests.Modeltests): # Add tags to the project project = pagure.lib._get_project(self.session, 'test') + tag = pagure.lib.model.Tag( + tag='fedora' + ) + self.session.add(tag) + self.session.commit() tp = pagure.lib.model.TagProject( project_id=project.id, tag='fedora' @@ -5243,8 +5248,9 @@ foo bar self.assertEqual(len(user.emails), 3) @patch('pagure.lib.is_valid_ssh_key', MagicMock(return_value='foo bar')) - def test_update_user_ssh(self): + def test_update_user_ssh_valid_key(self): """ Test the update_user_ssh function of pagure.lib. """ + pagure.SESSION = self.session pagure.lib.update_user_ssh( self.session, @@ -5252,6 +5258,7 @@ foo bar ssh_key='foo key', keydir=self.path, ) + self.session.commit() self.assertTrue( os.path.exists(os.path.join(self.path, 'keys_0')) @@ -5490,8 +5497,12 @@ foo bar key=project.issue_keys[0], value=False ) - self.assertEqual( - msg, 'Custom field tested reset (from 1)') + if str(self.session.bind.engine.url).startswith('sqlite'): + self.assertEqual( + msg, 'Custom field tested reset (from 1)') + else: + self.assertEqual( + msg, 'Custom field tested reset (from true)') self.assertEqual(mock_redis.publish.call_count, 3) @@ -5550,8 +5561,12 @@ foo bar value=False ) self.session.commit() - self.assertEqual( - msg, 'Custom field tested reset (from 1)') + if str(self.session.bind.engine.url).startswith('sqlite'): + self.assertEqual( + msg, 'Custom field tested reset (from 1)') + else: + self.assertEqual( + msg, 'Custom field tested reset (from true)') self.assertEqual(mock_redis.publish.call_count, 2)