import logging from unittest.mock import MagicMock, Mock, patch import fedora_messaging.api import pytest import toddlers.plugins.flag_commit_build class TestFlagCommitBuildToddler: def test_accepts_topic_invalid(self): assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.accepts_topic("foo.bar") is False ) @pytest.mark.parametrize( "topic", [ "org.fedoraproject.#.buildsys.build.state.change", "org.fedoraproject.stg.buildsys.build.state.change", "org.fedoraproject.prod.buildsys.build.state.change", ], ) def test_accepts_topic_valid(self, topic): assert toddlers.plugins.flag_commit_build.FlagCommitBuild.accepts_topic(topic) def test_process_containerbuild(self, caplog): caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = {"owner": "containerbuild"} assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config={}, message=msg ) is None ) assert caplog.records[-1].message == "Skipping container build" def test_process_mbs_build(self, caplog): caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = {"owner": "mbs/mbs.fedoraproject.org"} assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config={}, message=msg ) is None ) assert caplog.records[-1].message == "Skipping MBS builds" def test_process_secondary_instance(self, caplog): caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = { "owner": "username", "instance": "secondary", } assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config={}, message=msg ) is None ) assert caplog.records[-1].message == "Ignoring secondary arch task..." def test_process_uninteresting_status(self, caplog): caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = { "owner": "username", "instance": "primary", "new": 2, } assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config={}, message=msg ) is None ) assert ( caplog.records[-1].message == "Build is not in a state we care about, skipping" ) @patch("toddlers.plugins.flag_commit_build.koji") def test_process_no_git_url(self, mock_koji, caplog): client = Mock() client.getBuild = Mock(return_value={}) mock_koji.ClientSession = Mock(return_value=client) caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = { "owner": "username", "instance": "primary", "new": 1, "build_id": 42, } config = {"koji_url": "https://koji.fedoraproject.org"} assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config=config, message=msg ) is None ) assert ( caplog.records[-1].message == "No git url found in the extra information: None" ) @patch("toddlers.plugins.flag_commit_build.koji") def test_process_invalid_git_url(self, mock_koji, caplog): client = Mock() client.getBuild = Mock( return_value={"extra": {"source": {"original_url": "foobar"}}} ) mock_koji.ClientSession = Mock(return_value=client) caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = { "owner": "username", "instance": "primary", "new": 4, "build_id": 42, } config = {"koji_url": "https://koji.fedoraproject.org"} assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config=config, message=msg ) is None ) assert caplog.records[-1].message == "No # in the git_url: foobar" @patch("toddlers.plugins.flag_commit_build.requests_session") @patch("toddlers.plugins.flag_commit_build.koji") def test_process_flag_no_task_id(self, mock_koji, mock_requests, caplog): mock_requests.request.return_value = MagicMock( ok=False, status_code=401, text="invalid" ) client = Mock() client.getBuild = Mock( return_value={ "extra": { "source": { "original_url": "https://src.fedoraproject.org/rpms/" "guake.git#commit_hash123" } } } ) mock_koji.ClientSession = Mock(return_value=client) caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = { "owner": "username", "instance": "primary", "new": 3, "build_id": 42, "epoch": "0", "version": "1.0.0", "name": "guake", "release": "1", "task_id": None, } config = { "koji_url": "https://koji.fedoraproject.org", "pagure_url": "https://src.fedoraproject.org", "pagure_token": "ahah", } assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config=config, message=msg ) is None ) assert ( caplog.records[-1].message == "Request to https://src.fedoraproject.org returned: 401" ) @patch("toddlers.plugins.flag_commit_build.requests_session") @patch("toddlers.plugins.flag_commit_build.koji") def test_process_flag_failed(self, mock_koji, mock_requests, caplog): mock_requests.request.return_value = MagicMock( ok=False, status_code=401, text="invalid" ) client = Mock() client.getBuild = Mock( return_value={ "extra": { "source": { "original_url": "https://src.fedoraproject.org/rpms/" "guake.git#commit_hash123" } } } ) mock_koji.ClientSession = Mock(return_value=client) caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = { "owner": "username", "instance": "primary", "new": 3, "build_id": 42, "epoch": "0", "version": "1.0.0", "name": "guake", "release": "1", "task_id": 84, } config = { "koji_url": "https://koji.fedoraproject.org", "pagure_url": "https://src.fedoraproject.org", "pagure_token": "ahah", } assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config=config, message=msg ) is None ) assert ( caplog.records[-1].message == "Request to https://src.fedoraproject.org returned: 401" ) @patch("toddlers.plugins.flag_commit_build.requests_session") @patch("toddlers.plugins.flag_commit_build.koji") def test_process_flag_failed_cancel(self, mock_koji, mock_requests, caplog): mock_requests.request.return_value = MagicMock( ok=False, status_code=401, text="invalid" ) client = Mock() client.getBuild = Mock( return_value={ "extra": { "source": { "original_url": "https://src.fedoraproject.org/rpms/" "guake.git#commit_hash123" } } } ) mock_koji.ClientSession = Mock(return_value=client) caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = { "owner": "username", "instance": "primary", "new": 4, "build_id": 42, "epoch": "0", "version": "1.0.0", "name": "guake", "release": "1", "task_id": 84, } config = { "koji_url": "https://koji.fedoraproject.org", "pagure_url": "https://src.fedoraproject.org", "pagure_token": "ahah", } assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config=config, message=msg ) is None ) assert ( caplog.records[-1].message == "Request to https://src.fedoraproject.org returned: 401" ) @patch("toddlers.plugins.flag_commit_build.requests_session") @patch("toddlers.plugins.flag_commit_build.koji") def test_process_flag_pass(self, mock_koji, mock_requests, caplog): mock_requests.request.return_value = MagicMock( ok=True, status_code=200, text="woohoo!" ) client = Mock() client.getBuild = Mock( return_value={ "extra": { "source": { "original_url": "https://src.fedoraproject.org/rpms/" "guake.git#commit_hash123" } } } ) mock_koji.ClientSession = Mock(return_value=client) caplog.set_level(logging.INFO) msg = fedora_messaging.api.Message() msg.id = 123 msg.topic = "org.fedoraproject.prod.buildsys.build.state.change" msg.body = { "owner": "username", "instance": "primary", "new": 1, "build_id": 42, "version": "1.0.0", "name": "guake", "release": "1", "task_id": 84, } config = { "koji_url": "https://koji.fedoraproject.org", "pagure_url": "https://src.fedoraproject.org", "pagure_token": "ahah", } assert ( toddlers.plugins.flag_commit_build.FlagCommitBuild.process( config=config, message=msg ) is None ) assert ( caplog.records[-3].message == "Request to https://src.fedoraproject.org returned: 200" ) assert caplog.records[-2].message == "All clear" assert ( caplog.records[-1].message == "User-URL: https://src.fedoraproject.org/rpms/guake/c/commit_hash123" )