🏡 index : quine-global/quine-anaconda-webui.git

#!/usr/bin/python3
#
# Copyright (C) 2025 Red Hat, Inc.
# SPDX-License-Identifier: LGPL-2.1-or-later

"""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()