Source code for meta_package_manager.tests.test_cli_install_remove

# Copyright Kevin Deldycke <kevin@deldycke.com> and contributors.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

from __future__ import annotations

import re

import pytest

from meta_package_manager.pool import pool

from .conftest import all_manager_ids_and_dummy_package
from .test_cli import CLISubCommandTests


[docs]@pytest.fixture() def subcmd(): return "install", "arrow"
[docs]class TestInstallRemove(CLISubCommandTests): """Install and remove operations are siblings and sensible, so we regroup them under the same test suite. .. tip:: Where we can, we invoke the ``install`` subcommand to install ``mpm`` with itself, so we can `test externally contributed packaging <https://github.com/kdeldycke/meta-package-manager/issues/527>`_. """
[docs] @staticmethod def evaluate_signals(mid, stdout, stderr): yield from ( # Install messages. bool( re.search( rf"Install \S+ package with {mid}\.\.\.", stderr, ), ), bool( re.search( rf"warning: No \S+ package found on {mid}\.", stderr, ), ), # Remove messages. bool( re.search( rf"Remove \S+ package with {mid}\.\.\.", stderr, ), ), )
[docs] @pytest.mark.parametrize("operation", ("install", "remove")) def test_no_package_id(self, invoke, operation): result = invoke(operation) assert result.exit_code == 2 assert not result.stdout assert "Error: Missing argument 'PACKAGES_SPECS...'." in result.stderr
[docs] @pytest.mark.destructive() @all_manager_ids_and_dummy_package def test_single_manager_install_and_remove(self, invoke, manager_id, package_id): """Test the installation and removal of a package with each manager. .. caution. ``strict_selection_match`` is set to ``False`` because the ``install`` subcommand will not try all managers selected by default. So a strict match is not possible. That's because ``install`` subcommand try each user-selected manager until it find one providing the package we seek to install, after which the process stop. """ result = invoke(f"--{manager_id}", "install", package_id) assert result.exit_code == 0 self.check_manager_selection( result, {manager_id}, reference_set=pool.all_manager_ids, strict_selection_match=False, ) result = invoke(f"--{manager_id}", "remove", package_id) assert result.exit_code == 0 self.check_manager_selection( result, {manager_id}, reference_set=pool.all_manager_ids, strict_selection_match=False, )