Bugfixes and unit tests for pkgin module

Corrects pkg.lastest_version and pkg.file_dict behavior
This commit is contained in:
Travis Paul 2018-05-24 14:26:27 +08:00 committed by rallytime
parent c4d828c986
commit 4ae0313797
No known key found for this signature in database
GPG key ID: E8F1A4B90D0DEA19
2 changed files with 165 additions and 4 deletions

View file

@ -181,7 +181,9 @@ def latest_version(*names, **kwargs):
out = __salt__['cmd.run'](cmd, output_loglevel='trace')
for line in out.splitlines():
p = line.split(',' if _supports_parsing() else None)
if line.startswith('No results found for'):
return pkglist
p = line.split(';' if _supports_parsing() else None)
if p and p[0] in ('=:', '<:', '>:', ''):
# These are explanation comments
@ -190,7 +192,7 @@ def latest_version(*names, **kwargs):
s = _splitpkg(p[0])
if s:
if not s[0] in pkglist:
if len(p) > 1 and p[1] == '<':
if len(p) > 1 and p[1] == '<' or p[1] == '':
pkglist[s[0]] = s[1]
else:
pkglist[s[0]] = ''
@ -669,7 +671,6 @@ def file_dict(*packages):
for package in packages:
cmd = ['pkg_info', '-qL', package]
ret = __salt__['cmd.run_all'](cmd, output_loglevel='trace')
files[package] = []
for line in ret['stderr'].splitlines():
errors.append(line)
@ -681,7 +682,7 @@ def file_dict(*packages):
continue # unexpected string
ret = {'errors': errors, 'files': files}
for field in ret:
for field in list(ret):
if not ret[field] or ret[field] == '':
del ret[field]
return ret

160
tests/unit/modules/test_pkgin.py Executable file
View file

@ -0,0 +1,160 @@
# -*- coding: utf-8 -*-
# Import Python Libs
from __future__ import absolute_import
import os
# Import Salt Testing Libs
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.unit import TestCase, skipIf
from tests.support.mock import (
MagicMock,
patch,
NO_MOCK,
NO_MOCK_REASON
)
# Import Salt Libs
import salt.modules.pkgin as pkgin
@skipIf(NO_MOCK, NO_MOCK_REASON)
class PkginTestCase(TestCase, LoaderModuleMockMixin):
'''
Test cases for salt.modules.pkgin
'''
def setup_loader_modules(self):
return {
pkgin: {
'__opts__': {
'cachedir': '/tmp'
}
}
}
def test_search(self):
'''
Test searching for an available and uninstalled package
'''
pkgin_out = [
'somepkg-1.0 Some package description here',
'',
'=: package is installed and up-to-date',
'<: package is installed but newer version is available',
'>: installed package has a greater version than available package'
]
pkgin__get_version_mock = MagicMock(return_value=['0', '9', '0'])
pkgin__check_pkgin_mock = MagicMock(return_value='/opt/pkg/bin/pkgin')
pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out))
with patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \
patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \
patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}):
self.assertDictEqual(pkgin.search('somepkg'), {'somepkg': '1.0'})
'''
Test searching for an available and installed package
'''
pkgin_out = [
'somepkg-1.0 = Some package description here',
'',
'=: package is installed and up-to-date',
'<: package is installed but newer version is available',
'>: installed package has a greater version than available package'
]
pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out))
with patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \
patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \
patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}):
self.assertDictEqual(pkgin.search('somepkg'), {'somepkg': '1.0'})
def test_latest_version(self):
'''
Test getting the latest version of an uninstalled package
'''
pkgin_out = [
'somepkg-1.0;;Some package description here',
'',
'=: package is installed and up-to-date',
'<: package is installed but newer version is available',
'>: installed package has a greater version than available package'
]
pkgin__get_version_mock = MagicMock(return_value=['0', '9', '0'])
pkgin__check_pkgin_mock = MagicMock(return_value='/opt/pkg/bin/pkgin')
pkgin_refresh_db_mock = MagicMock(return_value=True)
pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out))
with patch('salt.modules.pkgin.refresh_db', pkgin_refresh_db_mock), \
patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \
patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \
patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}):
self.assertEqual(pkgin.latest_version('somepkg'), '1.0')
'''
Test getting the latest version of an ininstalled package
'''
pkgin_out = [
'somepkg-1.1;<;Some package description here',
'',
'=: package is installed and up-to-date',
'<: package is installed but newer version is available',
'>: installed package has a greater version than available package'
]
pkgin_refresh_db_mock = MagicMock(return_value=True)
pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out))
with patch('salt.modules.pkgin.refresh_db', pkgin_refresh_db_mock), \
patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \
patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \
patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}):
self.assertEqual(pkgin.latest_version('somepkg'), '1.1')
'''
Test getting the latest version of a bogus package
'''
pkgin_out = 'No results found for ^boguspkg$'
pkgin_refresh_db_mock = MagicMock(return_value=True)
pkgin_search_cmd = MagicMock(return_value=pkgin_out)
with patch('salt.modules.pkgin.refresh_db', pkgin_refresh_db_mock), \
patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \
patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \
patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}):
self.assertEqual(pkgin.latest_version('boguspkg'), {})
def test_file_dict(self):
'''
Test that file_dict doesn't crash
'''
pkg_info_stdout = [
'/opt/pkg/bin/pkgin',
'/opt/pkg/man/man1/pkgin.1',
'/opt/pkg/share/examples/pkgin/preferred.conf.example',
'/opt/pkg/share/examples/pkgin/repositories.conf.example'
]
pkg_info_out = {
'pid': 1234,
'retcode': 0,
'stderr': '',
'stdout': os.linesep.join(pkg_info_stdout)
}
pkg_info_cmd = MagicMock(return_value=pkg_info_out)
with patch.dict(pkgin.__salt__, {'cmd.run_all': pkg_info_cmd}):
self.assertDictEqual(pkgin.file_dict('pkgin'), {
'files': {
'pkgin': [
'/opt/pkg/bin/pkgin',
'/opt/pkg/man/man1/pkgin.1',
'/opt/pkg/share/examples/pkgin/preferred.conf.example',
'/opt/pkg/share/examples/pkgin/repositories.conf.example'
]
}
})