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))
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, ), } )
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(), } )
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(), } )
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(), } )
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])
def setUp(self): self.hook_names = utils.get_hook_names()
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'])))
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()