예제 #1
0
 def test_set_version_same(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test set_version same."""
     version = mocker.patch.object(TFEnvManager, "version")
     tfenv = TFEnvManager(tmp_path)
     tfenv.current_version = "0.15.5"
     assert not tfenv.set_version("0.15.5")
     assert tfenv.current_version == "0.15.5"
     assert tfenv.version == version
예제 #2
0
    def test_install_no_version(self, tmp_path):
        """Test install with no version available."""
        tfenv = TFEnvManager(tmp_path)

        with pytest.raises(ValueError) as excinfo:
            assert tfenv.install()
        assert str(excinfo.value) == (
            "version not provided and unable to find a .terraform-version file"
        )
예제 #3
0
 def test_parse_version_string_raise_value_error(self) -> None:
     """Test parse_version_string."""
     with pytest.raises(
         ValueError,
         match=re.escape(
             f"provided version doesn't conform to regex: {TFEnvManager.VERSION_REGEX}"
         ),
     ):
         TFEnvManager.parse_version_string("0.15")
예제 #4
0
 def test_get_version_from_executable_raise(self, fake_process: FakeProcess) -> None:
     """Test get_version_from_executable raise exception."""
     fake_process.register_subprocess(
         ["usr/tfenv/terraform", "-version"], returncode=1
     )
     with pytest.raises(
         subprocess.CalledProcessError, match="returned non-zero exit status 1"
     ):
         TFEnvManager.get_version_from_executable("usr/tfenv/terraform")
예제 #5
0
 def test_install_version_undefined(
     self, mocker: MockerFixture, tmp_path: Path
 ) -> None:
     """Test install."""
     mocker.patch.object(TFEnvManager, "version", None)
     tfenv = TFEnvManager(tmp_path)
     with pytest.raises(
         ValueError, match=r"^version not provided and unable to find .*"
     ):
         tfenv.install()
예제 #6
0
 def test_set_version(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test set_version."""
     version = VersionTuple(0, 15, 5)
     mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
     mocker.patch.object(TFEnvManager, "get_version_from_file", return_value=None)
     tfenv = TFEnvManager(tmp_path)
     (tfenv.versions_dir / str(version)).mkdir()
     assert not tfenv.current_version
     assert not tfenv.set_version(str(version))
     assert tfenv.version == version
     assert tfenv.current_version == str(version)
예제 #7
0
 def test_version_unavailable(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test version latest."""
     mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
     mocker.patch(
         f"{MODULE}.get_available_tf_versions",
         return_value=["0.15.5", "0.15.4", "0.14.3", "0.14.2", "0.13.8"],
     )
     tfenv = TFEnvManager(tmp_path)
     tfenv.current_version = "1.0.0"
     with pytest.raises(SystemExit):
         assert not tfenv.version
예제 #8
0
 def test_install_already_installed(
     self, mocker: MockerFixture, tmp_path: Path
 ) -> None:
     """Test install."""
     version = VersionTuple(0, 15, 5)
     mocker.patch.object(TFEnvManager, "version", version)
     mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
     mock_download = mocker.patch(f"{MODULE}.download_tf_release")
     tfenv = TFEnvManager(tmp_path)
     (tfenv.versions_dir / str(version)).mkdir()
     assert tfenv.install() == str(tfenv.bin)
     mock_download.assert_not_called()
예제 #9
0
 def test_install(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test install."""
     version = VersionTuple(0, 15, 5)
     mocker.patch.object(TFEnvManager, "version", version)
     mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
     mock_download = mocker.patch(f"{MODULE}.download_tf_release")
     tfenv = TFEnvManager(tmp_path)
     (tfenv.versions_dir / "0.15.2").mkdir()
     assert tfenv.install() == str(tfenv.bin)
     mock_download.assert_called_once_with(
         str(version), tfenv.versions_dir, tfenv.command_suffix
     )
예제 #10
0
    def test_install_unavailable(self, mock_download, mock_available_versions,
                                 monkeypatch, tmp_path):
        """Test install."""
        mock_available_versions.return_value = []
        monkeypatch.setattr(TFEnvManager, "versions_dir", tmp_path)
        tfenv = TFEnvManager(tmp_path)

        with pytest.raises(SystemExit) as excinfo:
            assert tfenv.install("0.12.0")
        assert excinfo.value.code == 1
        mock_available_versions.assert_called_once_with(True)
        mock_download.assert_not_called()
        assert not tfenv.current_version
예제 #11
0
 def execute(self):
     """Execute tfenv."""
     if self._cli_arguments.get('install'):
         if self._cli_arguments.get('<tfenv-args>'):
             TFEnvManager().install(
                 self._cli_arguments.get('<tfenv-args>')[0])
         else:
             TFEnvManager().install()
     elif self._cli_arguments.get('run'):
         cmd_line_args = strip_leading_option_delim(
             self._cli_arguments.get('<tfenv-args>', []))
         tf_bin = TFEnvManager().install()
         sys.exit(subprocess.call([tf_bin] + cmd_line_args))
예제 #12
0
 def test_install_set_version(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test install set version."""
     version = VersionTuple(0, 15, 5)
     mocker.patch.object(TFEnvManager, "version", version)
     mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
     mock_download = mocker.patch(f"{MODULE}.download_tf_release")
     mock_set_version = mocker.patch.object(
         TFEnvManager, "set_version", return_value=None
     )
     tfenv = TFEnvManager(tmp_path)
     assert tfenv.install(str(version))
     mock_download.assert_called_once_with(
         str(version), tfenv.versions_dir, tfenv.command_suffix
     )
     mock_set_version.assert_called_once_with(str(version))
예제 #13
0
    def test_install_already_installed(self, mock_download,
                                       mock_available_versions, monkeypatch,
                                       tmp_path):
        """Test install with version already installed."""
        mock_available_versions.return_value = ["0.12.0"]
        monkeypatch.setattr(TFEnvManager, "versions_dir", tmp_path)
        tfenv = TFEnvManager(tmp_path)
        (tfenv.versions_dir / "0.12.0").mkdir()

        assert tfenv.install("0.12.0")
        mock_available_versions.assert_not_called()
        mock_download.assert_not_called()
        assert tfenv.current_version == "0.12.0"

        assert tfenv.install(r"0\.12\..*")  # regex does not match dir
예제 #14
0
    def test_install_min_required(self, mock_download, mock_available_versions,
                                  monkeypatch, tmp_path):
        """Test install min_required."""
        mock_available_versions.return_value = ["0.12.0"]
        monkeypatch.setattr(TFEnvManager, "versions_dir", tmp_path)
        monkeypatch.setattr(TFEnvManager, "get_min_required",
                            MagicMock(return_value="0.12.0"))
        tfenv = TFEnvManager(tmp_path)

        assert tfenv.install("min-required")
        mock_available_versions.assert_called_once_with(True)
        mock_download.assert_called_once_with("0.12.0", tfenv.versions_dir,
                                              tfenv.command_suffix)
        assert tfenv.current_version == "0.12.0"
        tfenv.get_min_required.assert_called_once_with()  # pylint: disable=no-member
예제 #15
0
    def test_install_unavailable(self, mocker: MockerFixture,
                                 tmp_path: Path) -> None:
        """Test install."""
        mock_available_versions = mocker.patch(
            f"{MODULE}.get_available_tf_versions", return_value=[])
        mock_download = mocker.patch(f"{MODULE}.download_tf_release")
        mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
        tfenv = TFEnvManager(tmp_path)

        with pytest.raises(SystemExit) as excinfo:
            assert tfenv.install("0.12.0")
        assert excinfo.value.code == 1
        mock_available_versions.assert_called_once_with(True)
        mock_download.assert_not_called()
        assert not tfenv.current_version
예제 #16
0
    def test_get_min_required(self, mocker: MockerFixture, tmp_path: Path) -> None:
        """Test get_min_required."""
        mocker.patch.object(TFEnvManager, "terraform_block", {})
        tfenv = TFEnvManager(tmp_path)

        with pytest.raises(SystemExit) as excinfo:
            assert tfenv.get_min_required()
        assert excinfo.value.code

        mocker.patch.object(tfenv, "terraform_block", {"required_version": "!=0.12.0"})
        with pytest.raises(SystemExit) as excinfo:
            assert tfenv.get_min_required()
        assert excinfo.value.code

        mocker.patch.object(tfenv, "terraform_block", {"required_version": "~>0.12.0"})
        assert tfenv.get_min_required() == "0.12.0"
예제 #17
0
    def test_terraform_block(
        self,
        caplog: LogCaptureFixture,
        expected: Dict[str, Any],
        mocker: MockerFixture,
        response: List[Any],
        tmp_path: Path,
    ) -> None:
        """Test terraform_block."""
        caplog.set_level(LogLevels.VERBOSE, logger=MODULE)
        mock_load_terraform_module = mocker.patch(
            f"{MODULE}.load_terraform_module", side_effect=response)
        tfenv = TFEnvManager(tmp_path)

        assert tfenv.terraform_block == expected

        if not isinstance(response[0], dict):
            assert "failed to parse as HCL2; trying HCL" in "\n".join(
                caplog.messages)
            mock_load_terraform_module.assert_has_calls(
                [call(hcl2, tmp_path),
                 call(hcl, tmp_path)]  # type: ignore
            )
        else:
            mock_load_terraform_module.assert_called_once_with(hcl2, tmp_path)
예제 #18
0
    def test_install_already_installed(self, mocker: MockerFixture,
                                       tmp_path: Path) -> None:
        """Test install with version already installed."""
        mock_available_versions = mocker.patch(
            f"{MODULE}.get_available_tf_versions", return_value=["0.12.0"])
        mock_download = mocker.patch(f"{MODULE}.download_tf_release")
        mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
        tfenv = TFEnvManager(tmp_path)
        (tfenv.versions_dir / "0.12.0").mkdir()

        assert tfenv.install("0.12.0")
        mock_available_versions.assert_not_called()
        mock_download.assert_not_called()
        assert tfenv.current_version == "0.12.0"

        assert tfenv.install(r"0\.12\..*")  # regex does not match dir
예제 #19
0
    def test_get_version_from_file(self, tmp_path):
        """Test get_version_from_file."""
        tfenv = TFEnvManager(tmp_path)

        # no version file or path
        assert not tfenv.get_version_from_file()
        del tfenv.version_file

        # path provided
        version_file = tmp_path / ".version"
        version_file.write_text(six.u("0.11.5"))
        assert tfenv.get_version_from_file(version_file) == "0.11.5"

        # path not provided; use version file
        version_file = tmp_path / TF_VERSION_FILENAME
        version_file.write_text(six.u("0.12.0"))
        assert tfenv.get_version_from_file(version_file) == "0.12.0"
예제 #20
0
    def test_install_min_required(self, mocker: MockerFixture,
                                  tmp_path: Path) -> None:
        """Test install min_required."""
        mock_available_versions = mocker.patch(
            f"{MODULE}.get_available_tf_versions", return_value=["0.12.0"])
        mock_download = mocker.patch(f"{MODULE}.download_tf_release")
        mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
        mocker.patch.object(TFEnvManager, "get_min_required",
                            MagicMock(return_value="0.12.0"))
        tfenv = TFEnvManager(tmp_path)

        assert tfenv.install("min-required")
        mock_available_versions.assert_called_once_with(True)
        mock_download.assert_called_once_with("0.12.0", tfenv.versions_dir,
                                              tfenv.command_suffix)
        assert tfenv.current_version == "0.12.0"
        tfenv.get_min_required.assert_called_once_with()  # pylint: disable=no-member
예제 #21
0
 def test_version(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test version."""
     version = VersionTuple(0, 15, 5)
     mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
     mock_get_available_tf_versions = mocker.patch(
         f"{MODULE}.get_available_tf_versions", return_value=[]
     )
     mock_get_version_from_file = mocker.patch.object(
         TFEnvManager, "get_version_from_file", return_value=None
     )
     tfenv = TFEnvManager(tmp_path)
     (tfenv.versions_dir / str(version)).mkdir()
     tfenv.current_version = str(version)
     assert tfenv.version == version
     assert tfenv.current_version == str(version)
     mock_get_version_from_file.assert_not_called()
     mock_get_available_tf_versions.assert_not_called()
예제 #22
0
    def test_get_min_required(self, monkeypatch, tmp_path):
        """Test get_min_required."""
        monkeypatch.setattr(TFEnvManager, "terraform_block", {})
        tfenv = TFEnvManager(tmp_path)

        with pytest.raises(SystemExit) as excinfo:
            assert tfenv.get_min_required()
        assert excinfo.value.code

        monkeypatch.setattr(tfenv, "terraform_block",
                            {"required_version": "!=0.12.0"})
        with pytest.raises(SystemExit) as excinfo:
            assert tfenv.get_min_required()
        assert excinfo.value.code

        monkeypatch.setattr(tfenv, "terraform_block",
                            {"required_version": "~>0.12.0"})
        assert tfenv.get_min_required() == "0.12.0"
예제 #23
0
    def test_install_latest(self, mock_download, mock_available_versions,
                            monkeypatch, tmp_path):
        """Test install latest."""
        mock_available_versions.return_value = ["0.12.0", "0.11.5"]
        monkeypatch.setattr(TFEnvManager, "versions_dir", tmp_path)
        tfenv = TFEnvManager(tmp_path)

        assert tfenv.install("latest")
        mock_available_versions.assert_called_once_with(False)
        mock_download.assert_called_once_with("0.12.0", tfenv.versions_dir,
                                              tfenv.command_suffix)
        assert tfenv.current_version == "0.12.0"

        assert tfenv.install("latest:0.11.5")
        mock_available_versions.assert_called_with(False)
        mock_download.assert_called_with("0.11.5", tfenv.versions_dir,
                                         tfenv.command_suffix)
        assert tfenv.current_version == "0.11.5"
예제 #24
0
 def test_version_undefined(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test version not specified."""
     mock_get_version_from_file = mocker.patch.object(
         TFEnvManager, "get_version_from_file", return_value=None
     )
     tfenv = TFEnvManager(tmp_path)
     assert tfenv.version is None
     assert tfenv.current_version is None
     mock_get_version_from_file.assert_called_once_with()
예제 #25
0
    def test_install(self, mock_download, mock_available_versions, monkeypatch,
                     tmp_path):
        """Test install."""
        mock_available_versions.return_value = ["0.12.0", "0.11.5"]
        monkeypatch.setattr(TFEnvManager, "versions_dir", tmp_path)
        monkeypatch.setattr(TFEnvManager, "get_version_from_file",
                            MagicMock(return_value="0.11.5"))
        tfenv = TFEnvManager(tmp_path)

        assert tfenv.install("0.12.0")
        mock_available_versions.assert_called_once_with(True)
        mock_download.assert_called_once_with("0.12.0", tfenv.versions_dir,
                                              tfenv.command_suffix)
        assert tfenv.current_version == "0.12.0"

        assert tfenv.install()
        mock_download.assert_called_with("0.11.5", tfenv.versions_dir,
                                         tfenv.command_suffix)
        assert tfenv.current_version == "0.11.5"
예제 #26
0
 def test_backend(
     self,
     mocker: MockerFixture,
     response: Dict[str, Any],
     expected: Dict[str, Any],
     tmp_path: Path,
 ) -> None:
     """Test backend."""
     mocker.patch(f"{MODULE}.load_terraform_module", return_value=response)
     tfenv = TFEnvManager(tmp_path)
     assert tfenv.backend == expected
예제 #27
0
    def test_install_latest(self, mocker: MockerFixture,
                            tmp_path: Path) -> None:
        """Test install latest."""
        mock_available_versions = mocker.patch(
            f"{MODULE}.get_available_tf_versions",
            return_value=["0.12.0", "0.11.5"])
        mock_download = mocker.patch(f"{MODULE}.download_tf_release")
        mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
        tfenv = TFEnvManager(tmp_path)

        assert tfenv.install("latest")
        mock_available_versions.assert_called_once_with(False)
        mock_download.assert_called_once_with("0.12.0", tfenv.versions_dir,
                                              tfenv.command_suffix)
        assert tfenv.current_version == "0.12.0"

        assert tfenv.install("latest:0.11.5")
        mock_available_versions.assert_called_with(False)
        mock_download.assert_called_with("0.11.5", tfenv.versions_dir,
                                         tfenv.command_suffix)
        assert tfenv.current_version == "0.11.5"
예제 #28
0
 def test_get_version_from_executable(
     self,
     expected: Optional[VersionTuple],
     fake_process: FakeProcess,
     output: str,
 ) -> None:
     """Test get_version_from_executable."""
     fake_process.register_subprocess(
         ["usr/tfenv/terraform", "-version"], stdout=output
     )
     assert (
         TFEnvManager.get_version_from_executable("usr/tfenv/terraform") == expected
     )
예제 #29
0
 def test_version_latest(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test version latest."""
     version = VersionTuple(0, 15, 5)
     mocker.patch.object(TFEnvManager, "versions_dir", tmp_path)
     mock_get_available_tf_versions = mocker.patch(
         f"{MODULE}.get_available_tf_versions", return_value=["0.15.5", "0.15.4"]
     )
     mock_get_version_from_file = mocker.patch.object(
         TFEnvManager, "get_version_from_file", return_value="latest"
     )
     tfenv = TFEnvManager(tmp_path)
     assert tfenv.version == version
     assert tfenv.current_version == str(version)
     mock_get_version_from_file.assert_called_once_with()
     mock_get_available_tf_versions.assert_called_once_with(False)
예제 #30
0
    def test_terraform_block(self, mock_load_terrafrom_module, response,
                             expected, caplog, tmp_path):
        """Test terraform_block."""
        caplog.set_level(LogLevels.VERBOSE, logger=MODULE)
        mock_load_terrafrom_module.side_effect = response
        tfenv = TFEnvManager(tmp_path)

        assert tfenv.terraform_block == expected

        if not isinstance(response[0], dict):
            assert "failed to parse as HCL2; trying HCL" in "\n".join(
                caplog.messages)
            mock_load_terrafrom_module.assert_has_calls(
                [call(hcl2, tmp_path),
                 call(hcl, tmp_path)])
        else:
            mock_load_terrafrom_module.assert_called_once_with(hcl2, tmp_path)