1# encoding: utf-8 2 3from __future__ import absolute_import, division, print_function, unicode_literals 4 5from django.conf import settings 6from django.core.management import call_command 7from django.test import TestCase 8from mock import call, patch 9 10__all__ = ['CoreManagementCommandsTestCase'] 11 12 13class CoreManagementCommandsTestCase(TestCase): 14 @patch("haystack.management.commands.update_index.Command.update_backend") 15 def test_update_index_default_using(self, m): 16 """update_index uses default index when --using is not present""" 17 call_command('update_index') 18 for k in settings.HAYSTACK_CONNECTIONS: 19 self.assertTrue(call('core', k) in m.call_args_list) 20 21 @patch("haystack.management.commands.update_index.Command.update_backend") 22 def test_update_index_using(self, m): 23 """update_index only applies to indexes specified with --using""" 24 call_command('update_index', verbosity=0, using=["eng", "fra"]) 25 m.assert_any_call("core", "eng") 26 m.assert_any_call("core", "fra") 27 self.assertTrue(call("core", "default") not in m.call_args_list, 28 "update_index should have been restricted to the index specified with --using") 29 30 @patch("haystack.loading.ConnectionHandler.__getitem__") 31 def test_clear_index_default_using(self, m): 32 """clear_index uses all keys when --using is not present""" 33 call_command('clear_index', verbosity=0, interactive=False) 34 self.assertEqual(len(settings.HAYSTACK_CONNECTIONS), m.call_count) 35 for k in settings.HAYSTACK_CONNECTIONS: 36 self.assertTrue(call(k) in m.call_args_list) 37 38 @patch("haystack.loading.ConnectionHandler.__getitem__") 39 def test_clear_index_using(self, m): 40 """clear_index only applies to indexes specified with --using""" 41 42 call_command('clear_index', verbosity=0, interactive=False, using=["eng"]) 43 m.assert_called_with("eng") 44 self.assertTrue(m.return_value.get_backend.called, "backend.clear() should be called") 45 self.assertTrue(call("default") not in m.call_args_list, 46 "clear_index should have been restricted to the index specified with --using") 47 48 @patch("haystack.loading.ConnectionHandler.__getitem__") 49 @patch("haystack.management.commands.update_index.Command.update_backend") 50 def test_rebuild_index_default_using(self, m1, m2): 51 """rebuild_index uses default index when --using is not present""" 52 53 call_command('rebuild_index', verbosity=0, interactive=False) 54 self.assertEqual(len(settings.HAYSTACK_CONNECTIONS), m2.call_count) 55 for k in settings.HAYSTACK_CONNECTIONS: 56 self.assertTrue(call(k) in m2.call_args_list) 57 m1.assert_any_call("core", "default") 58 m1.assert_any_call("core", "whoosh") 59 60 @patch("haystack.loading.ConnectionHandler.__getitem__") 61 @patch("haystack.management.commands.update_index.Command.update_backend") 62 def test_rebuild_index_using(self, m1, m2): 63 """rebuild_index passes --using to clear_index and update_index""" 64 65 call_command('rebuild_index', verbosity=0, interactive=False, using=["eng"]) 66 m2.assert_called_with("eng") 67 m1.assert_any_call("core", "eng") 68 69 @patch('haystack.management.commands.update_index.Command.handle', return_value='') 70 @patch('haystack.management.commands.clear_index.Command.handle', return_value='') 71 def test_rebuild_index(self, mock_handle_clear, mock_handle_update): 72 call_command('rebuild_index', interactive=False) 73 74 self.assertTrue(mock_handle_clear.called) 75 self.assertTrue(mock_handle_update.called) 76 77 @patch('haystack.management.commands.update_index.Command.handle') 78 @patch('haystack.management.commands.clear_index.Command.handle') 79 def test_rebuild_index_nocommit(self, *mocks): 80 call_command('rebuild_index', interactive=False, commit=False) 81 82 for m in mocks: 83 self.assertEqual(m.call_count, 1) 84 85 args, kwargs = m.call_args 86 87 self.assertIn('commit', kwargs) 88 self.assertEqual(False, kwargs['commit']) 89 90 @patch('haystack.management.commands.clear_index.Command.handle', return_value='') 91 @patch('haystack.management.commands.update_index.Command.handle', return_value='') 92 def test_rebuild_index_nocommit(self, update_mock, clear_mock): 93 """ 94 Confirm that command-line option parsing produces the same results as using call_command() directly, 95 mostly as a sanity check for the logic in rebuild_index which combines the option_lists for its 96 component commands. 97 """ 98 from haystack.management.commands.rebuild_index import Command 99 100 Command().run_from_argv(['django-admin.py', 'rebuild_index', '--noinput', '--nocommit']) 101 102 for m in (clear_mock, update_mock): 103 self.assertEqual(m.call_count, 1) 104 105 args, kwargs = m.call_args 106 107 self.assertIn('commit', kwargs) 108 self.assertEqual(False, kwargs['commit']) 109 110 args, kwargs = clear_mock.call_args 111 112 self.assertIn('interactive', kwargs) 113 self.assertIs(kwargs['interactive'], False) 114