55387a4f4a
The mock third party library was needed for mock support in py2 runtimes. Since we now only support py36 and later, we can use the standard lib unittest.mock module instead. Change-Id: Ib4184a05e753c3d1368167b91fc43bcc64a176c3
197 lines
8.1 KiB
Python
197 lines
8.1 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import io
|
|
import os
|
|
from unittest import mock
|
|
|
|
import testscenarios
|
|
import testtools
|
|
|
|
from openstack_requirements.cmds import check_exists
|
|
from openstack_requirements import project
|
|
from openstack_requirements.tests import common
|
|
|
|
load_tests = testscenarios.load_tests_apply_scenarios
|
|
|
|
|
|
def mock_read_requirements_file(filename):
|
|
if os.path.basename(filename) == 'upper-constraints.txt':
|
|
return common.upper_constraints
|
|
elif os.path.basename(filename) == 'global-requirements.txt':
|
|
return common.global_reqs
|
|
elif os.path.basename(filename) == 'blacklist.txt':
|
|
return common.blacklist
|
|
else:
|
|
raise IOError('No such file or directory: %s' % filename)
|
|
|
|
|
|
class CheckExistsTest(testtools.TestCase):
|
|
|
|
def setUp(self):
|
|
super(CheckExistsTest, self).setUp()
|
|
|
|
@mock.patch(
|
|
'openstack_requirements.cmds.check_exists.read_requirements_file',
|
|
mock_read_requirements_file)
|
|
@mock.patch('openstack_requirements.project.read',
|
|
return_value=common.project_project)
|
|
def test_good_project(self, mock_project_read):
|
|
ret = check_exists.main([common.project_fixture.root])
|
|
self.assertEqual(ret, 0)
|
|
|
|
@mock.patch(
|
|
'openstack_requirements.cmds.check_exists.read_requirements_file',
|
|
mock_read_requirements_file)
|
|
def test_project_missing_from_uc(self):
|
|
self.useFixture(common.project_fixture)
|
|
orig_mocked_read_req = check_exists.read_requirements_file
|
|
read_req_path = ('openstack_requirements.cmds.check_exists.'
|
|
'read_requirements_file')
|
|
|
|
def remove_req_read_reqs_file(filename):
|
|
if filename == 'upper-constraints.txt':
|
|
upper_cons = common.upper_constraints.copy()
|
|
upper_cons.pop('six')
|
|
return upper_cons
|
|
|
|
return orig_mocked_read_req(filename)
|
|
|
|
expected_out = ('six from requirements.txt not found in'
|
|
' upper-constraints')
|
|
|
|
# Start capturing some output
|
|
mock_stdout = io.StringIO()
|
|
with mock.patch('openstack_requirements.project.read',
|
|
return_value=common.project_project), \
|
|
mock.patch('sys.stdout', mock_stdout), \
|
|
mock.patch(read_req_path, remove_req_read_reqs_file):
|
|
ret = check_exists.main([common.project_fixture.root])
|
|
self.assertEqual(ret, 1)
|
|
self.assertIn(expected_out, mock_stdout.getvalue())
|
|
|
|
@mock.patch(
|
|
'openstack_requirements.cmds.check_exists.read_requirements_file',
|
|
mock_read_requirements_file)
|
|
def test_project_missing_from_gr(self):
|
|
self.useFixture(common.project_fixture)
|
|
|
|
# Add some random package that wont exist in G-R
|
|
with open(common.project_fixture.req_file, 'a') as req_file:
|
|
req_file.write(u'SomeRandomModule #Some random module\n')
|
|
req_file.flush()
|
|
|
|
expected_out = ('somerandommodule from requirements.txt not found in'
|
|
' global-requirements')
|
|
|
|
# Start capturing some output
|
|
mock_stdout = io.StringIO()
|
|
proj_read = project.read(common.project_fixture.root)
|
|
with mock.patch('openstack_requirements.project.read',
|
|
return_value=proj_read), \
|
|
mock.patch('sys.stdout', mock_stdout):
|
|
ret = check_exists.main([common.project_fixture.root])
|
|
self.assertEqual(ret, 1)
|
|
self.assertIn(expected_out, mock_stdout.getvalue())
|
|
|
|
@mock.patch(
|
|
'openstack_requirements.cmds.check_exists.read_requirements_file',
|
|
mock_read_requirements_file)
|
|
def test_project_multiple_missing_from_uc_and_gr(self):
|
|
self.useFixture(common.project_fixture)
|
|
orig_mocked_read_req = check_exists.read_requirements_file
|
|
read_req_path = ('openstack_requirements.cmds.check_exists.'
|
|
'read_requirements_file')
|
|
|
|
def remove_req_read_reqs_file(filename):
|
|
if filename == 'upper-constraints.txt':
|
|
upper_cons = common.upper_constraints.copy()
|
|
upper_cons.pop('lxml')
|
|
return upper_cons
|
|
|
|
return orig_mocked_read_req(filename)
|
|
|
|
new_reqs = '>1.10.0\nsomerandommodule\n'
|
|
|
|
# lets change the six requirement not include the u-c version
|
|
proj_read = project.read(common.project_fixture.root)
|
|
proj_read['requirements']['requirements.txt'] = \
|
|
proj_read['requirements']['requirements.txt'][:-1] + new_reqs
|
|
proj_read['requirements']['test-requirements.txt'] = \
|
|
proj_read['requirements']['test-requirements.txt'] + \
|
|
'anotherrandommodule\n'
|
|
|
|
expected_outs = [
|
|
'lxml from requirements.txt not found in upper-constraints',
|
|
'somerandommodule from requirements.txt not found in '
|
|
'global-requirements',
|
|
'anotherrandommodule from test-requirements.txt not found in '
|
|
'global-requirements',
|
|
'six must be <= 1.10.0 from upper-constraints and include the '
|
|
'upper-constraints version']
|
|
|
|
# Start capturing some output
|
|
mock_stdout = io.StringIO()
|
|
with mock.patch('openstack_requirements.project.read',
|
|
return_value=proj_read), \
|
|
mock.patch('sys.stdout', mock_stdout), \
|
|
mock.patch(read_req_path, remove_req_read_reqs_file):
|
|
ret = check_exists.main([common.project_fixture.root])
|
|
self.assertEqual(ret, 1)
|
|
for expected in expected_outs:
|
|
self.assertIn(expected, mock_stdout.getvalue())
|
|
|
|
@mock.patch(
|
|
'openstack_requirements.cmds.check_exists.read_requirements_file',
|
|
mock_read_requirements_file)
|
|
def test_project_req_bigger_then_uc(self):
|
|
self.useFixture(common.project_fixture)
|
|
|
|
# lets change the six requirement not include the u-c version
|
|
proj_read = project.read(common.project_fixture.root)
|
|
proj_read['requirements']['requirements.txt'] = \
|
|
proj_read['requirements']['requirements.txt'][:-1] + '>1.10.0\n'
|
|
expected_out = ('six must be <= 1.10.0 from upper-constraints and '
|
|
'include the upper-constraints version')
|
|
|
|
# Start capturing some output
|
|
mock_stdout = io.StringIO()
|
|
with mock.patch('openstack_requirements.project.read',
|
|
return_value=proj_read), \
|
|
mock.patch('sys.stdout', mock_stdout):
|
|
ret = check_exists.main([common.project_fixture.root])
|
|
self.assertEqual(ret, 1)
|
|
self.assertIn(expected_out, mock_stdout.getvalue())
|
|
|
|
@mock.patch(
|
|
'openstack_requirements.cmds.check_exists.read_requirements_file',
|
|
mock_read_requirements_file)
|
|
def test_project_req_not_include_uc_version(self):
|
|
self.useFixture(common.project_fixture)
|
|
|
|
# lets change the six requirement not include the u-c version
|
|
proj_read = project.read(common.project_fixture.root)
|
|
proj_read['requirements']['requirements.txt'] = \
|
|
proj_read['requirements']['requirements.txt'][:-1] + \
|
|
'<1.10.0,>1.10.0\n'
|
|
expected_out = ('six must be <= 1.10.0 from upper-constraints and '
|
|
'include the upper-constraints version')
|
|
|
|
# Start capturing some output
|
|
mock_stdout = io.StringIO()
|
|
with mock.patch('openstack_requirements.project.read',
|
|
return_value=proj_read), \
|
|
mock.patch('sys.stdout', mock_stdout):
|
|
ret = check_exists.main([common.project_fixture.root])
|
|
self.assertEqual(ret, 1)
|
|
self.assertIn(expected_out, mock_stdout.getvalue())
|