def test_request_env_name(prompt_ret_val, extract_env_name_ret_val,
                          expected_result):
    with fake_envfile():
        with mock.patch("jovian.utils.envfile.click.prompt", return_value=prompt_ret_val), \
                mock.patch("jovian.utils.envfile.extract_env_name", return_value=extract_env_name_ret_val):
            assert request_env_name(
                env_name=None, env_fname='environment.yml') == expected_result
def test_write_env_name(data, name):
    with fake_envfile():
        dump_environment_to_yaml_file('test.yml', data)

        write_env_name(name, 'test.yml')

        assert get_environment_dict('test.yml')['name'] == name
def test_run_command(mock_popen, side_effect, calls):
    with fake_envfile():
        mock_popen().communicate.side_effect = side_effect
        run_command(
            'conda env update --file environment.yml --name environment-name',
            'environment.yml', ['mixpanel=1.11.0', 'sigmasix=1.91.0'])

        mock_popen.assert_has_calls(calls)
def test_activate_conda_not_found(mock_get_conda_bin, capsys):
    with fake_envfile():
        assert activate('environment.yml') == False

        expected_result = """[jovian] Error: Anaconda binary not found. Please make sure the "conda" command is in your system PATH or the environment variable $CONDA_EXE points to the anaconda binary"""

        captured = capsys.readouterr()
        assert expected_result.strip() in captured.err.strip()
def test_activate_env_name_none(mock_get_conda_bin, mock_extract_env_name,
                                capsys):
    with fake_envfile():
        activate('environment.yml')

        expected_result = """[jovian] Environment name not provided/detected. Skipping.."""

        captured = capsys.readouterr()
        assert expected_result.strip() in captured.out.strip()
def test_activate_env_fname_none(mock_get_conda_bin, mock_identify_env_file,
                                 capsys):
    with fake_envfile():
        assert activate('environment.yml') == False

        expected_result = """[jovian] Error: Failed to detect a conda environment YML file. Skipping.."""

        captured = capsys.readouterr()
        assert expected_result.strip() in captured.err.strip()
def test_install_env_name_none(mock_request_env_name, mock_get_conda_bin,
                               capsys):
    with fake_envfile():
        install('environment.yml')

        expected_result = dedent("""
            [jovian] Detected conda environment file: environment.yml

            [jovian] Environment name not provided/detected. Skipping..
            """).strip()
        captured = capsys.readouterr()
        assert captured.out.strip() == expected_result
def test_get_environment_dict_raises_exception_invalid_file():
    with fake_envfile():
        with open('invalid-yaml-file.yml', 'w') as f:
            f.write(
                dedent("""
            ok:
                sub1: sub1
                ][
            hello:
                world: world
                some: other
            """))
        assert get_environment_dict('invalid-yaml-file.yml') == {}
def test_activate(mock_get_conda_bin, capsys):
    with fake_envfile():
        activate('environment.yml')

        expected_result = dedent("""
            [jovian] Detected conda environment file: environment.yml

            [jovian] Copy and execute the following command (try "source activate" if "conda activate doesn't work" )
                conda activate test-env
        """).strip()

        captured = capsys.readouterr()
        assert expected_result.strip() in captured.out.strip()
def test_install(mock_run_command, mock_request_env_name, mock_get_conda_bin):
    with fake_envfile():
        mock_run_command.return_value = True

        install('environment.yml')

        mock_run_command.assert_called_with(
            command=
            'conda env update --file "environment.yml" --name "test-env"',
            env_fname='environment.yml',
            packages=[
                'mixpanel=1.11.0', 'sigmasix=1.91.0', 'sqlite', 'six==1.11.0',
                'sqlite==2.0.0'
            ],
            run=1)
def test_dump_environment_to_yaml_file_normal():
    with fake_envfile():
        data = {
            'channels': ['defaults'],
            'dependencies': [
                'mixpanel=1.11.0', 'sigmasix=1.91.0', 'sqlite', {
                    'pip': ['six==1.11.0', 'sqlite==2.0.0']
                }
            ],
            'name':
            'test-env',
            'prefix':
            '/home/admin/anaconda3/envs/test-env'
        }
        dump_environment_to_yaml_file('test.yml', data)

        assert get_environment_dict('test.yml') == data
def test_get_environment_dict():
    with fake_envfile():
        expected_result = {
            'prefix':
            '/home/admin/anaconda3/envs/test-env',
            'dependencies': [
                'mixpanel=1.11.0', 'sigmasix=1.91.0', 'sqlite', {
                    'pip': ['six==1.11.0', 'sqlite==2.0.0']
                }
            ],
            'channels': ['defaults'],
            'name':
            'test-env'
        }
        environment = get_environment_dict(env_fname='environment.yml')

        assert environment == expected_result
def test_get_environment_dict_non_existent_file():
    with fake_envfile():
        expected = {
            'prefix':
            '/home/admin/anaconda3/envs/test-env',
            'dependencies': [
                'mixpanel=1.11.0', 'sigmasix=1.91.0', 'sqlite', {
                    'pip': ['six==1.11.0', 'sqlite==2.0.0']
                }
            ],
            'channels': ['defaults'],
            'name':
            'test-env'
        }
        environment = get_environment_dict(env_fname='environment.yml')

        with pytest.raises(FileNotFoundError):
            get_environment_dict(env_fname='non-existent-file.yml')
def test_sanitize_envfile():
    with fake_envfile():
        packages = ['six==1.11.0', 'sigmasix=1.91.0']
        sanitize_envfile('environment.yml', packages)

        expected_result = {
            'channels': ['defaults'],
            'dependencies':
            ['mixpanel=1.11.0', 'sqlite', {
                'pip': ['sqlite==2.0.0']
            }],
            'name':
            'test-env',
            'prefix':
            '/home/admin/anaconda3/envs/test-env'
        }

        assert get_environment_dict('environment.yml') == expected_result
def test_install_unsuccessful(mock_run_command, mock_request_env_name,
                              mock_get_conda_bin, capsys):
    with fake_envfile():
        mock_run_command.return_value = False

        install('environment.yml')

        expected_result = dedent("""
                            [jovian] Detected conda environment file: environment.yml

                            [jovian] Some pip packages failed to install.
                            [jovian] 
                            #
                            # To activate this environment, use
                            #
                            #     $ conda activate test-env
                            #
                            # To deactivate an active environment, use
                            #
                            #     $ conda deactivate
                        """).strip()

        captured = capsys.readouterr()
        assert captured.out.strip() == expected_result
def test_extract(func, env_fname, expected_result):
    with fake_envfile():
        assert func(env_fname) == expected_result

        with pytest.raises(FileNotFoundError):
            func('non-existent-file.yml')
def test_check_error(error_str, expected_result):
    with fake_envfile():
        packages = extract_env_packages(env_fname='environment.yml')
        assert check_error(error_str=error_str,
                           packages=packages) == expected_result
def test_extract_package_from_line(line, expected_result):
    with fake_envfile():
        packages = extract_env_packages(env_fname='environment.yml')
        assert extract_package_from_line(line=line,
                                         packages=packages) == expected_result
def test_identify_env_file_exists():
    with fake_envfile():
        assert identify_env_file(env_fname=None) == 'environment.yml'
def test_remove_packages(dependencies, expected_result):
    with fake_envfile():
        packages = extract_env_packages(env_fname='environment.yml')
        assert remove_packages(dependencies, packages) == expected_result