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