debian-koji/tests/test_builder/test_build_notification.py
Yuming Zhu ca05418fb5 unittest: use unittest.mock instead of mock
because the absence of unittest.mock on python2.7, we still fallback to
mock
2024-10-23 16:35:30 +00:00

112 lines
3.7 KiB
Python

from __future__ import absolute_import
import locale
import os
import tempfile
import time
import unittest
try:
from unittest import mock
except ImportError:
import mock
import shutil
import six
import koji
import koji.util
from .loadkojid import kojid
class MyClientSession(koji.ClientSession):
def __init__(self, *a, **kw):
super(MyClientSession, self).__init__(*a, **kw)
self._testcalls = {}
def load_calls(self, name):
fn = os.path.join(os.path.dirname(__file__), 'data/calls', name,'calls.json')
data = koji.load_json(fn)
for call in data:
key = self._munge([call['method'], call['args'], call['kwargs']])
self._testcalls[key] = call
def _callMethod(self, name, args, kwargs=None, retry=True):
if self.multicall:
raise Exception('multicall not supported')
key = self._munge([name, args, kwargs])
if key in self._testcalls:
return self._testcalls[key]['result']
else:
return mock.MagicMock()
def _munge(self, data):
def callback(value):
if isinstance(value, list):
return tuple(value)
elif isinstance(value, dict):
keys = sorted(value.keys())
return tuple([(k, value[k]) for k in keys])
else:
return value
walker = koji.util.DataWalker(data, callback)
return walker.walk()
class TestBuildNotification(unittest.TestCase):
def setUp(self):
self.maxDiff = None
self.original_timezone = os.environ.get('TZ')
os.environ['TZ'] = 'US/Eastern'
time.tzset()
self.tempdir = tempfile.mkdtemp()
self.SMTP = mock.patch('smtplib.SMTP').start()
self.session = mock.MagicMock()
self.options = mock.MagicMock()
self.options.topdir = self.tempdir
self.options.workdir = self.tempdir
def tearDown(self):
if self.original_timezone is None:
del os.environ['TZ']
else:
os.environ['TZ'] = self.original_timezone
time.tzset()
mock.patch.stopall()
shutil.rmtree(self.tempdir)
def test_build_notification(self):
# force locale to compare 'message' value
locale.setlocale(locale.LC_ALL, ('en_US', 'UTF-8'))
# task_info['id'], method, params, self.session, self.options
task_id = 999
fn = os.path.join(os.path.dirname(__file__), 'data/calls', 'build_notif_1', 'params.json')
kwargs = koji.load_json(fn)
self.session = MyClientSession('https://koji.example.com/kojihub')
self.session.load_calls('build_notif_1')
self.options.from_addr = "koji@example.com"
server = mock.MagicMock()
self.SMTP.return_value = server
# run it
handler = kojid.BuildNotificationTask(
task_id,
'buildNotification',
koji.encode_args(**kwargs),
self.session,
self.options)
ret = handler.run()
self.assertEqual(ret, "sent notification of build 612609 to: user@example.com")
# check sendmail args
from_addr, recipients, message = server.sendmail.call_args[0]
self.assertEqual(from_addr, "koji@example.com")
self.assertEqual(recipients, ["user@example.com"])
fn = os.path.join(os.path.dirname(__file__), 'data/calls', 'build_notif_1', 'message.txt')
with open(fn, 'rb') as fp:
msg_expect = fp.read()
if six.PY2:
msg_expect = msg_expect.decode()
self.assertMultiLineEqual(message.decode(), msg_expect.decode())
locale.setlocale(locale.LC_ALL, "")