예제 #1
0
class DocumentRegistryTestCase(TestCase):
    class ModelA():
        pass

    class ModelB():
        pass

    class ModelC():
        pass

    def setUp(self):
        self.registry = DocumentRegistry()
        self.index_1 = Mock()
        self.index_2 = Mock()

        self.doc_a1 = Mock()
        self.doc_a1._doc_type.model = self.ModelA
        self.doc_a1._doc_type.ignore_signals = False

        self.doc_a2 = Mock()
        self.doc_a2._doc_type.model = self.ModelA
        self.doc_a2._doc_type.ignore_signals = False

        self.doc_b1 = Mock()
        self.doc_b1._doc_type.model = self.ModelB
        self.doc_b1._doc_type.ignore_signals = False

        self.doc_c1 = Mock()
        self.doc_c1._doc_type.model = self.ModelC
        self.doc_c1._doc_type.ignore_signals = False

        self.registry.register(self.index_1, self.doc_a1)
        self.registry.register(self.index_1, self.doc_a2)
        self.registry.register(self.index_2, self.doc_b1)
        self.registry.register(self.index_1, self.doc_c1)

    def test_empty_registry(self):
        registry = DocumentRegistry()
        self.assertEqual(registry._indices, {})
        self.assertEqual(registry._models, {})

    def test_register(self):
        self.assertEqual(self.registry._models[self.ModelA],
                         set([self.doc_a1, self.doc_a2]))
        self.assertEqual(self.registry._models[self.ModelB],
                         set([self.doc_b1]))

        self.assertEqual(self.registry._indices[self.index_1],
                         set([self.doc_a1, self.doc_a2, self.doc_c1]))
        self.assertEqual(self.registry._indices[self.index_2],
                         set([self.doc_b1]))

    def test_get_models(self):
        self.assertEqual(self.registry.get_models(),
                         set([self.ModelA, self.ModelB, self.ModelC]))

    def test_get_documents(self):
        self.assertEqual(
            self.registry.get_documents(),
            set([self.doc_a1, self.doc_a2, self.doc_b1, self.doc_c1]))

    def test_get_documents_by_model(self):
        self.assertEqual(self.registry.get_documents([self.ModelA]),
                         set([self.doc_a1, self.doc_a2]))

    def test_get_documents_by_unregister_model(self):
        ModelC = Mock()
        self.assertFalse(self.registry.get_documents([ModelC]))

    def test_get_indices(self):
        self.assertEqual(self.registry.get_indices(),
                         set([self.index_1, self.index_2]))

    def test_get_indices_by_model(self):
        self.assertEqual(self.registry.get_indices([self.ModelA]),
                         set([self.index_1]))

    def test_get_indices_by_unregister_model(self):
        ModelC = Mock()
        self.assertFalse(self.registry.get_indices([ModelC]))

    def test_update_instance(self):
        doc_a3 = Mock()
        doc_a3._doc_type.model = self.ModelA
        doc_a3._doc_type.ignore_signals = True

        self.registry.register(self.index_1, doc_a3)

        instance = self.ModelA()
        self.registry.update(instance)

        self.assertFalse(doc_a3.update.called)
        self.assertFalse(self.doc_b1.update.called)
        self.doc_a1.update.assert_called_once_with(instance)
        self.doc_a2.update.assert_called_once_with(instance)

    def test_delete_instance(self):
        doc_a3 = Mock()
        doc_a3._doc_type.model = self.ModelA
        doc_a3._doc_type.ignore_signals = True

        self.registry.register(self.index_1, doc_a3)

        instance = self.ModelA()
        self.registry.delete(instance)

        self.assertFalse(doc_a3.update.called)
        self.assertFalse(self.doc_b1.update.called)
        self.doc_a1.update.assert_called_once_with(instance, action='delete')
        self.doc_a2.update.assert_called_once_with(instance, action='delete')

    def test_autosync(self):
        settings.ELASTICSEARCH_DSL_AUTOSYNC = False

        instance = self.ModelA()
        self.registry.update(instance)
        self.assertFalse(self.doc_a1.update.called)

        settings.ELASTICSEARCH_DSL_AUTOSYNC = True
예제 #2
0
class SearchIndexTestCase(TestCase):
    class ModelA(models.Model):
        class Meta:
            app_label = 'foo'

    class ModelB(models.Model):
        class Meta:
            app_label = 'foo'

    class ModelC(models.Model):
        class Meta:
            app_label = 'bar'

    def setUp(self):
        self.out = StringIO()
        self.registry = DocumentRegistry()
        self.index_a = Mock()
        self.index_b = Mock()

        self.doc_a1 = Mock()
        self.doc_a1._doc_type.model = self.ModelA
        self.doc_a1_qs = Mock()
        self.doc_a1.get_queryset = Mock(return_value=self.doc_a1_qs)

        self.doc_a2 = Mock()
        self.doc_a2._doc_type.model = self.ModelA
        self.doc_a2_qs = Mock()
        self.doc_a2.get_queryset = Mock(return_value=self.doc_a2_qs)

        self.doc_b1 = Mock()
        self.doc_b1._doc_type.model = self.ModelB
        self.doc_b1_qs = Mock()
        self.doc_b1.get_queryset = Mock(return_value=self.doc_b1_qs)

        self.doc_c1 = Mock()
        self.doc_c1._doc_type.model = self.ModelC
        self.doc_c1_qs = Mock()
        self.doc_c1.get_queryset = Mock(return_value=self.doc_c1_qs)

        self.registry.register(self.index_a, self.doc_a1)
        self.registry.register(self.index_a, self.doc_a2)
        self.registry.register(self.index_a, self.doc_b1)
        self.registry.register(self.index_b, self.doc_c1)

    def test_get_models(self):
        cmd = Command()
        with patch(
                'django_elasticsearch_dsl.management.commands.'
                'search_index.registry', self.registry):
            self.assertEqual(cmd._get_models(['foo']),
                             set([self.ModelA, self.ModelB]))

            self.assertEqual(cmd._get_models(['foo', 'bar.ModelC']),
                             set([self.ModelA, self.ModelB, self.ModelC]))

            self.assertEqual(cmd._get_models([]),
                             set([self.ModelA, self.ModelB, self.ModelC]))
            with self.assertRaises(CommandError):
                cmd._get_models(['unknown'])

    def test_no_action_error(self):
        cmd = Command()
        with self.assertRaises(CommandError):
            cmd.handle(action="")

    def test_delete_foo_index(self):

        with patch(
                'django_elasticsearch_dsl.management.commands.'
                'search_index.registry', self.registry):
            with patch(
                    'django_elasticsearch_dsl.management.commands.'
                    'search_index.input', Mock(return_value="y")):
                call_command('search_index',
                             stdout=self.out,
                             action='delete',
                             models=['foo'])
                self.index_a.delete.assert_called_once()
                self.assertFalse(self.index_b.delete.called)

    def test_force_delete_all_indices(self):

        with patch(
                'django_elasticsearch_dsl.management.commands.'
                'search_index.registry', self.registry):
            call_command('search_index',
                         stdout=self.out,
                         action='delete',
                         force=True)
            self.index_a.delete.assert_called_once()
            self.index_b.delete.assert_called_once()

    def test_force_delete_bar_model_c_index(self):

        with patch(
                'django_elasticsearch_dsl.management.commands.'
                'search_index.registry', self.registry):
            call_command('search_index',
                         stdout=self.out,
                         models=['bar.ModelC'],
                         action='delete',
                         force=True)
            self.index_b.delete.assert_called_once()
            self.assertFalse(self.index_a.delete.called)

    def test_create_all_indices(self):

        with patch(
                'django_elasticsearch_dsl.management.commands.'
                'search_index.registry', self.registry):
            call_command('search_index', stdout=self.out, action='create')
            self.index_a.create.assert_called_once()
            self.index_b.create.assert_called_once()

    def test_populate_all_doc_type(self):

        with patch(
                'django_elasticsearch_dsl.management.commands.'
                'search_index.registry', self.registry):
            call_command('search_index', stdout=self.out, action='populate')
            self.doc_a1.get_queryset.assert_called_once()
            self.doc_a1.update.assert_called_once_with(
                self.doc_a1_qs.iterator())
            self.doc_a2.get_queryset.assert_called_once()
            self.doc_a2.update.assert_called_once_with(
                self.doc_a2_qs.iterator())
            self.doc_b1.get_queryset.assert_called_once()
            self.doc_b1.update.assert_called_once_with(
                self.doc_b1_qs.iterator())
            self.doc_c1.get_queryset.assert_called_once()
            self.doc_c1.update.assert_called_once_with(
                self.doc_c1_qs.iterator())

    def test_rebuild_indices(self):
        Command.old_handle = Command.handle
        with patch.object(Command, 'handle', Mock()) as handle:
            cmd = Command()
            cmd.old_handle(stdout=self.out,
                           action='rebuild',
                           models=['foo'],
                           force=True)
            handle.assert_any_call(stdout=self.out,
                                   action='delete',
                                   models=['foo'],
                                   force=True)
            handle.assert_any_call(stdout=self.out,
                                   action='create',
                                   models=['foo'],
                                   force=True)
            handle.assert_any_call(stdout=self.out,
                                   action='populate',
                                   models=['foo'],
                                   force=True)