#4458 incorrect mocking in some unit tests
Closed: Fixed by mikem. Opened by mikem.

Placeholder #4457


Example failure

self = <tests.test_plugins.test_sidetag_hub.TestCreateSideTagHub testMethod=test_createsidetag_basic>
    def test_createsidetag_basic(self):
        self.query_executeOne.return_value = {'user_tags': 0}
        sidetag_name = 'base_tag-side-12346'
        self.context.session.assertLogin = mock.MagicMock()
        self.context.session.user_id = 23
        self.get_user.return_value = self.user
        self.get_tag.return_value = self.basetag
        self.nextval.return_value = 12345
        self._create_tag.return_value = 12346
        ret = sidetag_hub.createSideTag('base_tag')
>       self.assertEqual(ret, {'name': sidetag_name, 'id': 12346, 'task_id': None, 'request': None})
E       AssertionError: {'nam[13 chars]-sidetag-12346', 'id': 12346, 'task_id': None, 'request': None} != {'nam[13 chars]-side-12346', 'id': 12346, 'task_id': None, 'request': None}
E       + {'id': 12346, 'name': 'base_tag-side-12346', 'request': None, 'task_id': None}
E       - {'id': 12346,
E       -  'name': 'base_tag-sidetag-12346',
E       -  'request': None,
E       -  'task_id': None}
tests/test_plugins/test_sidetag_hub.py:56: AssertionError

Metadata Update from @mikem:
- Custom field Size adjusted to None

The bad ensuredir mock could cause strange errors depending on ordering. E.g.

self = <tests.test_cli.test_prune_signed_copies.TestPruneSignedCopies testMethod=test_handle_prune_signes_copies_unlink_perms_error>
stdout = <_io.StringIO object at 0x7fe7aa4759c0>
pathinfobuild = <MagicMock name='build' id='140632800076736'>
timeasctime = <MagicMock name='asctime' id='140632800077072'>
timetime = <MagicMock name='time' id='140632800076400'>
lstat = <MagicMock name='lstat' id='140632800081104'>
isreg = <MagicMock name='S_ISREG' id='140632800081776'>
    @mock.patch('stat.S_ISREG')
    @mock.patch('os.lstat')
    @mock.patch('time.time', return_value=1682063424)
    @mock.patch('time.asctime', return_value='Sat Apr  20 14:08:17 2023')
    @mock.patch('koji.pathinfo.build', return_value='fakebuildpath')
    @mock.patch('sys.stdout', new_callable=six.StringIO)
    def test_handle_prune_signes_copies_unlink_perms_error(
            self, stdout, pathinfobuild, timeasctime, timetime, lstat, isreg):
        """Returns prune signed copies info with unlink perms error"""
        self.options.debug = True
        arguments = ['--verbose', '--package', 'package-name']
        list_rpms = [{'id': 123, 'name': 'test', 'version': '1.3', 'release': 1,
                      'arch': 'test-arch', 'external_repo_name': 'ext-repo',
                      'external_repo_id': 456, 'build_id': 1}]
        self.session.getPackage.return_value = {'id': 135, 'name': 'package-name'}
        self.session.listBuilds.side_effect = [
            [{'build_id': 1, 'nvr': 'package-name-1.3-4', 'package_name': 'package-name'}], []]
        self.session.queryHistory.side_effect = [
            {'tag_listing': [{'tag.name': 'test-tag1'}, {'tag.name': 'test-tag2'}]},
            {'tag_listing': [{'active': True, 'build_id': 1, 'create_event': 11,
                              'create_ts': 1681191826, 'name': 'package-name', 'release': '4',
                              'revoke_event': 22, 'revoke_ts': 1681191836, 'tag_name': 'test-tag1',
                              'version': '1.3'},
                             {'active': True, 'build_id': 1, 'create_event': 33,
                              'create_ts': 1681191846, 'name': 'package-name', 'release': '4',
                              'revoke_event': 44, 'revoke_ts': 1681191856, 'tag_name': 'test-tag1',
                              'version': '1.3'}]},
            {'tag_listing': [{'active': True, 'build_id': 1, 'create_event': 11,
                              'create_ts': 1681191826, 'name': 'package-name', 'release': '4',
                              'revoke_event': 22, 'revoke_ts': 1681191836, 'tag_name': 'test-tag2',
                              'version': '1.3'},
                             {'active': True, 'build_id': 1, 'create_event': 33,
                              'create_ts': 1681191846, 'name': 'package-name', 'release': '4',
                              'revoke_event': 44, 'revoke_ts': 1681191856, 'tag_name': 'test-tag2',
                              'version': '1.3'}]}
        ]
        self.session.listRPMs.return_value = list_rpms
        sigRpm = [[[{'rpm_id': 123, 'sigkey': 'qwertyuiop'}]]]
        self.session.multiCall.return_value = sigRpm
        stat = mock.MagicMock()
        stat.st_mode = 'mode'
        stat.st_mtime = 1681191826
        lstat.return_value = stat
        isreg.return_value = True
>       rv = handle_prune_signed_copies(self.options, self.session, arguments)
tests/test_cli/test_prune_signed_copies.py:595: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cli/koji_cli/commands.py:2002: in handle_prune_signed_copies
    print("Tags: %s" % to_list(tags.keys()))
koji/util.py:1342: in to_list
    def to_list(lst):
/usr/lib64/python3.13/site-packages/coverage/control.py:391: in _should_trace
    disp = self._inorout.should_trace(filename, frame)
/usr/lib64/python3.13/site-packages/coverage/inorout.py:351: in should_trace
    canonical = canonical_filename(filename)
/usr/lib64/python3.13/site-packages/coverage/files.py:85: in canonical_filename
    cf = abs_file(cf)
/usr/lib64/python3.13/site-packages/coverage/files.py:156: in abs_file
    return actual_path(os.path.abspath(os.path.realpath(path)))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
filename = '/home/mikem/Devel/koji/koji/koji/util.py'
>   ???
E   TypeError: an integer is required
<frozen posixpath>:455: TypeError

Commit 407b8ef1 fixes this issue

This issue has been migrated to Fedora Forge:
https://forge.fedoraproject.org/koji/koji/issues/4458

Please continue any further discussion there.

Metadata
Related Pull Requests