File: mockbackend.py

package info (click to toggle)
python-bugzilla 3.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,116 kB
  • sloc: python: 6,160; makefile: 7
file content (152 lines) | stat: -rw-r--r-- 4,661 bytes parent folder | download | duplicates (3)
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# This work is licensed under the GNU GPLv2 or later.
# See the COPYING file in the top-level directory.

import inspect

import bugzilla
from bugzilla._backendbase import _BackendBase

import tests.utils


# pylint: disable=abstract-method,arguments-differ


class BackendMock(_BackendBase):
    _version = None

    def bugzilla_version(self):
        return {"version": self._version}

    def __helper(self, args):
        # Grab the calling function name and use it to generate
        # input and output variable names for the class. So if this
        # is called from bug_get, we look for:
        #   self._bug_get_args
        #   self._bug_get_return
        prevfuncname = inspect.stack()[1][3]
        func_args = getattr(self, "_%s_args" % prevfuncname)
        func_return = getattr(self, "_%s_return" % prevfuncname)
        if isinstance(func_return, BaseException):
            raise func_return

        filename = None
        expect_out = func_args
        if isinstance(func_args, str):
            filename = func_args
            expect_out = None

        # Hack to strip out attachment content from the generated
        # test output, because it doesn't play well with the test
        # suite running on python2
        if "content-disposition" in str(args):
            largs = list(args)
            largs[1] = "STRIPPED-BY-TESTSUITE"
            args = tuple(largs)

        if filename or expect_out:
            tests.utils.diff_compare(args, filename, expect_out)

        if isinstance(func_return, dict):
            return func_return

        returnstr = open(tests.utils.tests_path(func_return)).read()
        return eval(returnstr)  # pylint: disable=eval-used

    def bug_attachment_create(self, *args):
        return self.__helper(args)
    def bug_attachment_get(self, *args):
        return self.__helper(args)
    def bug_attachment_get_all(self, *args):
        return self.__helper(args)
    def bug_attachment_update(self, *args):
        return self.__helper(args)

    def bug_comments(self, *args):
        return self.__helper(args)
    def bug_create(self, *args):
        return self.__helper(args)
    def bug_history(self, *args):
        return self.__helper(args)
    def bug_get(self, *args):
        return self.__helper(args)
    def bug_fields(self, *args):
        return self.__helper(args)
    def bug_search(self, *args):
        return self.__helper(args)
    def bug_update(self, *args):
        return self.__helper(args)
    def bug_update_tags(self, *args):
        return self.__helper(args)

    def component_create(self, *args):
        return self.__helper(args)
    def component_get(self, *args):
        return self.__helper(args)
    def component_update(self, *args):
        return self.__helper(args)

    def group_get(self, *args):
        return self.__helper(args)

    def externalbugs_add(self, *args):
        return self.__helper(args)
    def externalbugs_update(self, *args):
        return self.__helper(args)
    def externalbugs_remove(self, *args):
        return self.__helper(args)

    def product_get(self, *args):
        return self.__helper(args)
    def product_get_accessible(self, *args):
        return self.__helper(args)
    def product_get_enterable(self, *args):
        return self.__helper(args)
    def product_get_selectable(self, *args):
        return self.__helper(args)

    def user_create(self, *args):
        return self.__helper(args)
    def user_get(self, *args):
        return self.__helper(args)
    def user_login(self, *args):
        return self.__helper(args)
    def user_logout(self, *args):
        return self.__helper(args)
    def user_update(self, *args):
        return self.__helper(args)


def _make_backend_class(version="6.0.0", **kwargs):

    class TmpBackendClass(BackendMock):
        _version = version

    for key, val in kwargs.items():
        setattr(TmpBackendClass, "_%s" % key, val)

    return TmpBackendClass


def make_bz(bz_kwargs=None, rhbz=False, **kwargs):
    bz_kwargs = (bz_kwargs or {}).copy()
    if "url" in bz_kwargs:
        raise RuntimeError("Can't set 'url' in mock make_bz, use connect()")

    if "use_creds" not in bz_kwargs:
        bz_kwargs["use_creds"] = False

    bz = bugzilla.Bugzilla(url=None, **bz_kwargs)
    backendclass = _make_backend_class(**kwargs)

    def _get_backend_class(url):
        return backendclass, bugzilla.Bugzilla.fix_url(url)

    # pylint: disable=protected-access
    bz._get_backend_class = _get_backend_class

    url = "https:///TESTSUITEMOCK"
    if rhbz:
        url += "?fakeredhat=bugzilla.redhat.com"
    bz.connect(url)
    return bz