"""Unit tests for src/scripts/search-bugzilla-bugs.py"""
import json
import os
import subprocess
import sys
import tempfile
import unittest
from pathlib import Path
from textwrap import dedent
ROOT_DIR = Path(__file__).resolve().parents[2]
SCRIPT = ROOT_DIR / "src" / "scripts" / "search-bugzilla-bugs.py"
class TestSearchBugzillaBugs(unittest.TestCase):
def _run_script(self, payload, mock_module_dir):
env = os.environ.copy()
env["PYTHONPATH"] = mock_module_dir + os.pathsep + env.get("PYTHONPATH", "")
return subprocess.run(
[sys.executable, str(SCRIPT)],
input=json.dumps(payload),
text=True,
capture_output=True,
check=False,
env=env,
)
def _write_mock_bugzilla(self, directory, bugs=None, raise_on_query=False):
bugs = bugs or []
bug_literals = ", ".join(
f"MockBug({bug['id']!r}, {bug['summary']!r}, {bug['status']!r})"
for bug in bugs
)
query_body = (
"raise RuntimeError('query failed')"
if raise_on_query
else f"return [{bug_literals}]"
)
(Path(directory) / "bugzilla.py").write_text(
dedent(
f"""
class MockBug:
def __init__(self, id, summary, status):
self.id = id
self.summary = summary
self.status = status
class Bugzilla:
def __init__(self, url, api_key=None):
self.url = url
self.api_key = api_key
def build_query(self, **kwargs):
return kwargs
def query(self, query):
{query_body}
"""
),
encoding="utf-8",
)
def test_returns_matching_bugs(self):
with tempfile.TemporaryDirectory() as tmp:
bugs = [
{"id": 111, "summary": "Storage failed", "status": "NEW"},
{"id": 222, "summary": "Network failed", "status": "ASSIGNED"},
]
self._write_mock_bugzilla(tmp, bugs)
result = self._run_script(
{
"api_key": "key",
"product": "Fedora",
"summary": "Storage failed",
"component": "anaconda-webui",
"limit": 5,
},
tmp,
)
self.assertEqual(result.returncode, 0, result.stderr)
data = json.loads(result.stdout)
self.assertEqual(len(data["bugs"]), 2)
self.assertEqual(data["bugs"][0]["id"], 111)
self.assertEqual(data["bugs"][0]["status"], "NEW")
self.assertEqual(
data["bugs"][0]["url"],
"https://bugzilla.redhat.com/show_bug.cgi?id=111",
)
self.assertEqual(data["bugs"][1]["id"], 222)
def test_returns_empty_list_when_no_matches(self):
with tempfile.TemporaryDirectory() as tmp:
self._write_mock_bugzilla(tmp, [])
result = self._run_script(
{
"api_key": "key",
"product": "Fedora",
"summary": "no matches",
},
tmp,
)
self.assertEqual(result.returncode, 0, result.stderr)
data = json.loads(result.stdout)
self.assertEqual(data["bugs"], [])
def test_returns_empty_list_on_query_error(self):
with tempfile.TemporaryDirectory() as tmp:
self._write_mock_bugzilla(tmp, raise_on_query=True)
result = self._run_script(
{
"api_key": "key",
"product": "Fedora",
"summary": "anything",
},
tmp,
)
self.assertEqual(result.returncode, 0, result.stderr)
data = json.loads(result.stdout)
self.assertEqual(data["bugs"], [])
self.assertIn("error", data)
if __name__ == "__main__":
unittest.main()