98 lines
3.5 KiB
Python
Executable File
98 lines
3.5 KiB
Python
Executable File
#!/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):
|
|
# pylint: disable=protected-access
|
|
pkgs = list(python_packages._installed_packages())
|
|
# pylint: enable=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()
|