| #!/usr/bin/env python3 |
| # Copyright 2020 The Pigweed Authors |
| # |
| # 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 |
| # |
| # https://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. |
| """Tests the python_packages module.""" |
| |
| import importlib.metadata |
| from pathlib import Path |
| import tempfile |
| import unittest |
| from unittest import mock |
| |
| from pw_env_setup import python_packages |
| |
| |
| class TestPythonPackages(unittest.TestCase): |
| """Tests the python_packages module.""" |
| def setUp(self): |
| self.existing_pkgs_minus_toml = '\n'.join( |
| pkg for pkg in python_packages._installed_packages() # pylint: disable=protected-access |
| if not pkg.startswith('toml==')) |
| self.temp_dir = tempfile.TemporaryDirectory() |
| self.temp_path = Path(self.temp_dir.name) |
| |
| def tearDown(self): |
| self.temp_dir.cleanup() |
| |
| def test_list(self): |
| pkgs = list(python_packages._installed_packages()) # pylint: disable=protected-access |
| toml_version = importlib.metadata.version('toml') |
| |
| self.assertIn(f'toml=={toml_version}', pkgs) |
| self.assertNotIn('pw-foo', pkgs) |
| |
| @mock.patch('pw_env_setup.python_packages._stderr') |
| def test_diff_removed(self, stderr_mock): |
| expected = 'foo==1.0\nbar==2.0\nbaz==3.0\n' |
| expected_file = self.temp_path / 'test_diff_removed_expected' |
| expected_file.write_text(expected, encoding='utf-8') |
| |
| # Removed packages should trigger a failure. |
| self.assertEqual(-1, python_packages.diff(expected_file)) |
| |
| stderr_mock.assert_any_call('Removed packages') |
| stderr_mock.assert_any_call(' foo==1.0') |
| stderr_mock.assert_any_call(' bar==2.0') |
| stderr_mock.assert_any_call(' baz==3.0') |
| |
| @mock.patch('pw_env_setup.python_packages._stderr') |
| def test_diff_updated(self, stderr_mock): |
| expected = 'toml>=0.0.1\n' + self.existing_pkgs_minus_toml |
| expected_file = self.temp_path / 'test_diff_updated_expected' |
| expected_file.write_text(expected, encoding='utf-8') |
| |
| toml_version = importlib.metadata.version('toml') |
| |
| # Updated packages should trigger a failure. |
| self.assertEqual(-1, python_packages.diff(expected_file)) |
| |
| stderr_mock.assert_any_call('Updated packages') |
| stderr_mock.assert_any_call( |
| f' toml=={toml_version} (from toml>=0.0.1)') |
| |
| @mock.patch('pw_env_setup.python_packages._stderr') |
| def test_diff_new(self, stderr_mock): |
| expected = self.existing_pkgs_minus_toml |
| expected_file = self.temp_path / 'test_diff_new_expected' |
| expected_file.write_text(expected, encoding='utf-8') |
| |
| toml_version = importlib.metadata.version('toml') |
| |
| # New packages should trigger a failure. |
| self.assertEqual(-1, python_packages.diff(expected_file)) |
| |
| stderr_mock.assert_any_call('New packages') |
| stderr_mock.assert_any_call(f' toml=={toml_version}') |
| stderr_mock.assert_any_call("Package versions don't match!") |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |