toddlers/tests/plugins/test_flag_commit_build.py
Nils Philippsen 7fe0937190 Using real objects is considered polite
Previously, ToddlerBase and derived classes were used directly, but none
of the methods is marked as a class or static method. Amazingly enough,
it worked regardless. It's useful to have a constructor, though, so do
things conventionally.

As we can't just monkey-patch the classes then, use the shared `toddler`
fixture which creates the object for the test methods that need it.

Signed-off-by: Nils Philippsen <nils@redhat.com>
2020-07-17 17:39:28 +02:00

297 lines
11 KiB
Python

import logging
from unittest.mock import MagicMock, Mock, patch
import fedora_messaging.api
import pytest
from toddlers.plugins.flag_commit_build import FlagCommitBuild
class TestFlagCommitBuildToddler:
toddler_cls = FlagCommitBuild
def test_accepts_topic_invalid(self, toddler):
assert toddler.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, toddler, topic):
assert toddler.accepts_topic(topic)
def test_process_containerbuild(self, toddler, 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 toddler.process(config={}, message=msg) is None
assert caplog.records[-1].message == "Skipping container build"
def test_process_mbs_build(self, toddler, 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 toddler.process(config={}, message=msg) is None
assert caplog.records[-1].message == "Skipping MBS builds"
def test_process_secondary_instance(self, toddler, 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 toddler.process(config={}, message=msg) is None
assert caplog.records[-1].message == "Ignoring secondary arch task..."
def test_process_uninteresting_status(self, toddler, 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 toddler.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, toddler, 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 toddler.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, toddler, 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 toddler.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, toddler, 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 toddler.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, toddler, 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 toddler.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, toddler, 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 toddler.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, toddler, 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 toddler.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"
)