| |
@@ -0,0 +1,324 @@
|
| |
+ from unittest.mock import Mock, patch
|
| |
+
|
| |
+ import fedora_messaging.api
|
| |
+ import pytest
|
| |
+
|
| |
+ import toddlers.plugins.check_commit_rights
|
| |
+
|
| |
+
|
| |
+ class TestCheckCommitRightsToddler:
|
| |
+ toddler_cls = toddlers.plugins.check_commit_rights.CheckCommitRights
|
| |
+
|
| |
+ def test_accepts_topic_invalid(self, toddler):
|
| |
+ assert toddler.accepts_topic("foo.bar") is False
|
| |
+
|
| |
+ @pytest.mark.parametrize(
|
| |
+ "topic",
|
| |
+ [
|
| |
+ "org.fedoraproject.*.toddlers.trigger.check_commit_rights",
|
| |
+ "org.fedoraproject.prod.toddlers.trigger.check_commit_rights",
|
| |
+ "org.fedoraproject.stg.toddlers.trigger.check_commit_rights",
|
| |
+ ],
|
| |
+ )
|
| |
+ def test_accepts_topic_valid(self, topic, toddler):
|
| |
+ assert toddler.accepts_topic(topic)
|
| |
+
|
| |
+ def test_process_config_missing_exclude_users(self, toddler):
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.check_commit_rights"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ with pytest.raises(
|
| |
+ Exception,
|
| |
+ match=r"Invalid toddler configuration, no `exclude_users` defined",
|
| |
+ ):
|
| |
+ assert toddler.process(config={}, message=msg) is None
|
| |
+
|
| |
+ def test_process_config_missing_notify_emails(self, toddler):
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.check_commit_rights"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ with pytest.raises(
|
| |
+ Exception,
|
| |
+ match=r"Invalid toddler configuration, no `notify_emails` defined",
|
| |
+ ):
|
| |
+ assert toddler.process(config={"exclude_users": []}, message=msg) is None
|
| |
+
|
| |
+ @patch("toddlers.utils.fedora_account.set_fasjson", new=Mock(return_value=True))
|
| |
+ @patch("toddlers.utils.fedora_account.get_group_member")
|
| |
+ def test_process_no_fas(self, get_group_member, toddler):
|
| |
+ get_group_member.return_value = []
|
| |
+
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.check_commit_rights"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ config = {
|
| |
+ "exclude_users": "[]",
|
| |
+ "notify_emails": "[]",
|
| |
+ }
|
| |
+
|
| |
+ with pytest.raises(
|
| |
+ Exception,
|
| |
+ match=r"Something wrong occurred, I found no packagers. Exiting.",
|
| |
+ ):
|
| |
+ toddler.process(config=config, message=msg, send_email=False)
|
| |
+
|
| |
+ @patch("toddlers.utils.fedora_account.set_fasjson", new=Mock(return_value=True))
|
| |
+ @patch("toddlers.plugins.check_commit_rights._log.info")
|
| |
+ @patch("toddlers.utils.notify.send_email")
|
| |
+ @patch("toddlers.utils.fedora_account.get_group_member")
|
| |
+ def test_process_all_right(self, get_group_member, send_email, info, toddler):
|
| |
+ req_json = {
|
| |
+ "pagination": {
|
| |
+ "page": 1,
|
| |
+ "pages": 1,
|
| |
+ "per_page": 1,
|
| |
+ },
|
| |
+ "projects": [
|
| |
+ {
|
| |
+ "access_users": {
|
| |
+ "admin": ["admin_user", "packager_user"],
|
| |
+ "collaborator": ["collaborator_user"],
|
| |
+ "commit": ["commit_user"],
|
| |
+ "owner": ["owner_user"],
|
| |
+ },
|
| |
+ "fullname": "rpms/project_one",
|
| |
+ }
|
| |
+ ],
|
| |
+ }
|
| |
+
|
| |
+ req = Mock()
|
| |
+ req.ok = True
|
| |
+ req.json.return_value = req_json
|
| |
+ toddler.requests_session.get.return_value = req
|
| |
+
|
| |
+ get_group_member.return_value = ["packager_user"]
|
| |
+
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.check_commit_rights"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ config = {
|
| |
+ "exclude_users": "[]",
|
| |
+ "notify_emails": "[]",
|
| |
+ "admin_email": "foo@bar",
|
| |
+ "mail_server": "127.0.0.1",
|
| |
+ }
|
| |
+
|
| |
+ assert toddler.process(config=config, message=msg) is None
|
| |
+ info.assert_any_call(
|
| |
+ "### Found 4 users with commit privileges but not in packager group ###"
|
| |
+ )
|
| |
+ info.assert_any_call("admin_user")
|
| |
+ info.assert_any_call("collaborator_user")
|
| |
+ info.assert_any_call("commit_user")
|
| |
+ info.assert_any_call("owner_user")
|
| |
+ with pytest.raises(AssertionError):
|
| |
+ info.assert_any_call("packager_user")
|
| |
+ send_email.assert_called()
|
| |
+
|
| |
+ @patch("toddlers.utils.fedora_account.set_fasjson", new=Mock(return_value=True))
|
| |
+ @patch("toddlers.plugins.check_commit_rights._log.info")
|
| |
+ @patch("toddlers.utils.notify.send_email")
|
| |
+ @patch("toddlers.utils.fedora_account.get_group_member")
|
| |
+ def test_process_all_right_multiple_pages(
|
| |
+ self, get_group_member, send_email, info, toddler
|
| |
+ ):
|
| |
+ req_json = [
|
| |
+ {
|
| |
+ "pagination": {
|
| |
+ "page": 1,
|
| |
+ "pages": 2,
|
| |
+ "per_page": 1,
|
| |
+ },
|
| |
+ "projects": [
|
| |
+ {
|
| |
+ "access_users": {
|
| |
+ "admin": ["admin_user", "packager_user"],
|
| |
+ "collaborator": [],
|
| |
+ "commit": [],
|
| |
+ "owner": [],
|
| |
+ },
|
| |
+ "fullname": "rpms/project_one",
|
| |
+ }
|
| |
+ ],
|
| |
+ },
|
| |
+ {
|
| |
+ "pagination": {
|
| |
+ "page": 2,
|
| |
+ "pages": 2,
|
| |
+ "per_page": 1,
|
| |
+ },
|
| |
+ "projects": [
|
| |
+ {
|
| |
+ "access_users": {
|
| |
+ "admin": [],
|
| |
+ "collaborator": [],
|
| |
+ "commit": [],
|
| |
+ "owner": ["owner_user"],
|
| |
+ },
|
| |
+ "fullname": "rpms/project_two",
|
| |
+ }
|
| |
+ ],
|
| |
+ },
|
| |
+ ]
|
| |
+
|
| |
+ req = Mock()
|
| |
+ req.ok = True
|
| |
+ req.json.side_effect = req_json
|
| |
+ toddler.requests_session.get.return_value = req
|
| |
+
|
| |
+ get_group_member.return_value = ["packager_user"]
|
| |
+
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.check_commit_rights"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ config = {
|
| |
+ "exclude_users": "[]",
|
| |
+ "notify_emails": "[]",
|
| |
+ "admin_email": "foo@bar",
|
| |
+ "mail_server": "127.0.0.1",
|
| |
+ }
|
| |
+
|
| |
+ assert toddler.process(config=config, message=msg) is None
|
| |
+ info.assert_any_call(
|
| |
+ "### Found 2 users with commit privileges but not in packager group ###"
|
| |
+ )
|
| |
+ info.assert_any_call("admin_user")
|
| |
+ info.assert_any_call("owner_user")
|
| |
+ with pytest.raises(AssertionError):
|
| |
+ info.assert_any_call("packager_user")
|
| |
+ send_email.assert_called()
|
| |
+
|
| |
+ @patch("toddlers.utils.fedora_account.set_fasjson", new=Mock(return_value=True))
|
| |
+ @patch("toddlers.plugins.check_commit_rights._log.info")
|
| |
+ @patch("toddlers.utils.notify.send_email")
|
| |
+ @patch("toddlers.utils.fedora_account.get_group_member")
|
| |
+ def test_process_exclude_user(self, get_group_member, send_email, info, toddler):
|
| |
+ req_json = {
|
| |
+ "pagination": {
|
| |
+ "page": 1,
|
| |
+ "pages": 1,
|
| |
+ "per_page": 1,
|
| |
+ },
|
| |
+ "projects": [
|
| |
+ {
|
| |
+ "access_users": {
|
| |
+ "admin": ["admin_user", "packager_user"],
|
| |
+ "collaborator": ["collaborator_user"],
|
| |
+ "commit": ["commit_user"],
|
| |
+ "owner": ["owner_user"],
|
| |
+ },
|
| |
+ "fullname": "rpms/project_one",
|
| |
+ }
|
| |
+ ],
|
| |
+ }
|
| |
+
|
| |
+ req = Mock()
|
| |
+ req.ok = True
|
| |
+ req.json.return_value = req_json
|
| |
+ toddler.requests_session.get.return_value = req
|
| |
+
|
| |
+ get_group_member.return_value = ["packager_user"]
|
| |
+
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.check_commit_rights"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ config = {
|
| |
+ "exclude_users": "['admin_user']",
|
| |
+ "notify_emails": "[]",
|
| |
+ "admin_email": "foo@bar",
|
| |
+ "mail_server": "127.0.0.1",
|
| |
+ }
|
| |
+
|
| |
+ assert toddler.process(config=config, message=msg) is None
|
| |
+ info.assert_any_call(
|
| |
+ "### Found 3 users with commit privileges but not in packager group ###"
|
| |
+ )
|
| |
+ info.assert_any_call("collaborator_user")
|
| |
+ info.assert_any_call("commit_user")
|
| |
+ info.assert_any_call("owner_user")
|
| |
+ with pytest.raises(AssertionError):
|
| |
+ info.assert_any_call("admin_user")
|
| |
+ send_email.assert_called()
|
| |
+
|
| |
+ @patch("toddlers.utils.fedora_account.set_fasjson", new=Mock(return_value=True))
|
| |
+ @patch("toddlers.plugins.check_commit_rights._log.info")
|
| |
+ @patch("toddlers.utils.notify.send_email")
|
| |
+ @patch("toddlers.utils.fedora_account.get_group_member")
|
| |
+ def test_process_no_result(self, get_group_member, send_email, info, toddler):
|
| |
+ req_json = {
|
| |
+ "pagination": {
|
| |
+ "page": 1,
|
| |
+ "pages": 1,
|
| |
+ "per_page": 1,
|
| |
+ },
|
| |
+ "projects": [
|
| |
+ {
|
| |
+ "access_users": {
|
| |
+ "admin": ["packager_user"],
|
| |
+ "collaborator": [],
|
| |
+ "commit": [],
|
| |
+ "owner": ["packager_user"],
|
| |
+ },
|
| |
+ "fullname": "rpms/project_one",
|
| |
+ }
|
| |
+ ],
|
| |
+ }
|
| |
+
|
| |
+ req = Mock()
|
| |
+ req.ok = True
|
| |
+ req.json.return_value = req_json
|
| |
+ toddler.requests_session.get.return_value = req
|
| |
+
|
| |
+ get_group_member.return_value = ["packager_user"]
|
| |
+
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.check_commit_rights"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ config = {
|
| |
+ "exclude_users": "[]",
|
| |
+ "notify_emails": "[]",
|
| |
+ }
|
| |
+
|
| |
+ assert toddler.process(config=config, message=msg) is None
|
| |
+ info.assert_any_call(
|
| |
+ "### Found 0 users with commit privileges but not in packager group ###"
|
| |
+ )
|
| |
+ send_email.assert_not_called()
|
| |
+
|
| |
+ def test_main_no_args(self, capsys):
|
| |
+ with pytest.raises(SystemExit):
|
| |
+ toddlers.plugins.check_commit_rights.main([])
|
| |
+
|
| |
+ out, err = capsys.readouterr()
|
| |
+ assert out == ""
|
| |
+ # Expecting something along these lines, but don't make the test too tight:
|
| |
+ #
|
| |
+ # usage: pytest [-h] [--dry-run] [-q | --debug] conf [username]
|
| |
+ # pytest: error: the following arguments are required: conf
|
| |
+ assert err.startswith("usage:")
|
| |
+ assert "error: the following arguments are required:" in err
|
| |
+
|
| |
+ @patch("toml.load", new=Mock(return_value={}))
|
| |
+ def test_main_no_exclude_users(self, capsys):
|
| |
+ with pytest.raises(
|
| |
+ Exception,
|
| |
+ match=r"Invalid toddler configuration, no `exclude_users` defined",
|
| |
+ ):
|
| |
+ toddlers.plugins.check_commit_rights.main(["test.cfg"])
|
| |
+ out, err = capsys.readouterr()
|
| |
+ assert out == ""
|
| |
+ assert err == ""
|
| |
Following the discussion [¹] on devel mailing list, I wrote this toddler that searches for users which don't belong to the
packager
group, but have some sort of commit rights on src.fp.o projects.It can be scheduled to run on regular bases and it will notify some email addresses of the results (if any).
Signed-off-by: Mattia Verga mattia.verga@proton.me
[¹] https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/WT3UVVVPPT5NUJAC3TYT4MQMSSL3DNKT/