def test_build_dependencies_needs_system(tmp_path): """pip3 is called with --system when pip3 needs it.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder({ 'from': tmp_path, 'entrypoint': 'whatever', 'requirement': ['reqs'], }) with patch('charmcraft.commands.build._pip_needs_system') as is_bionic: is_bionic.return_value = True with patch('charmcraft.commands.build.polite_exec') as mock: mock.return_value = 0 builder.handle_dependencies() envpath = build_dir / VENV_DIRNAME assert mock.mock_calls == [ call(['pip3', 'list']), call([ 'pip3', 'install', '--target={}'.format(envpath), '--system', '--requirement=reqs' ]), ]
def test_build_dependencies_virtualenv_multiple(tmp_path, config): """A virtualenv is created with multiple requirements files.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder( { "from": tmp_path, "entrypoint": "whatever", "requirement": ["reqs1.txt", "reqs2.txt"], }, config, ) with patch("charmcraft.commands.build.polite_exec") as mock: mock.return_value = 0 builder.handle_dependencies() envpath = build_dir / VENV_DIRNAME assert mock.mock_calls == [ call(["pip3", "list"]), call([ "pip3", "install", "--target={}".format(envpath), "--requirement=reqs1.txt", "--requirement=reqs2.txt", ]), ]
def test_build_dependencies_needs_system(tmp_path, config): """pip3 is called with --system when pip3 needs it.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder( { "from": tmp_path, "entrypoint": "whatever", "requirement": ["reqs"], }, config, ) with patch("charmcraft.commands.build._pip_needs_system") as is_bionic: is_bionic.return_value = True with patch("charmcraft.commands.build.polite_exec") as mock: mock.return_value = 0 builder.handle_dependencies() envpath = build_dir / VENV_DIRNAME assert mock.mock_calls == [ call(["pip3", "list"]), call([ "pip3", "install", "--target={}".format(envpath), "--system", "--requirement=reqs", ]), ]
def test_build_dependencies_virtualenv_none(tmp_path): """The virtualenv is NOT created if no needed.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder({ 'from': tmp_path, 'entrypoint': 'whatever', 'requirement': [], }) with patch('charmcraft.commands.build.polite_exec') as mock: builder.handle_dependencies() mock.assert_not_called()
def test_build_dependencies_virtualenv_error_basicpip(tmp_path): """Process is properly interrupted if using pip fails.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder({ 'from': tmp_path, 'entrypoint': 'whatever', 'requirement': ['something'], }) with patch('charmcraft.commands.build.polite_exec') as mock: mock.return_value = -7 with pytest.raises(CommandError, match="problems using pip"): builder.handle_dependencies()
def test_build_dependencies_virtualenv_error_installing(tmp_path): """Process is properly interrupted if virtualenv creation fails.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder({ 'from': tmp_path, 'entrypoint': 'whatever', 'requirement': ['something'], }) with patch('charmcraft.commands.build.polite_exec') as mock: mock.side_effect = [0, -7] with pytest.raises(CommandError, match="problems installing dependencies"): builder.handle_dependencies()
def test_build_dependencies_virtualenv_error_basicpip(tmp_path, config): """Process is properly interrupted if using pip fails.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder( { "from": tmp_path, "entrypoint": "whatever", "requirement": ["something"], }, config, ) with patch("charmcraft.commands.build.polite_exec") as mock: mock.return_value = -7 with pytest.raises(CommandError, match="problems using pip"): builder.handle_dependencies()
def test_build_dependencies_virtualenv_none(tmp_path, config): """The virtualenv is NOT created if no needed.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder( { "from": tmp_path, "entrypoint": "whatever", "requirement": [], }, config, ) with patch("charmcraft.commands.build.polite_exec") as mock: builder.handle_dependencies() mock.assert_not_called()
def test_build_dependencies_virtualenv_error_installing(tmp_path, config): """Process is properly interrupted if virtualenv creation fails.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder( { "from": tmp_path, "entrypoint": "whatever", "requirement": ["something"], }, config, ) with patch("charmcraft.commands.build.polite_exec") as mock: mock.side_effect = [0, -7] with pytest.raises(CommandError, match="problems installing dependencies"): builder.handle_dependencies()
def test_build_dependencies_virtualenv_simple(tmp_path): """A virtualenv is created with the specified requirements file.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() builder = Builder({ 'from': tmp_path, 'entrypoint': 'whatever', 'requirement': ['reqs.txt'], }) with patch('charmcraft.commands.build.polite_exec') as mock: mock.return_value = 0 builder.handle_dependencies() envpath = build_dir / VENV_DIRNAME assert mock.mock_calls == [ call(['pip3', 'list']), call(['pip3', 'install', '--target={}'.format(envpath), '--requirement=reqs.txt']), ]
def test_build_dependencies_copied_dirs(tmp_path): """The libs with dependencies are properly transferred.""" build_dir = tmp_path / BUILD_DIRNAME build_dir.mkdir() mod_dir = tmp_path / 'mod' mod_dir.mkdir() lib_dir = tmp_path / 'lib' lib_dir.mkdir() builder = Builder({ 'from': tmp_path, 'entrypoint': 'whatever', 'requirement': [], }) builder.handle_dependencies() # check symlinks were created for those built_mod_dir = build_dir / 'mod' assert built_mod_dir.is_symlink() assert built_mod_dir.resolve() == mod_dir built_lib_dir = build_dir / 'lib' assert built_lib_dir.is_symlink() assert built_lib_dir.resolve() == lib_dir