blob: bee5950b3d4a7ca5d1ed4d16affd8a84932d3309 [file] [log] [blame]
#!/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()