1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
import itertools
import os
import sys
import json
import textwrap
from types import SimpleNamespace
from unittest.mock import patch
import pytest
from pkgcore.ebuild.atom import atom
from pkgcore.test.misc import FakePkg
from pkgdev.scripts import pkgdev_bugs as bugs
from snakeoil.formatters import PlainTextFormatter
from snakeoil.osutils import pjoin
def mk_pkg(repo, cpvstr, maintainers, **kwargs):
kwargs.setdefault("KEYWORDS", ["~amd64"])
pkgdir = os.path.dirname(repo.create_ebuild(cpvstr, **kwargs))
# stub metadata
with open(pjoin(pkgdir, "metadata.xml"), "w") as f:
f.write(
textwrap.dedent(
f"""\
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="person">
{' '.join(f'<email>{maintainer}@gentoo.org</email>' for maintainer in maintainers)}
</maintainer>
</pkgmetadata>
"""
)
)
def mk_repo(repo):
mk_pkg(repo, "cat/u-0", ["dev1"])
mk_pkg(repo, "cat/z-0", [], RDEPEND=["cat/u", "cat/x"])
mk_pkg(repo, "cat/v-0", ["dev2"], RDEPEND="cat/x")
mk_pkg(repo, "cat/y-0", ["dev1"], RDEPEND=["cat/z", "cat/v"])
mk_pkg(repo, "cat/x-0", ["dev3"], RDEPEND="cat/y")
mk_pkg(repo, "cat/w-0", ["dev3"], RDEPEND="cat/x")
class BugsSession:
def __init__(self):
self.counter = iter(itertools.count(1))
self.calls = []
def __enter__(self):
return self
def __exit__(self, *_args):
...
def read(self):
return json.dumps({"id": next(self.counter)}).encode("utf-8")
def __call__(self, request, *_args, **_kwargs):
self.calls.append(json.loads(request.data))
return self
class TestBugFiling:
def test_bug_filing(self, repo):
mk_repo(repo)
session = BugsSession()
pkg = max(repo.itermatch(atom("=cat/u-0")))
with patch("pkgdev.scripts.pkgdev_bugs.urllib.urlopen", session):
bugs.GraphNode(((pkg, {"*"}),)).file_bug("API", frozenset(), ())
assert len(session.calls) == 1
call = session.calls[0]
assert call["Bugzilla_api_key"] == "API"
assert call["summary"] == "cat/u-0: stablereq"
assert call["assigned_to"] == "dev1@gentoo.org"
assert not call["cc"]
assert call["cf_stabilisation_atoms"] == "=cat/u-0 *"
assert not call["depends_on"]
def test_bug_filing_maintainer_needed(self, repo):
mk_repo(repo)
session = BugsSession()
pkg = max(repo.itermatch(atom("=cat/z-0")))
with patch("pkgdev.scripts.pkgdev_bugs.urllib.urlopen", session):
bugs.GraphNode(((pkg, {"*"}),)).file_bug("API", frozenset(), ())
assert len(session.calls) == 1
call = session.calls[0]
assert call["assigned_to"] == "maintainer-needed@gentoo.org"
assert not call["cc"]
def test_bug_filing_multiple_pkgs(self, repo):
mk_repo(repo)
session = BugsSession()
pkgX = max(repo.itermatch(atom("=cat/x-0")))
pkgY = max(repo.itermatch(atom("=cat/y-0")))
pkgZ = max(repo.itermatch(atom("=cat/z-0")))
dep = bugs.GraphNode((), 2)
node = bugs.GraphNode(((pkgX, {"*"}), (pkgY, {"*"}), (pkgZ, {"*"})))
node.edges.add(dep)
with patch("pkgdev.scripts.pkgdev_bugs.urllib.urlopen", session):
node.file_bug("API", frozenset(), ())
assert len(session.calls) == 1
call = session.calls[0]
assert call["summary"] == "cat/x-0, cat/y-0, cat/z-0: stablereq"
assert call["assigned_to"] == "dev3@gentoo.org"
assert call["cc"] == ["dev1@gentoo.org"]
assert call["cf_stabilisation_atoms"] == "=cat/x-0 *\n=cat/y-0 *\n=cat/z-0 *"
assert call["depends_on"] == [2]
|