Пример #1
0
class CmdRemove(TestCase):
    @given(text(min_size=1, max_size=10, alphabet=string.ascii_letters),
           sampled_from(utils.get_hook_names()))
    def test_hook_exists_in___hook_is_deleted(self, name, hook_type):
        with FakeRepoDir():
            hook_path = os.path.join(repo.hook_type_directory(hook_type), name)

            with open(hook_path, 'w') as f:
                f.write('content')

            sys.argv = ['foo', 'uninstall', hook_type, name]
            cmd.Hooks().run()

            self.assertFalse(os.path.exists(hook_path))

    @given(text(min_size=1, max_size=10, alphabet=string.ascii_letters),
           sampled_from(utils.get_hook_names()))
    def test_hook_does_not_exist___logger_is_written_to(self, name, hook_type):
        with FakeRepoDir():
            with patch('githooks.cmd.logger.info') as mock_logger:
                sys.argv = ['foo', 'uninstall', hook_type, name]
                cmd.Hooks().run()

                mock_logger.assert_called_with(
                    '{} hook called "{}" could not be found. SKIPPING.'.format(
                        hook_type, name))
Пример #2
0
def api_results(min_size=0, max_size=20, hook_types=None):
    count = integers(min_value=min_size, max_value=max_size).example()
    hook_types = hook_types or get_hook_names()

    return fixed_dictionaries(
        {
            "count": just(count),
            "next": none(),
            "prev": none(),
            "results": lists(
                fixed_dictionaries(
                    {
                        "name": text(min_size=1),
                        "latest_version": integers(min_value=0),
                        "content": fixed_dictionaries(
                            {
                                "hook_type": sampled_from(hook_types),
                                "version": integers(min_value=0),
                                "description": text(min_size=1),
                                "download_url": text(min_size=1),
                                "checksum": text(min_size=1),
                            }
                        ),
                    }
                ),
                min_size=count,
                max_size=count,
            ),
        }
    )
Пример #3
0
    def test_num_results_are_supplied___api_is_called_with_correct_page_size(self, query, option, num):
        with patch('githooks.cmd.requests.get') as mock_get:
            sys.argv = ['foo', 'search', query, option, str(num)]
            cmd.Hooks().run()

            mock_get.assert_called_with(
                'http://www.git-hooks.com/api/v1/hooks/',
                params={
                    'q': query,
                    'page_size': num,
                    'hook_type__in': utils.get_hook_names(),
                }
            )
Пример #4
0
    def test_only_query_is_supplied___api_is_called_with_default_filters(self, query):
        with patch('githooks.cmd.requests.get') as mock_get:
            sys.argv = ['foo', 'search', query]
            cmd.Hooks().run()

            mock_get.assert_called_with(
                'http://www.git-hooks.com/api/v1/hooks/',
                params={
                    'q': query,
                    'page_size': 20,
                    'hook_type__in': utils.get_hook_names(),
                }
            )
Пример #5
0
    def test_api_root_is_supplied___api_is_called_with_default_filters_and_correct_root(self, query, option, api_root):
        with patch('githooks.cmd.requests.get') as mock_get:
            api_root = 'http://www.{}.com'.format(api_root)
            sys.argv = ['foo', 'search', query, option, api_root]
            cmd.Hooks().run()

            mock_get.assert_called_with(
                '{}/hooks/'.format(api_root),
                params={
                    'q': query,
                    'page_size': 20,
                    'hook_type__in': utils.get_hook_names(),
                }
            )
Пример #6
0
    def test_request_is_successful___results_are_printed(self, res):
        with patch('githooks.cmd.requests.get') as mock_get:
            with patch('githooks.cmd.logger.info') as mock_logger:
                mock_response = Mock()
                mock_response.json = Mock(return_value=res)

                mock_get.return_value = mock_response

                sys.argv = ['foo', 'search', 'query']
                cmd.Hooks().run()

                call_iter = iter(mock_logger.call_args_list)
                for t in utils.get_hook_names():
                    self.assertEqual('', next(call_iter)[0][0])
                    self.assertEqual(t, next(call_iter)[0][0])
                    self.assertEqual('=' * len(t), next(call_iter)[0][0])
                    self.assertEqual('', next(call_iter)[0][0])

                    for h in (_h for _h in res['results'] if _h['content']['hook_type'] == t):
                        self.assertEqual(h['name'], next(call_iter)[0][0])
                        self.assertEqual('  ' + h['content']['description'], next(call_iter)[0][0])
Пример #7
0
 def setUp(self):
     self.hook_names = utils.get_hook_names()
Пример #8
0
class CmdInstall(TestCase):
    def setUp(self):
        self.hook_names = utils.get_hook_names()

    @given(text(min_size=1, alphabet=string.ascii_letters),
           text(min_size=1, max_size=10, alphabet=string.ascii_letters),
           text(min_size=1, max_size=10, alphabet=string.ascii_letters),
           sampled_from(utils.get_hook_names()))
    @responses.activate
    def test_hook_is_not_yet_installed___hook_is_installed(
            self, content, url_front, file_name, hook_name):

        url = 'http://' + url_front + '/' + file_name

        with FakeRepoDir():
            responses.add(
                responses.GET,
                url,
                body=content,
                status=200,
            )

            sys.argv = ['foo', 'install', hook_name, url, '-y']

            cmd.Hooks().run()

            with open(
                    os.path.join(repo.hook_type_directory(hook_name),
                                 file_name)) as f:
                self.assertEqual(content, f.read())

    @given(text(min_size=1, alphabet=string.ascii_letters),
           text(min_size=1, alphabet=string.ascii_letters),
           text(min_size=1, max_size=10, alphabet=string.ascii_letters),
           text(min_size=1, max_size=10, alphabet=string.ascii_letters),
           sampled_from(utils.get_hook_names()))
    @responses.activate
    def test_hook_is_yet_installed_upgrade_is_not_set___hook_is_not_installed(
            self, orig_content, new_content, url_front, file_name, hook_name):
        assume(new_content != orig_content)

        url = 'http://' + url_front + '/' + file_name

        with FakeRepoDir():
            with open(
                    os.path.join(repo.hook_type_directory(hook_name),
                                 file_name), 'w') as f:
                f.write(orig_content)

            responses.add(
                responses.GET,
                url,
                body=new_content,
                status=200,
            )

            sys.argv = ['foo', 'install', hook_name, url, '-y']

            cmd.Hooks().run()

            with open(
                    os.path.join(repo.hook_type_directory(hook_name),
                                 file_name)) as f:
                self.assertEqual(orig_content, f.read())

    @given(text(min_size=1, alphabet=string.ascii_letters),
           text(min_size=1, alphabet=string.ascii_letters),
           text(min_size=1, max_size=10, alphabet=string.ascii_letters),
           text(min_size=1, max_size=10, alphabet=string.ascii_letters),
           sampled_from(utils.get_hook_names()))
    @responses.activate
    def test_hook_is_yet_installed_upgrade_is_set___hook_is_installed(
            self, orig_content, new_content, url_front, file_name, hook_name):
        assume(new_content != orig_content)

        url = 'http://' + url_front + '/' + file_name

        with FakeRepoDir():
            with open(
                    os.path.join(repo.hook_type_directory(hook_name),
                                 file_name), 'w') as f:
                f.write(orig_content)

            responses.add(
                responses.GET,
                url,
                body=new_content,
                status=200,
            )

            sys.argv = ['foo', 'install', hook_name, url, '--upgrade', '-y']

            cmd.Hooks().run()

            with open(
                    os.path.join(repo.hook_type_directory(hook_name),
                                 file_name)) as f:
                self.assertEqual(new_content, f.read())

    @given(
        dictionaries(sampled_from(utils.get_hook_names()),
                     lists(fixed_dictionaries({
                         'content':
                         text(min_size=1, alphabet=string.ascii_letters),
                         'front':
                         text(min_size=1,
                              max_size=10,
                              alphabet=string.ascii_letters),
                         'filename':
                         text(min_size=1,
                              max_size=10,
                              alphabet=string.ascii_letters),
                     }),
                           min_size=1,
                           max_size=10,
                           unique_by=lambda x: x['filename']),
                     min_size=1,
                     max_size=len(utils.get_hook_names())),
        dictionaries(sampled_from(utils.get_hook_names()),
                     lists(fixed_dictionaries({
                         'content':
                         text(min_size=1, alphabet=string.ascii_letters),
                         'front':
                         text(min_size=1,
                              max_size=10,
                              alphabet=string.ascii_letters),
                         'filename':
                         text(min_size=1,
                              max_size=10,
                              alphabet=string.ascii_letters),
                     }),
                           min_size=1,
                           max_size=10,
                           unique_by=lambda x: x['filename']),
                     min_size=1,
                     max_size=len(utils.get_hook_names())),
    )
    @responses.activate
    def test_config_is_given___all_hooks_from_config_are_installed(
            self, hook_configs, setup_configs):
        with FakeRepoDir() as dir:
            config = ConfigParser()
            hook_type_setting = {}
            for hook_type, hooks in hook_configs.items():
                hook_type_setting.setdefault(hook_type, '')

                for hook in hooks:
                    url = 'http://' + hook['front'] + '/' + hook['filename']
                    hook_type_setting[hook_type] += url + '\n'

                    responses.add(
                        responses.GET,
                        url,
                        body=hook['content'],
                        status=200,
                    )

            config.add_section('install')
            for hook_type, value in hook_type_setting.items():
                config.set('install', hook_type, value)

            with open(os.path.join(str(dir), 'git-hooks.cfg'), 'w') as f:
                config.write(f)

            setup_config = ConfigParser()
            hook_type_setting = {}
            for hook_type, hooks in setup_configs.items():
                hook_type_setting.setdefault(hook_type, '')

                for hook in hooks:
                    url = 'http://' + hook['front'] + '/' + hook['filename']
                    hook_type_setting[hook_type] += url + '\n'

                    responses.add(
                        responses.GET,
                        url,
                        body=hook['content'],
                        status=200,
                    )

            setup_config.add_section('git-hooks.install')
            for hook_type, value in hook_type_setting.items():
                setup_config.set('git-hooks.install', hook_type, value)

            with open(os.path.join(str(dir), 'setup.cfg'), 'w') as f:
                setup_config.write(f)

            sys.argv = ['foo', 'install', '-y']

            cmd.Hooks().run()

            for hook_type, hooks in hook_configs.items():
                for hook in hooks:
                    self.assertTrue(
                        os.path.exists(
                            os.path.join(repo.hook_type_directory(hook_type),
                                         hook['filename'])))

    @given(
        dictionaries(sampled_from(utils.get_hook_names()),
                     lists(fixed_dictionaries({
                         'content':
                         text(min_size=1, alphabet=string.ascii_letters),
                         'front':
                         text(min_size=1,
                              max_size=10,
                              alphabet=string.ascii_letters),
                         'filename':
                         text(min_size=1,
                              max_size=10,
                              alphabet=string.ascii_letters),
                     }),
                           min_size=1,
                           max_size=10,
                           unique_by=lambda x: x['filename']),
                     min_size=1,
                     max_size=len(utils.get_hook_names())), )
    @responses.activate
    def test_setup_config_is_given___all_hooks_from_setup_config_are_installed(
            self, setup_configs):
        setup_config = ConfigParser()
        hook_type_setting = {}
        for hook_type, hooks in setup_configs.items():
            hook_type_setting.setdefault(hook_type, '')

            for hook in hooks:
                url = 'http://' + hook['front'] + '/' + hook['filename']
                hook_type_setting[hook_type] += url + '\n'

                responses.add(
                    responses.GET,
                    url,
                    body=hook['content'],
                    status=200,
                )

        setup_config.add_section('git-hooks.install')
        for hook_type, value in hook_type_setting.items():
            setup_config.set('git-hooks.install', hook_type, value)

        with FakeRepoDir() as dir:
            with open(os.path.join(str(dir), 'setup.cfg'), 'w') as f:
                setup_config.write(f)

            sys.argv = ['foo', 'install', '-y']

            cmd.Hooks().run()

            for hook_type, hooks in setup_configs.items():
                for hook in hooks:
                    self.assertTrue(
                        os.path.exists(
                            os.path.join(repo.hook_type_directory(hook_type),
                                         hook['filename'])))
Пример #9
0
    def setUp(self):
        self.repo_dir = tempfile.mkdtemp()
        self.hooks_dir = os.path.join(self.repo_dir, '.git', 'hooks')
        os.makedirs(self.hooks_dir)

        self.hook_names = utils.get_hook_names()
Пример #10
0
 def setUp(self):
     self.hook_names = utils.get_hook_names()
Пример #11
0
    def setUp(self):
        self.repo_dir = tempfile.mkdtemp()
        self.hooks_dir = os.path.join(self.repo_dir, '.git', 'hooks')
        os.makedirs(self.hooks_dir)

        self.hook_names = utils.get_hook_names()