Beispiel #1
0
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'
        ]),
    ]
Beispiel #2
0
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",
        ]),
    ]
Beispiel #3
0
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",
        ]),
    ]
Beispiel #4
0
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()
Beispiel #5
0
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()
Beispiel #6
0
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()
Beispiel #7
0
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()
Beispiel #8
0
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()
Beispiel #9
0
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()
Beispiel #10
0
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']),
    ]
Beispiel #11
0
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