toddlers/tests/plugins/test_pdc_import_compose.py
Michal Konečný d9c03e08ce Fix formatting for for black > 23
Signed-off-by: Michal Konečný <mkonecny@redhat.com>
2023-02-03 14:33:39 +01:00

1017 lines
37 KiB
Python

import logging
from unittest.mock import ANY, call, MagicMock, Mock, patch
import beanbag.bbexcept
import fedora_messaging.api
import pytest
import toddlers.plugins.pdc_import_compose
APACHE_FILE_LIST = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Index of /compose/rawhide/Fedora-Rawhide-20200715.n.2/compose/metadata</title>
</head>
<body>
<h1>Index of /compose/rawhide/Fedora-Rawhide-20200715.n.2/compose/metadata</h1>
<pre><img src="/icons/blank.gif" alt="Icon "> <a href="?C=N;O=D">Name</a> <a href="?C=M;O=A">Last modified</a> <a href="?C=S;O=A">Size</a> <a href="?C=D;O=A">Description</a>
<hr><img src="/icons/back.gif" alt="[PARENTDIR]"> <a href="/compose/rawhide/Fedora-Rawhide-20200715.n.2/compose/">Parent Directory</a> -
<img src="/icons/unknown.gif" alt="[ ]"> <a href="composeinfo.json">composeinfo.json</a> 2020-07-16 03:40 15K
<img src="/icons/unknown.gif" alt="[ ]"> <a href="images.json">images.json</a> 2020-07-16 03:40 39K
<img src="/icons/unknown.gif" alt="[ ]"> <a href="modules.json">modules.json</a> 2020-07-16 00:42 1.4M
<img src="/icons/unknown.gif" alt="[ ]"> <a href="rpms.json">rpms.json</a> 2020-07-16 00:17 168M
<img src="/icons/unknown.gif" alt="[ ]"> <a>invalid</a> 2020-07-16 00:18 0M
<hr></pre>
</body></html>
""" # noqa: E501
class TestPDCImportComposeToddler:
toddler_cls = toddlers.plugins.pdc_import_compose.PDCImportCompose
def test_accepts_topic_invalid(self, toddler):
assert toddler.accepts_topic("foo.bar") is False
@pytest.mark.parametrize(
"topic",
[
"org.fedoraproject.*.toddlers.trigger.pdc_import_compose",
"org.fedoraproject.prod.toddlers.trigger.pdc_import_compose",
"org.fedoraproject.stg.toddlers.trigger.pdc_import_compose",
"org.fedoraproject.*.pungi.compose.status.change",
"org.fedoraproject.prod.pungi.compose.status.change",
"org.fedoraproject.stg.pungi.compose.status.change",
],
)
def test_accepts_topic_valid(self, topic, toddler):
assert toddler.accepts_topic(topic)
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._process_all_composes")
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
def test_process_full_dist_git(self, pdc, process_dg, toddler):
client = Mock()
pdc.return_value = client
msg = fedora_messaging.api.Message()
msg.id = 123
msg.topic = "org.fedoraproject.prod.toddlers.trigger.pdc_retired_packages"
msg.body = {}
toddler.process({"config": "foobar"}, msg)
process_dg.assert_called_once_with({"config": "foobar"}, client)
@patch(
"toddlers.plugins.pdc_import_compose.PDCImportCompose._process_single_compose"
)
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
def test_process_single_package(self, pdc, process_dg, toddler):
client = Mock()
pdc.return_value = client
msg = fedora_messaging.api.Message()
msg.id = 123
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
msg.body = {}
toddler.process({"config": "foobar"}, msg)
process_dg.assert_called_once_with({"config": "foobar"}, client, msg)
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
@patch("toddlers.plugins.pdc_import_compose._old_composes")
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
def test__process_all_composes(self, pdc, old_composes, import_compose, toddler):
client = Mock()
pdc.return_value = client
old_composes.return_value = [
("branch", 42, "https://kojipkgs.../42"),
("branch", 123, "https://kojipkgs.../123"),
]
msg = fedora_messaging.api.Message()
msg.id = 123
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
msg.body = {}
toddler._process_all_composes(
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"}, client
)
old_composes.assert_called_once_with(
"https://kojipkgs.fedoraproject.org/compose/"
)
import_compose.assert_has_calls(
calls=[
call(client, 42, "https://kojipkgs.../42"),
call(client, 123, "https://kojipkgs.../123"),
]
)
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
@patch("toddlers.plugins.pdc_import_compose._old_composes")
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
def test__process_all_composes_fail(
self, pdc, old_composes, import_compose, caplog, toddler
):
caplog.set_level(logging.DEBUG)
client = Mock()
pdc.return_value = client
import_compose.side_effect = Exception("A generic error")
old_composes.return_value = [
("branch", 42, "https://kojipkgs.../42"),
("branch", 123, "https://kojipkgs.../123"),
]
msg = fedora_messaging.api.Message()
msg.id = 123
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
msg.body = {}
toddler._process_all_composes(
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"}, client
)
old_composes.assert_called_once_with(
"https://kojipkgs.fedoraproject.org/compose/"
)
import_compose.assert_has_calls(
calls=[
call(client, 42, "https://kojipkgs.../42"),
call(client, 123, "https://kojipkgs.../123"),
]
)
assert len(caplog.records) == 3
assert (
caplog.records[-1].message == "Failed to import 'https://kojipkgs.../123'"
)
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
@patch("toddlers.plugins.pdc_import_compose._old_composes")
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
def test__process_all_composes_fail_request(
self, pdc, old_composes, import_compose, caplog, toddler
):
caplog.set_level(logging.DEBUG)
client = Mock()
pdc.return_value = client
response = Mock()
response.url = "https://kojipkgs/..../42"
response.text = "AHAH"
error = beanbag.bbexcept.BeanBagException(
response, msg="Failed to query resource"
)
import_compose.side_effect = error
old_composes.return_value = [
("branch", 42, "https://kojipkgs.../42"),
("branch", 123, "https://kojipkgs.../123"),
]
msg = fedora_messaging.api.Message()
msg.id = 123
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
msg.body = {}
toddler._process_all_composes(
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"}, client
)
old_composes.assert_called_once_with(
"https://kojipkgs.fedoraproject.org/compose/"
)
import_compose.assert_has_calls(
calls=[
call(client, 42, "https://kojipkgs.../42"),
call(client, 123, "https://kojipkgs.../123"),
]
)
assert len(caplog.records) == 9
assert caplog.records[-3].message == "Failed to query resource"
assert caplog.records[-2].message == "https://kojipkgs/..../42"
assert caplog.records[-1].message == "AHAH"
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
def test__process_single_compose_invalid_status(
self, pdc, import_compose, caplog, toddler
):
caplog.set_level(logging.INFO)
client = Mock()
pdc.return_value = client
msg = fedora_messaging.api.Message()
msg.id = 123
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
msg.body = {"status": "INVALID"}
toddler._process_single_compose(
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"},
pdc,
msg,
)
import_compose.assert_not_called()
assert len(caplog.records) == 1
assert (
caplog.records[-1].message
== "The compose that finished isn't in a state we care: INVALID, bailing"
)
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
def test__process_single_compose_invalid_location(
self, pdc, import_compose, caplog, toddler
):
caplog.set_level(logging.INFO)
client = Mock()
pdc.return_value = client
msg = fedora_messaging.api.Message()
msg.id = 123
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
msg.body = {
"status": "FINISHED",
"compose_id": 42,
"location": "/mnt/koji/compose/rawhide/42/compose",
}
toddler._process_single_compose(
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"},
pdc,
msg,
)
import_compose.assert_not_called()
assert len(caplog.records) == 1
assert (
caplog.records[-1].message
== "The compose: 42 has nt/koji/compose/rawhide/42 for location while it must "
"be an actual url for us to deal with it, bailing"
)
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
def test__process_single_compose(self, pdc, import_compose, toddler):
client = Mock()
pdc.return_value = client
msg = fedora_messaging.api.Message()
msg.id = 123
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
msg.body = {
"status": "FINISHED",
"compose_id": 42,
"location": "http://kojipkgs.fedoraproject.org/compose/rawhide/42/compose",
}
toddler._process_single_compose(
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"},
pdc,
msg,
)
import_compose.assert_called_once_with(
pdc, 42, "http://kojipkgs.fedoraproject.org/compose/rawhide/42"
)
def test__import_compose_failed_to_retrieve_composeinfo(self, caplog, toddler):
caplog.set_level(logging.INFO)
req = Mock()
resp = Mock()
resp.ok = False
resp.status_code = 404
req.get.return_value = resp
toddler.requests_session.get.return_value = resp
toddler._import_compose(
Mock(),
"Fedora-Rawhide-20200715.n.2",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
)
assert len(caplog.records) == 1
assert (
caplog.records[-1].message
== "Failed to get https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata/composeinfo.json: 404"
)
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
def test__import_compose_compose_exists(self, compose_exists, caplog, toddler):
caplog.set_level(logging.INFO)
req = Mock()
resp = Mock()
resp.ok = True
resp.json.return_value = {
"payload": {"compose": {"id": "Fedora-Rawhide-20200715.n.2"}}
}
req.get.return_value = resp
toddler.requests_session = req
compose_exists.return_value = True
toddler._import_compose(
Mock(),
"Fedora-Rawhide-20200715.n.2",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
)
assert len(caplog.records) == 2
assert (
caplog.records[-1].message
== "'Fedora-Rawhide-20200715.n.2' already exists in PDC."
)
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
def test__import_compose_failed_to_retrieve_images(
self, compose_exists, caplog, toddler
):
caplog.set_level(logging.INFO)
req = Mock()
resp_composeinfo = Mock()
resp_composeinfo.ok = True
resp_composeinfo.json.return_value = {
"payload": {"compose": {"id": "Fedora-Rawhide-20200715.n.2"}}
}
resp_images = Mock()
resp_images.ok = False
resp_images.status_code = 404
req.get.side_effect = (resp_composeinfo, resp_images)
toddler.requests_session = req
compose_exists.return_value = False
toddler._import_compose(
Mock(),
"Fedora-Rawhide-20200715.n.2",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
)
assert len(caplog.records) == 2
assert (
caplog.records[-1].message
== "Failed to get https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata/images.json: 404"
)
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
def test__import_compose_failed_to_retrieve_rpms(
self, compose_exists, caplog, toddler
):
caplog.set_level(logging.INFO)
req = Mock()
resp_composeinfo = Mock()
resp_composeinfo.ok = True
resp_composeinfo.json.return_value = {
"payload": {"compose": {"id": "Fedora-Rawhide-20200715.n.2"}}
}
resp_images = Mock()
resp_images.ok = True
resp_images.json.return_value = {"foor": "bar"}
resp_rpms = Mock()
resp_rpms.ok = False
resp_rpms.status_code = 500
req.get.side_effect = (resp_composeinfo, resp_images, resp_rpms)
toddler.requests_session = req
compose_exists.return_value = False
toddler._import_compose(
Mock(),
"Fedora-Rawhide-20200715.n.2",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
)
assert len(caplog.records) == 2
assert (
caplog.records[-1].message
== "Failed to get https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata/rpms.json: 500"
)
@patch("toddlers.plugins.pdc_import_compose.ensure_release_exists")
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
def test__import_compose(
self, compose_exists, ensure_release_exists, caplog, toddler
):
caplog.set_level(logging.INFO)
req = Mock()
resp_composeinfo = Mock()
resp_composeinfo.ok = True
resp_composeinfo.json.return_value = {
"payload": {
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
"release": {
"internal": False,
"name": "Fedora",
"short": "Fedora",
"type": "ga",
"version": "Rawhide",
},
}
}
resp_images = Mock()
resp_images.ok = True
resp_images.json.return_value = {"foor": "bar"}
resp_rpms = Mock()
resp_rpms.ok = True
resp_rpms.json.return_value = {"foo": "bar"}
req.get.side_effect = (resp_composeinfo, resp_images, resp_rpms)
toddler.requests_session = req
compose_exists.return_value = False
pdc = MagicMock()
toddler._import_compose(
pdc,
"Fedora-Rawhide-20200715.n.2",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
)
ensure_release_exists.assert_called_once_with(
pdc,
"fedora-Rawhide",
{
"name": "Fedora",
"short": "fedora",
"version": "Rawhide",
"release_type": "ga",
},
)
# They are not actually called twice, this is a side-effect of using Mock/MagicMock
pdc["compose-images"]._.assert_has_calls(
calls=[
call(
{
"release_id": "fedora-Rawhide",
"composeinfo": {
"payload": {
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
"release": {
"internal": False,
"name": "Fedora",
"short": "fedora",
"type": "ga",
"version": "Rawhide",
},
}
},
"image_manifest": {"foor": "bar"},
}
),
call(
{
"release_id": "fedora-Rawhide",
"composeinfo": {
"payload": {
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
"release": {
"internal": False,
"name": "Fedora",
"short": "fedora",
"type": "ga",
"version": "Rawhide",
},
}
},
"rpm_manifest": {"foo": "bar"},
}
),
]
)
pdc["compose-rpms"]._.assert_has_calls(
calls=[
call(
{
"release_id": "fedora-Rawhide",
"composeinfo": {
"payload": {
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
"release": {
"internal": False,
"name": "Fedora",
"short": "fedora",
"type": "ga",
"version": "Rawhide",
},
}
},
"image_manifest": {"foor": "bar"},
}
),
call(
{
"release_id": "fedora-Rawhide",
"composeinfo": {
"payload": {
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
"release": {
"internal": False,
"name": "Fedora",
"short": "fedora",
"type": "ga",
"version": "Rawhide",
},
}
},
"rpm_manifest": {"foo": "bar"},
}
),
]
)
assert len(caplog.records) == 2
assert (
caplog.records[-2].message
== "Importing compose 'Fedora-Rawhide-20200715.n.2'"
)
assert caplog.records[-1].message == "Import done."
@patch("toddlers.plugins.pdc_import_compose.ensure_release_exists")
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
def test__import_compose_no_rpms(
self, compose_exists, ensure_release_exists, caplog, toddler
):
caplog.set_level(logging.INFO)
req = Mock()
resp_composeinfo = Mock()
resp_composeinfo.ok = True
resp_composeinfo.json.return_value = {
"payload": {
"compose": {"id": "Fedora-32-20200715.n.2"},
"release": {
"internal": False,
"name": "Fedora",
"short": "Fedora",
"type": "updates-testing",
"version": "32",
},
}
}
resp_images = Mock()
resp_images.ok = True
resp_images.json.return_value = {"foor": "bar"}
resp_rpms = Mock()
resp_rpms.ok = False
resp_rpms.status_code = 404
req.get.side_effect = (resp_composeinfo, resp_images, resp_rpms)
toddler.requests_session = req
compose_exists.return_value = False
pdc = MagicMock()
toddler._import_compose(
pdc,
"Fedora-32-20200715.n.2",
"https://kojipkgs.fedoraproject.org/compose/32/Fedora-32-20200715.n.2",
)
ensure_release_exists.assert_called_once_with(
pdc,
"fedora-32-updates-testing",
{
"name": "Fedora",
"short": "fedora",
"version": "32",
"release_type": "updates-testing",
},
)
pdc["compose-images"]._.assert_called_once_with(
{
"release_id": "fedora-32-updates-testing",
"composeinfo": {
"payload": {
"compose": {"id": "Fedora-32-20200715.n.2"},
"release": {
"internal": False,
"name": "Fedora",
"short": "fedora",
"type": "updates-testing",
"version": "32",
},
}
},
"image_manifest": {"foor": "bar"},
}
)
# It's not actually called, this is a side-effect of using Mock/MagicMock
pdc["compose-rpms"]._.assert_called_once_with(
{
"release_id": "fedora-32-updates-testing",
"composeinfo": {
"payload": {
"compose": {"id": "Fedora-32-20200715.n.2"},
"release": {
"internal": False,
"name": "Fedora",
"short": "fedora",
"type": "updates-testing",
"version": "32",
},
}
},
"image_manifest": {"foor": "bar"},
}
)
assert len(caplog.records) == 3
assert (
caplog.records[-2].message
== "Found no rpms.json file at 'https://kojipkgs.fedoraproject.org/compose/"
"32/Fedora-32-20200715.n.2/compose/metadata/rpms.json'"
)
assert caplog.records[-1].message == "Import done."
def test__scrape_links_failed(self, caplog):
caplog.set_level(logging.DEBUG)
session = Mock()
resp = Mock()
resp.ok = False
resp.status_code = 500
session.get.return_value = resp
output = list(
toddlers.plugins.pdc_import_compose._scrape_links(
session=session,
url="https://kojipkgs.fedoraproject.org/..",
)
)
assert (
caplog.records[-1].message
== "Couldn't talk to 'https://kojipkgs.fedoraproject.org/..', 500"
)
assert output == []
def test__scrape_links(self, caplog):
caplog.set_level(logging.DEBUG)
session = Mock()
resp = Mock()
resp.ok = True
resp.text = APACHE_FILE_LIST
session.get.return_value = resp
output = list(
toddlers.plugins.pdc_import_compose._scrape_links(
session=session,
url="https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata",
)
)
assert (
caplog.records[-1].message
== "Scraping https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata"
)
assert output == [
(
"Parent Directory",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose",
),
(
"composeinfo.json",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata/composeinfo.json",
),
(
"images.json",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata/images.json",
),
(
"modules.json",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata/modules.json",
),
(
"rpms.json",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/compose/metadata/rpms.json",
),
]
@patch("toddlers.plugins.pdc_import_compose._scrape_links")
@patch("toddlers.plugins.pdc_import_compose.make_session")
def test__old_composes(self, make_sess, scrape_links, caplog):
caplog.set_level(logging.DEBUG)
scrape_links.side_effect = (
(
["F31", "https://kojipkgs.fedoraproject.org/compose/F31"],
["F32", "https://kojipkgs.fedoraproject.org/compose/F32"],
["rawhide", "https://kojipkgs.fedoraproject.org/compose/rawhide"],
),
(
[
"Parent Directory",
"https://kojipkgs.fedoraproject.org/compose/F31/",
],
[
"Fedora-31-20190715.n.1/",
"https://kojipkgs.fedoraproject.org/compose/F31/Fedora-31-20190715.n.1/",
],
),
(
[
"Parent Directory",
"https://kojipkgs.fedoraproject.org/compose/F32/",
],
[
"Fedora-Rawhide-20200715.n.1/",
"https://kojipkgs.fedoraproject.org/compose/F32/Fedora-32-20200715.n.1/",
],
[
"Fedora-Rawhide-20200715.n.2/",
"https://kojipkgs.fedoraproject.org/compose/F32/Fedora-32-20200715.n.2/",
],
),
(
[
"Parent Directory",
"https://kojipkgs.fedoraproject.org/compose/rawhide/",
],
[
"Fedora-Rawhide-20200715.n.1",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.1/",
],
[
"Fedora-Rawhide-20200715.n.2",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
"Rawhide-20200715.n.2/",
],
[
"latest-Fedora-Rawhide",
"https://kojipkgs.fedoraproject.org/compose/rawhide/latest-Fedora-Rawhide/",
],
),
)
req = Mock()
resp = Mock()
resp.ok = True
resp.text = "FINISHED"
resp_not_ok = Mock()
resp_not_ok.ok = False
resp_not_done = Mock()
resp_not_done.ok = True
resp_not_done.text = "ONGOING"
req.get.side_effect = (
resp, # F31
resp_not_ok,
resp,
resp, # F32
resp_not_ok,
resp,
resp_not_done, # rawhide
)
req.head.side_effect = (
resp,
resp_not_ok,
resp,
resp,
resp,
resp, # F31
resp,
resp,
resp,
resp,
resp,
resp,
resp,
resp,
resp, # F32
resp,
resp,
resp,
resp,
resp,
resp,
resp,
resp,
resp, # rawhide
)
make_sess.return_value = req
output = list(
toddlers.plugins.pdc_import_compose._old_composes(
"https://kojipkgs.fedoraproject.org/compose/"
)
)
assert output == [
(
"F31",
"Fedora-31-20190715.n.1/",
"https://kojipkgs.fedoraproject.org/compose/F31/Fedora-31-20190715.n.1/",
),
(
"F32",
"Fedora-Rawhide-20200715.n.1/",
"https://kojipkgs.fedoraproject.org/compose/F32/Fedora-32-20200715.n.1/",
),
(
"F32",
"Fedora-Rawhide-20200715.n.2/",
"https://kojipkgs.fedoraproject.org/compose/F32/Fedora-32-20200715.n.2/",
),
(
"rawhide",
"Fedora-Rawhide-20200715.n.1",
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.1/",
),
]
assert (
"Looking for old composes at: https://kojipkgs.fedoraproject.org/compose/"
in caplog.text
)
assert (
"Skipping https://kojipkgs.fedoraproject.org/compose/rawhide/"
"latest-Fedora-Rawhide/. Just a symlink." in caplog.text
)
assert (
"Bailing, could not retrieve the STATUS file at: "
"https://kojipkgs.fedoraproject.org/compose/F32/" in caplog.text
)
assert (
"Bailing, STATUS is not final at: "
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2/"
in caplog.text
)
assert (
"Bailing, could not retrieve the STATUS file at: "
"https://kojipkgs.fedoraproject.org/compose/rawhide/" in caplog.text
)
def test_compose_exists_failed(self, caplog):
caplog.set_level(logging.DEBUG)
pdc = MagicMock()
resp = Mock()
resp.status_code = 500
pdc["composes"]["compose-id"]._.side_effect = beanbag.bbexcept.BeanBagException(
msg="Failed to do something", response=resp
)
assert (
toddlers.plugins.pdc_import_compose.compose_exists(pdc, "compose-id")
is False
)
assert caplog.records[-1].message.startswith(
"Failed to check if the compose compose-id exists: Failed to do something - response:"
)
def test_compose_exists(self, caplog):
caplog.set_level(logging.DEBUG)
pdc = MagicMock()
resp = Mock()
resp.status_code = 200
assert (
toddlers.plugins.pdc_import_compose.compose_exists(pdc, "compose-id")
is True
)
def test_ensure_release_exists_failed(self, caplog):
caplog.set_level(logging.DEBUG)
pdc = MagicMock()
resp = Mock()
resp.status_code = 500
resp.text = "html content"
pdc["releases"]["release-id"]._.side_effect = beanbag.bbexcept.BeanBagException(
msg="Failed to do something", response=resp
)
toddlers.plugins.pdc_import_compose.ensure_release_exists(
pdc, "release-id", {"foo": "bar"}
)
assert caplog.records[-3].message.startswith(
"Failed to check if the release release-id exists: Failed to do something - response:"
)
assert caplog.records[-2].message.startswith("Failed to do something")
assert caplog.records[-1].message.startswith("html content")
def test_ensure_release_exists_create(self, caplog):
caplog.set_level(logging.DEBUG)
pdc = MagicMock()
resp = Mock()
resp.status_code = 404
pdc["releases"]["release-id"]._.side_effect = beanbag.bbexcept.BeanBagException(
msg="Failed to do something", response=resp
)
toddlers.plugins.pdc_import_compose.ensure_release_exists(
pdc, "release-id", {"foo": "bar"}
)
pdc["releases"]._.assert_called_once_with({"foo": "bar", "active": True})
assert (
caplog.records[-1].message
== "Creating release {'foo': 'bar', 'active': True}"
)
def test_ensure_release_exists_create_then_fail(self, caplog):
caplog.set_level(logging.DEBUG)
pdc = MagicMock()
resp = Mock()
resp.status_code = 404
resp.text = "html content"
pdc["releases"]["release-id"]._.side_effect = beanbag.bbexcept.BeanBagException(
msg="Failed to do something", response=resp
)
pdc["releases"]._.side_effect = beanbag.bbexcept.BeanBagException(
msg="Failed to create the release", response=resp
)
with pytest.raises(
beanbag.bbexcept.BeanBagException,
match=r"Failed to create the release .*",
):
toddlers.plugins.pdc_import_compose.ensure_release_exists(
pdc, "release-id", {"foo": "bar"}
)
pdc["releases"]._.assert_called_once_with({"foo": "bar", "active": True})
assert caplog.records[-2].message.startswith("Failed to create the release")
assert caplog.records[-1].message.startswith("html content")
class TestPDCImportComposeToddlerCLI:
toddler_cls = toddlers.plugins.pdc_import_compose.PDCImportCompose
def test_main_no_args(self, capsys):
with pytest.raises(SystemExit):
toddlers.plugins.pdc_import_compose.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(
"toddlers.plugins.pdc_import_compose.PDCImportCompose._process_single_compose"
)
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
@patch("toml.load", new=Mock(return_value={}))
def test_main_debug(self, pdc, process_dg, msg_file, capsys):
client = Mock()
pdc.return_value = client
msg = fedora_messaging.api.Message()
msg.id = ANY
msg.topic = "toddlers.cli.pungi.compose.status.change"
msg.body = {
"status": "FINISHED",
"release_type": "ga",
"compose_label": "RC-1.2",
"compose_respin": 0,
"compose_date": "20201019",
"release_short": "Fedora",
"release_version": "33",
"location": "https://kojipkgs.fedoraproject.org/compose/33/"
"Fedora-33-20201019.0/compose",
"compose_type": "production",
"release_is_layered": False,
"release_name": "Fedora",
"compose_path": "/mnt/koji/compose/33/Fedora-33-20201019.0",
"compose_id": "Fedora-33-20201019.0",
}
toddlers.plugins.pdc_import_compose.main(["test.cfg", "--debug", msg_file])
process_dg.assert_called_once_with({}, client, msg)
out, err = capsys.readouterr()
assert out == ""
assert err == ""
@patch(
"toddlers.plugins.pdc_import_compose.PDCImportCompose._process_single_compose"
)
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
@patch("toml.load", new=Mock(return_value={}))
def test_main(self, pdc, process_dg, msg_file, capsys):
client = Mock()
pdc.return_value = client
msg = fedora_messaging.api.Message()
msg.id = ANY
msg.topic = "toddlers.cli.pungi.compose.status.change"
msg.body = {
"status": "FINISHED",
"release_type": "ga",
"compose_label": "RC-1.2",
"compose_respin": 0,
"compose_date": "20201019",
"release_short": "Fedora",
"release_version": "33",
"location": "https://kojipkgs.fedoraproject.org/compose/33/"
"Fedora-33-20201019.0/compose",
"compose_type": "production",
"release_is_layered": False,
"release_name": "Fedora",
"compose_path": "/mnt/koji/compose/33/Fedora-33-20201019.0",
"compose_id": "Fedora-33-20201019.0",
}
toddlers.plugins.pdc_import_compose.main(["test.cfg", msg_file])
process_dg.assert_called_once_with({}, client, msg)
out, err = capsys.readouterr()
assert out == ""
assert err == ""