#!/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()
