From df9615bac55ac6f1c3f516b66279ac0007175030 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 19 Mar 2020 15:00:14 +0100 Subject: Adding upstream version 0.13.1. Signed-off-by: Daniel Baumann --- gitlint/tests/test_hooks.py | 136 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 gitlint/tests/test_hooks.py (limited to 'gitlint/tests/test_hooks.py') diff --git a/gitlint/tests/test_hooks.py b/gitlint/tests/test_hooks.py new file mode 100644 index 0000000..08bd730 --- /dev/null +++ b/gitlint/tests/test_hooks.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- + +import os + +try: + # python 2.x + from mock import patch, ANY, mock_open +except ImportError: + # python 3.x + from unittest.mock import patch, ANY, mock_open # pylint: disable=no-name-in-module, import-error + +from gitlint.tests.base import BaseTestCase +from gitlint.config import LintConfig +from gitlint.hooks import GitHookInstaller, GitHookInstallerError, COMMIT_MSG_HOOK_SRC_PATH, COMMIT_MSG_HOOK_DST_PATH, \ + GITLINT_HOOK_IDENTIFIER + + +class HookTests(BaseTestCase): + + @patch('gitlint.hooks.git_hooks_dir') + def test_commit_msg_hook_path(self, git_hooks_dir): + git_hooks_dir.return_value = os.path.join(u"/föo", u"bar") + lint_config = LintConfig() + lint_config.target = self.SAMPLES_DIR + expected_path = os.path.join(git_hooks_dir.return_value, COMMIT_MSG_HOOK_DST_PATH) + path = GitHookInstaller.commit_msg_hook_path(lint_config) + + git_hooks_dir.assert_called_once_with(self.SAMPLES_DIR) + self.assertEqual(path, expected_path) + + @staticmethod + @patch('os.chmod') + @patch('os.stat') + @patch('gitlint.hooks.shutil.copy') + @patch('os.path.exists', return_value=False) + @patch('os.path.isdir', return_value=True) + @patch('gitlint.hooks.git_hooks_dir') + def test_install_commit_msg_hook(git_hooks_dir, isdir, path_exists, copy, stat, chmod): + lint_config = LintConfig() + lint_config.target = os.path.join(u"/hür", u"dur") + git_hooks_dir.return_value = os.path.join(u"/föo", u"bar", ".git", "hooks") + expected_dst = os.path.join(git_hooks_dir.return_value, COMMIT_MSG_HOOK_DST_PATH) + GitHookInstaller.install_commit_msg_hook(lint_config) + isdir.assert_called_with(git_hooks_dir.return_value) + path_exists.assert_called_once_with(expected_dst) + copy.assert_called_once_with(COMMIT_MSG_HOOK_SRC_PATH, expected_dst) + stat.assert_called_once_with(expected_dst) + chmod.assert_called_once_with(expected_dst, ANY) + git_hooks_dir.assert_called_with(lint_config.target) + + @patch('gitlint.hooks.shutil.copy') + @patch('os.path.exists', return_value=False) + @patch('os.path.isdir', return_value=True) + @patch('gitlint.hooks.git_hooks_dir') + def test_install_commit_msg_hook_negative(self, git_hooks_dir, isdir, path_exists, copy): + lint_config = LintConfig() + lint_config.target = os.path.join(u"/hür", u"dur") + git_hooks_dir.return_value = os.path.join(u"/föo", u"bar", ".git", "hooks") + # mock that current dir is not a git repo + isdir.return_value = False + expected_msg = u"{0} is not a git repository".format(lint_config.target) + with self.assertRaisesRegex(GitHookInstallerError, expected_msg): + GitHookInstaller.install_commit_msg_hook(lint_config) + isdir.assert_called_with(git_hooks_dir.return_value) + path_exists.assert_not_called() + copy.assert_not_called() + + # mock that there is already a commit hook present + isdir.return_value = True + path_exists.return_value = True + expected_dst = os.path.join(git_hooks_dir.return_value, COMMIT_MSG_HOOK_DST_PATH) + expected_msg = u"There is already a commit-msg hook file present in {0}.\n".format(expected_dst) + \ + "gitlint currently does not support appending to an existing commit-msg file." + with self.assertRaisesRegex(GitHookInstallerError, expected_msg): + GitHookInstaller.install_commit_msg_hook(lint_config) + + @staticmethod + @patch('os.remove') + @patch('os.path.exists', return_value=True) + @patch('os.path.isdir', return_value=True) + @patch('gitlint.hooks.git_hooks_dir') + def test_uninstall_commit_msg_hook(git_hooks_dir, isdir, path_exists, remove): + lint_config = LintConfig() + git_hooks_dir.return_value = os.path.join(u"/föo", u"bar", ".git", "hooks") + lint_config.target = os.path.join(u"/hür", u"dur") + read_data = "#!/bin/sh\n" + GITLINT_HOOK_IDENTIFIER + with patch('gitlint.hooks.io.open', mock_open(read_data=read_data), create=True): + GitHookInstaller.uninstall_commit_msg_hook(lint_config) + + expected_dst = os.path.join(git_hooks_dir.return_value, COMMIT_MSG_HOOK_DST_PATH) + isdir.assert_called_with(git_hooks_dir.return_value) + path_exists.assert_called_once_with(expected_dst) + remove.assert_called_with(expected_dst) + git_hooks_dir.assert_called_with(lint_config.target) + + @patch('os.remove') + @patch('os.path.exists', return_value=True) + @patch('os.path.isdir', return_value=True) + @patch('gitlint.hooks.git_hooks_dir') + def test_uninstall_commit_msg_hook_negative(self, git_hooks_dir, isdir, path_exists, remove): + lint_config = LintConfig() + lint_config.target = os.path.join(u"/hür", u"dur") + git_hooks_dir.return_value = os.path.join(u"/föo", u"bar", ".git", "hooks") + + # mock that the current directory is not a git repo + isdir.return_value = False + expected_msg = u"{0} is not a git repository".format(lint_config.target) + with self.assertRaisesRegex(GitHookInstallerError, expected_msg): + GitHookInstaller.uninstall_commit_msg_hook(lint_config) + isdir.assert_called_with(git_hooks_dir.return_value) + path_exists.assert_not_called() + remove.assert_not_called() + + # mock that there is no commit hook present + isdir.return_value = True + path_exists.return_value = False + expected_dst = os.path.join(git_hooks_dir.return_value, COMMIT_MSG_HOOK_DST_PATH) + expected_msg = u"There is no commit-msg hook present in {0}.".format(expected_dst) + with self.assertRaisesRegex(GitHookInstallerError, expected_msg): + GitHookInstaller.uninstall_commit_msg_hook(lint_config) + isdir.assert_called_with(git_hooks_dir.return_value) + path_exists.assert_called_once_with(expected_dst) + remove.assert_not_called() + + # mock that there is a different (=not gitlint) commit hook + isdir.return_value = True + path_exists.return_value = True + read_data = "#!/bin/sh\nfoo" + expected_dst = os.path.join(git_hooks_dir.return_value, COMMIT_MSG_HOOK_DST_PATH) + expected_msg = u"The commit-msg hook in {0} was not installed by gitlint ".format(expected_dst) + \ + "(or it was modified).\nUninstallation of 3th party or modified gitlint hooks " + \ + "is not supported." + with patch('gitlint.hooks.io.open', mock_open(read_data=read_data), create=True): + with self.assertRaisesRegex(GitHookInstallerError, expected_msg): + GitHookInstaller.uninstall_commit_msg_hook(lint_config) + remove.assert_not_called() -- cgit v1.2.3